在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内容如下:
dev分支的git log:
* 3fffeae - (HEAD -> dev) add 222 (12 minutes ago) <kevin.xiong>
* 92c74a5 - add 111 (13 minutes ago) <kevin.xiong>
* ebecfec - add 1.txt (14 minutes ago) <kevin.xiong>
(4)切换到主分支master,在1.txt中的第二行添加字符串”333”, 提交一个commit:git commit -m "add "333""
此时,1.txt内容如下:
git log如下:
* cacec8d - (HEAD -> master) add 333 (11 minutes ago) <kevin.xiong>
* 92c74a5 - add 111 (13 minutes ago) <kevin.xiong>
* ebecfec - add 1.txt (13 minutes ago) <kevin.xiong>
此时,master分支和dev分支有了分歧。
merge
将dev分支merge到master。在master分支上,git merge dev
:
查看1.txt:
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
如上图提示,提示有冲突,打开1.txt:
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
提示有冲突:
打开1.txt
Current Change是222,是dev分支的修改,也就是要rebase的分支的修改。
Incoming Change是333, 是master分支的修改,也就是当前已有的修改。
结论:rebase跟上面2种(merge, cherry-pick 刚好相反)