Navigation
  • Print
  • Share
  • Copy URL
  • Breadcrumb

    Git技术

    记录一些Git常用指令和原理解释

    Ash

    Git 记录

    清除git缓存,使修改后的gitignore生效

    git rm -r --cached .
    git add .
    git commit -m 'update .gitignore'
    

    查看commit记录

    git log 查看所有
    git show 查看最新的commit  
    git show commitId 查看指定commit hashID的所有修改 
    git show commitId fileName 查看某次commit中具体某个文件的修改
    

    git rebase 和 git merge的区别

    merge 和 rebase 操作均用于合并分支,但在具体操作上有不同,同时,rebase会给你一套清晰的代码历史,而merge则是乱七八糟的代码历史. 下面我们分别说说 merge 和 rebase 的具体操作

    rebase

    假设你有两个分支,一个master主分支,一个从master分离出来的feature分支,如下所示

           <- E <- F   feature 分支
         /
    A <- B <- C <- D   master 分支
    

    当使用 merge 的时候,比如在feature分支上使用 “git rebase master”, git 会先找到两个分支的最近公共祖先,在这里也就是B,然后对比feature分支相比于B的历次commit,也就是E和F,提取相应的修改并存为临时文件,再将header指向master分支的最后一次提交,也就是D,以此作为新的基底将之前存起来的的临时文件按顺序应用

    A <- B <- C <- D <- E‘ <- F’  feature 分支
    

    也可以理解成 rebase 是直接将以B的作为基底切换到了以D作为基底,并提交了两个内容相同的commit(E和F),但实际上E和F已经不再是以前的E和F,变成了E‘和F’,他们是在master分支commit C和D之后再进行的提交,因此实际上 rebase 操作是丢弃了一些原有的commit(E和F),而新提交一些内容一样但实际上不同的commit(E‘和F’)

    使用 rebase 可以使得代码历史简介有线性,例如这次操作的历史变为:

    # 最上面是最新的
    * 74199ce (HEAD -> master, feature) commit F
    * e7c7111 commit E
    * d9623b0 commit D
    * 73deeed commit C
    * c50221f commit B
    * ef13725 commit A
    

    merge

    以同样的例子举例,使用merge操作生成的代码历史显得比较复杂

    • 切换到 feature 分支: git checkout feature。
    • 合并 master 分支的更新: git merge master。
    *   875906b Merge branch 'master' into feature
    |\  
    | | 5b05585 commit F
    | | f5b0fc0 commit E
    * * d017dff commit D
    * * 9df916f commit C
    |/  
    * cb932a6 commit B
    * sd8fd7f commit A
    

    也就是

           <- E <- F   
         /           \
    A <- B <-  C  <-  D 
    

    可以看到 merge 会形成一个新的节点,之前的两个分支提交都分开显示,而 rebase 不会生成新的节点,是将两个分支融合成一个线性操作.