主分支:
-test.txt
-A
-B
-C
-D
功能分支:从主分支,并在新行中添加-E
同时,删除了主分支上的-C行。
现在,如果我想做一个拉请求,首先我将当前的主分支合并到我的功能分支。但是,在合并冲突1中,我只能选择结果为ABD(主分支(或ABCDE(功能(。
我期望结果看起来像";ABDE";。(从主分支更新,但也从功能分支添加新行E(
为了达到预期的结果,我需要做什么?提前感谢
我希望结果看起来像"ABDE";。为了达到预期的结果,我需要做什么?
编辑文件,使其看起来像";ABDE";,添加文件并提交。
从开始到结束的合并冲突
设置
为了便于显示,我创建了以下git别名。(所有以$
开头的行都输入终端:
$ git config --global --add alias.lx "log --all --decorate --oneline --graph"
Init+提交
$ mkdir test && cd test
$ echo -e 'AnBnCnD' > test.txt
$ git init
$ git add test.txt
$ git commit -m "Initial ABCD commit"
功能分支
$ git checkout -b feature
$ echo 'E' >> test.txt
$ git commit -am "Add feature E"
返回主屏幕
$ git checkout main
$ echo -e 'AnBnD' > test.txt
$ git commit -am "Remove feature C"
冲突(?(
在git --version
2.35.1上,我无法再现您的冲突:
$ git merge feature
Auto-merging test.txt
Merge made by the 'ort' strategy.
test.txt | 1 +
1 file changed, 1 insertion(+)
$ cat test.txt
A
B
D
E
$ git lx
* 248cb4c (HEAD -> main) Merge branch 'feature' into main
|
* | 64d82c9 Remove feature C
| * c8038f5 (feature) Add feature E
|/
* fb88cb0 Initial ABCD commit
因此,在这个简单的例子中,Git足够聪明,能够找到一个很好的方法来组合这两种更改。
冲突(真实的(
所以,让我们让它变得更加困难;首先,让我们先撤消分支main上的合并,将其重置为合并前的提交。手动指定提交ID,或者使用HEAD^
。(如果你不确定这指的是哪一个提交,只需git show HEAD^
并确认它是"删除功能C"。
$ git show HEAD^
$ git reset --hard HEAD^
$ git lx
* 64d82c9 (HEAD -> main) Remove feature C
| * c8038f5 (feature) Add feature E
|/
* fb88cb0 Initial ABCD commit
在main上创建一个更困难的更改:
$ echo 'FE' >> test.txt
$ git commit -am "Add FE"
现在,终于发生了合并冲突:
$ git merge feature
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
$ cat test.txt
A
B
D
<<<<<<< HEAD
FE
=======
E
>>>>>>> feature
Git停止任何为你思考的尝试。有用的命令git status
建议您如何继续:您可以选择
- "修复冲突并运行CCD_ 6";或
- 后退一步;使用CCD_ 7中止合并">
分辨率
步骤";修复冲突";只需在文本编辑器中打开test.txt,然后想知道test.txt最终的样子。只有您才能决定上述更改的正确解决方案。只需删除所有冲突标记并保持文件整洁即可。例如,我为test.txt选择了以下解析状态:
A
B
D
E
FE (separate from E!)
之所以引入解释性文本,是因为FE
旁边的E
可能会引起混淆。这是为了强调您可以执行任何您认为合适的编辑;解决冲突";。
完成后,查看git status
中的说明:现在您已经修改了test.txt;CCD_ 11以标记分辨率";出现,所以我们这样做(然后git状态建议我们使用commit来结束合并(:
$ git add test.txt
$ git commit -m "Complicated merge of 'feature' into main"
$ git lx
* d12730f (HEAD -> main) Complicated merge of 'feature' into main
|
| * c8038f5 (feature) Add feature E
* | 864eea7 Add FE
* | 64d82c9 Remove feature C
|/
* fb88cb0 Initial ABCD commit