在git中,遇到冲突时,Current Change和Incoming Change分别指什么?下面分情况说明:

准备

新建一个项目,初始化 git init
在master分支上:
(1)添加文件1.txt,提交一个commit: git commit -m "add 1.txt"
(2)在文件1.txt中添加一行字符串”111”,提交一个commit:git commit -m "add "111""
(3)新建分支dev,然后在1.txt中的第二行添加字符串”222”,提交一个commit:git commit -m "add "222""
此时,1.txt内容如下:
image.png
dev分支的git log:

  1. * 3fffeae - (HEAD -> dev) add 222 (12 minutes ago) <kevin.xiong>
  2. * 92c74a5 - add 111 (13 minutes ago) <kevin.xiong>
  3. * ebecfec - add 1.txt (14 minutes ago) <kevin.xiong>

(4)切换到主分支master,在1.txt中的第二行添加字符串”333”, 提交一个commit:git commit -m "add "333""
此时,1.txt内容如下:
image.png
git log如下:

  1. * cacec8d - (HEAD -> master) add 333 (11 minutes ago) <kevin.xiong>
  2. * 92c74a5 - add 111 (13 minutes ago) <kevin.xiong>
  3. * ebecfec - add 1.txt (13 minutes ago) <kevin.xiong>

此时,master分支和dev分支有了分歧。

merge

将dev分支merge到master。在master分支上,git merge dev
image.png
查看1.txt:
image.png
Current Change是333, 是master分支的修改,也就是当前已有的修改。
Incoming Change是222,是dev分支的修改,也就是要merge的修改。

cherry-pick

为了测试,我们不妨取消上面的merge: git merge --abort
还是在master分支,cherry-pick dev分支的commit, 从上面的log可以查询到dev的 add 222的commit:
3fffeae - (HEAD -> dev) add 222 (12 minutes ago)
我们就把3fffeae 这个commit 给 cherry-pick到master分支,git cherry-pick 3fffeae
image.png
如上图提示,提示有冲突,打开1.txt:
image.png
Current Change是333, 是master分支的修改,也就是当前已有的修改。
Incoming Change是222,是dev分支的修改,也就是要cherry-pick的修改。
结论:cherry-pick的情况和merge相同。

rebase

为了测试,我们不妨取消上面的cherry-pick: git cherry-pick --abort
然后,在master分支rebase dev分支,即以dev分支为基础,将master分支的修改作为最新的commit添加到dev的commit之后,相当于既获取了dev的commit, 又保留master的commit (作为最新的commit)。
git rebase dev
提示有冲突:
image.png
打开1.txt
image.png
Current Change是222,是dev分支的修改,也就是要rebase的分支的修改。
Incoming Change是333, 是master分支的修改,也就是当前已有的修改。
结论:rebase跟上面2种(merge, cherry-pick 刚好相反)