Navigation
Share
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 不会生成新的节点,是将两个分支融合成一个线性操作.