关于git你需要知道的事

作者: 余歌_非鱼 | 来源:发表于2014-07-08 21:18 被阅读408次

    *原文已同步到前端派 *


    gutv.png

    版本控制相信大家都不陌生,从CVS,到SVN,再到现在越来越受到重视的git。关于它们三者特别是后两者的对比,我觉得有必要说一下。

    现在很多人,很多项目从svn转到了git,相信还是有一部分人是被动转到git的,比如说项目的改变,其中又有一部分人可能对git的好处并不是十分了解,以及git也不太了解。我们在使用一个东西的时候,常常会进入到我会用就行了,当我会用了,我就很容易就懂,但是实际情况并非如此。我们要会用,也应该知道究竟为什么我们要这么用。比如说学车的时候,我们虽然没必要知道汽车内部的构造,但是如果能明白为什么换挡的时候要踩离合的时候,对你学车觉得是很有用的。

    • GIT是分布式存储的,而SVN是集中式存储。

      什么意思呢?相信大家都用过SVN,它的工作流程就是:checkout 远端分支到本地 -> 本地修改 -> commit (这一步自动将代码push到远端的代码仓库) -> 加入版本控制这就要求,你必须得有网络,保证本地能够顺利的push代码改动到远端,否则就没法加入版本控制。
      而GIT的工作流程就不同了:ckeckout远端仓库到本地 -> 本地建立分支 -> 在分支上做些修改 -> add 并 commit -> 加入版本控制 -> push本地缓存的commit到远端

      所以最大的区别就是,使用git你完全不需要网络就可以进行版本控制,在本地修改,并提交到本地,并在合适的时候再push到远端。而svn要想加入版本控制就必须保证网络通常。

    • GIT把内容按元数据方式存储,而SVN是按文件
      意思就是GIT会在本地存储项目下的所有文件,因为本地存储的是一个远端的克隆版本,而svn则只需要checkout你需要的那部分代码文件到本地即可。所以通常本地的git目录的大小要远远大于svn的目录。

    • 另外一些特性包括GIT的操作速度要远远快于svn,这对发布来说速度提升明显。

    参考:版本控制系统对比:Git与Subversion


    下面说正事,说这么多其实最重要的还是得学会使用,毕竟工具的目的就是让我们的工作更加方便有效率。

    拿github的工作方式举例吧:

    • 1.在github上新建一个项目
    • 2.checkout 到本地
        git clone git@github.com:HoTT/book.git -o o
        // -o可以指定oringin的alias。而oringin是远端仓库地址的alias
        //如果需要指定本地文件夹
        git clone git@github.com:HoTT/book.git gitbook -o o
        //如果想查看所有分支
        git branch -a
    
    • 3.建立分支

    建立一个新的分支:

        git branch example //新建example分支
        git checkout example //跳到example分支
        OR:
        git checkout -b example //新建并跳到新分支
        
        //如果新建了分支之后,想把它的远端设置为init的话应该怎么做?
        git branch -u upstream/init //upstream是远端地址,一般为oringin
            
    

    clone默认会chekout出master分支,如果你还想要远端的init分支呢?

        git checkout init origin/init //克隆远端的init分支到本地的init分支
        //你也可以在clone版本仓库的时候指定分支;
        git clone <remote_repo> -b <branch>
        
        //用gitk看下你的工作流
        gitk--all &
    
    • 3.修改并提交
        //本地修改
        git status //列出当前分支的状态
        git difftool //调用diff工具diff代码
        or
        gitk & //
        or
        git gui & //如果你安装了git gui的话
        
        git add -A . //将所有文件加入缓存
        
        //提交代码
        git push o init:init //第一次,新建远端init分支,并将本地init分支push过去
        or
        git push o init //效果参见上一条命令
        or
        git push o //push当前分支到upstream。设置了本地分支的upstream之后,可以不用指定远端的分支
        
        git push  //是 git push o prd_1:prd_1 的简写。因为要push的是本地当前分支prd_1,且其upstream分支名是o/prd_1,同名,所以可以全省略
        
    
    • 4.merge
        //merge 当前分支中的别人的修改
        git pull //等同于 git fetch 更新所有的远程分支,然后再 git merge o/prd_1。
        or
        git fetch (and) git merge 
        //merge master 分支到当前分支
        git merge o/master
    
    • 5.conflict 冲突解决

    merge的时候很容易就会出现代码冲突,一般情况下git会自行自动resolve,但是如果自动没能解决的话就需要手动解决冲突了。

        //如果配置了mergetool,可以这么使用
        git mergetool
        //修改冲突后,直接提交就行了,就像正常的提交
        git add -A .
        git ci -m 'merge master'
        git push 
        
        //查看下状态
        git status
    

    上面所说的只是一些很基本的用法,对于每个都没有深入去讲,后面会针对常见的问题做一些深入的讲解。

    最后再放送一些小技巧

    • 配置alias
      找到你的.gitconfig文件,在里面增加
        st = status
        ci = commit -m
        co = checkout
        br = branch
        unstage = reset HEAD --
        last = log -1 HEAD
    

    或者直接配置全局的alias:

        $ git config --global alias.st status 
        $ git config --global alias.ci 'commit -v'
    

    配置了alias之后,命令将大大减少

        $ git st //git status
        $ git ci 'commit one' //git commit -m 'commit one'
    

    如果你觉得这样还是费事的话,你还可以配置的bash或者zsh的alias:

        alias gst='git status'
        alias gl='git pull'
        alias gp='git push'
        alias gd='git diff | mate'
        alias gau='git add --update'
        alias gc='git commit -v'
        alias gca='git commit -v -a'
        alias gb='git branch'
        alias gba='git branch -a'
        alias gco='git checkout'
        alias gcob='git checkout -b'
        alias gcot='git checkout -t'
        alias gcotb='git checkout --track -b'
        alias glog='git log'
        alias glogp='git log --pretty=format:"%h %s" --graph'
    
    • 我同时还使用github,这样的话,公司的username和github的不同怎么办?
        //如果不想使用全局的username的配置,只需在项目目录下单独配置即可
       $ git config user.name 'developer' //记得不加--global
    

    相关文章

      网友评论

        本文标题:关于git你需要知道的事

        本文链接:https://www.haomeiwen.com/subject/pbnjtttx.html