如何在发生冲突时强制合并成功



我正在尝试合并一个文件中有一个冲突的拉取请求(见下文)。合并拉取请求的说明由 github 提供如下。执行此合并很重要,以便提交 pr 的人获得荣誉。

# Step 1: From your project repository, check out a new branch and test the changes.
git checkout -b droark-master master
git pull https://github.com/droark/cryptopp.git master
# Step 2: Merge the changes and update on GitHub.
git checkout master
git merge --no-ff droark-master
git push origin master

我知道如何修复一个冲突文件中的一行。我不知道该怎么做的是让 Git 执行合并并停止抱怨索引文件损坏。

如何让 Git 执行合并,确保提供拉取请求的人获得荣誉,并停止破坏索引文件?


我试图修复带有 Git 合并错误的合并。一组错误变成另一组错误,无穷无尽。我还尝试根据合并期间的忽略文件重置问题文件,并计划复制/粘贴所需的一行,但损坏的索引仍然存在。

这已经变成了完全浪费时间,我不再有兴趣尝试以 Git 的方式做到这一点,因为它浪费了太多时间。现在我只想让 Git 执行合并并停止破坏索引文件。


以下是使用 github 的说明合并时生成的输出:

$ git pull https://github.com/droark/cryptopp.git master
From https://github.com/droark/cryptopp
 * branch            master     -> FETCH_HEAD
Auto-merging validate.h
Auto-merging validat2.cpp
Auto-merging validat1.cpp
Auto-merging test.cpp
CONFLICT (content): Merge conflict in test.cpp
Auto-merging pubkey.h
Automatic merge failed; fix conflicts and then commit the result.

如果不解决冲突,就无法合并。否则,git 怎么知道要合并什么?但是,您可以使用 git checkout --ours <filepath>git checkout --theirs <filepath> 从要合并的任一分支中签出版本。下面是一个示例:

假设您在主分支上合并暂存:

git checkout master
git merge staging

git 显示了一堆冲突:

...
CONFLICT: Readme.md
...

如果要保留主服务器上的Readme.md版本,则可以运行:

git checkout --ours Readme.md

请注意,由于您在主--ours上指的是"这个"分支,即主。

现在,您只需将其添加到索引中即可将其标记为已解决:

git add Readme.md

这实际上忽略了对staging分支上的Readme.md所做的任何更改。

您可以对要从合并中省略的每个文件重复此过程。完成后,像往常一样提交:

git commit -m "whatever..."

为了对所有有冲突的文件重复此操作,您可以这样做

for f in $(git diff --name-only --diff-filter=U | cat); do
   echo "Resolve conflict in $f ..."
   git checkout --theirs $f
done
没有

办法解决冲突,这就是版本控制的工作原理(如果 Alice 说"a",Bob 说"b",Git 怎么知道哪一个是正确的,除非告诉它?)。您所能做的就是在以几种可能的方式之一合并时直接git自行解决它们,例如

git merge -s recursive -X theirs <branch>

(当只有一个<branch>时,-s recursive是默认值,因此您可以在此处省略它)

现在你的树中已经有冲突了,你要么

  • 遵循手动解决路线
    • 根据自己的喜好编辑文件
    • git add它(Git 中的add兼作标记文件已解析)
    • git commit完成合并;或
  • 使用 git merge --abort 还原预合并状态,并使用上述自动解析选项重试合并

解决冲突就像处理任何其他正在进行的工作一样。所有更改都必须暂存(git add),然后提交。已成功自动合并的文件已暂存。冲突的文件不是。

编辑冲突的文件以使您满意,暂存它们(git add),完成后,git commit .

特别是在您的情况下...

  • 编辑test.cpp以解决冲突(它们有<<<<标记)
  • git add test.cpp
  • 运行测试以确保一切正常。
  • git commit

将开发推向主控

git push --force origin branchA:branchB

这将强制合并,然后推送

如果您知道当前工作分支中的更改是您想要的,您可以简单地将ours标志添加到 git 合并中。

git merge -s ours master

这有效地忽略了所有其他分支更改,并保证合并输出是当前工作分支的输出。

更多信息和策略在这里 : https://www.atlassian.com/git/tutorials/using-branches/merge-strategy