能否在Git仓库外或提交冲突标记文件后使用Git合并工具?
问题描述
在Git中合并两个存在冲突文件的分支时,Git会在冲突区域添加标记。例如,存在冲突的文件内容如下:
Some code <<<<<<< HEAD Changes in branch A ||||||| cbf9a68 Original code ======= changes in branch B >>>>>>> branch-B some more code
其中branch-A/HEAD是被合并的分支,branch-B是待合并的分支,<<<<<、=====和>>>>>被称为冲突标记。有多种工具可帮助解决这些冲突,包括meld、vimdiff、diffview等。但这些工具仅能在处于冲突解决状态的Git仓库中使用(即两个分支尚未完成合并时)。
据了解,在以下场景中无法再使用这些工具:
- 带有冲突标记的文件已被提交(即文件中包含
<<<<<、=====和>>>>>标记并完成提交); - 带有冲突标记的文件被移出Git仓库(例如用于追踪冲突情况)。
在上述场景下,无法再使用Git合并工具解决冲突。这些冲突工具似乎仅适用于Git仓库内,这合乎逻辑。因此我的问题是:能否在Git仓库外(或提交含冲突标记的文件后),使用Git合并工具处理带有冲突标记(<<<<<、=====和>>>>>)的文件?
理想流程如下:
git checkout branch-A git merge branch-B # Part 1: committing file with conflict markers git add foo.txt # Add conflicting file, with conflict markers (i.e., withOUT resolving conflicts) git commit -m "Add conflicting file" # Commit file with conflict markers # Part 2: resolve conflict on committed files (i.e., this is what I'm asking for) # TODO: Use conflict resolution tools such as meld, diffview, etc. to find conflict markers and resolve them git add foo.txt # Stage and commit files after resolving conflicts git commit -m "Conflicts resolved"
问题场景
我知道这是Git合并工具的非常规用法,但存在这样的应用场景:部分组织要求开发者先提交带有冲突标记的文件,再在另一个提交中解决冲突。这样做的原因是创建PR时,评审人员可以看到开发者解决冲突的过程。
我明白这可能被视为不良实践(例如提交带冲突标记的文件意味着存在代码无法运行或编译的提交),但我别无选择必须遵循此规范,因此问题并非针对该实践本身。
次优解决方案
针对上述问题,一种次优解决方案如下:
git checkout branch-A git merge branch-B # Part 1: committing file with conflict markers git add foo.txt # Add conflicting file, with conflict markers (i.e., withOUT resolving conflicts) git commit -m "Add conflicting file" # Commit file with conflict markers # Part 2: committing file to another branch after conflict resolution git checkout HEAD~1 # Checkout previous commit (i.e., before merging) git checkout -b branch-A-resolved # Create a branch at which the conflicts are to be resolved git merge branch-B # Merge branch-B # Resolve conflicts git add foo.txt # Add file *after* resolving conflicts git commit -m "Resolve conflicts" # Commit file withOUT conflict markers # Part 3: cherry-pick conflict-resolved files into branch-A git checkout branch-A git cherry-pick branch-A-resolved -m 1 -X theirs # `theirs` is used since `branch-A-resolved` contains the resolved file git branch -D branch-A-resolved
该解决方案可行,但操作繁琐。
内容的提问来源于stack exchange,提问作者Amro
相关产品推荐
相关产品推荐

