冲突原因
同时修改同一个档案的同一行code,就会发生冲突。
若修改同一个档案的不同行code,就会成功合併。
这个逻辑很容易理解,因为同时修改同一个地方,git根本不知哪个才是正确的内容。
产生冲突
延续Git-合併分支。
现在,产生一个发生冲突的情况。
建立feature分支。
线图。
在master分支,将a.txt内容的第一行改为123,再commit。
线图。
在feature分支,再将a.txt内容的第一行改为456,再commit。
线图。
接下来,将master分支合併feature分支。
果然发生冲突了。
解读冲突讯息
Auto-merging a.txt:
表示git正在自动合併a.txt这个档案。
CONFLICT (content) : Merge conflict in a.txt:
合併冲突的种类属于内容冲突「CONFLICT (content)」,
发生冲突的档案是a.txt「Merge conflict in a.txt」。
Automatic merge failed; fix conflicts and then commit the result.:
自动合併错误,请修复冲突,然后再commit结果。
看看git status的讯息
You have unmerged paths.
你有一个未合併的路径。意味着,目前的合併尚未完成。
分支显示(master|MERGING)也明确指示正处于合併状态。
解决方案
git status的讯息提示,有两个解决方式。
(fix conflicts and run "git commit")
修复冲突,再commit。
(use "git merge --abort" to abort the merge)
放弃这次的合併。
放弃合併
我们先放弃这次合併,回到合併前的状态。
重点注意,讯息显示nothing to commit, working tree clean,
这才是正常状态,表示目前都没有东西需要commit,工作目录是乾净的状态。
解决冲突
再一次合併,依旧会发生冲突。
讯息Unmerged paths:
(use "git add <file>..." to mark resolution)
git会提示你,add 冲突的档案,标记为解决方案。
下面红字,就代表冲突的档案,并特别标示both modified。
打开a.txt
<<<<<<< HEAD123=======456>>>>>>> feature
会发现,内容被git修改了。
这是因为遇到冲突时,git会将冲突的档案内容改成它自订的格式,显示所有的修改内容。
表示目前所在分支的档案内容。
<<<<<<< HEAD123
表示目前feature分支的档案内容。
456>>>>>>> feature
中间以=======相隔
因为git不会知道,哪个才是我们要的code,预设就是全部留下来。
但,这绝不会是我们需要的,一定都是手动修改完后再合併。
假设将code修改成这样,储存。
123456
修改完成后,执行add,再看一次状态。
这时讯息显示All conflicts fixed but you are still merging.
表示冲突已解决,但注意看分支状态,目前还处在合併中,所以仍然需要进行合併。
git有给提示:(use "git commit" to conclude merge)
可以执行git commit来结束commit。
一样会跳出合併讯息,储存后离开。
成功合併
git log
线图。
工作目录是处于乾净的状态。
本文为观看网路教学的学习笔记。