有冲突时如何强制合并成功?

时间:2016-04-24 06:39:49

标签: git github merge

我正在尝试合并一个文件中有一个冲突的拉取请求(参见下文)。合并拉取请求的指令provided by github如下。执行此合并非常重要,因此提交公关的人可以获得信用。

# 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 merge errors修复合并。一组错误会变成另一组错误, ad infinitum 。我还尝试根据Ignore files during merge重置问题文件,并计划复制/粘贴所需的一行,但破坏的索引仍然存在。

这已经完全浪费了时间,我不再有兴趣尝试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.

5 个答案:

答案 0 :(得分:20)

如果不解决冲突,就无法合并。否则,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

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

您可以对要从合并中省略的每个文件重复此过程。当你完成后,按照通常的方式提交:

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

答案 1 :(得分:12)

没有办法解决冲突,这就是修改控制的工作方式(如果Alice说“a”而Bob说“b”,Git应该知道哪一个是正确的,除非告诉它?) 。您可以做的就是直接gitseveral possible ways之一合并时自行解决它们,例如

git merge -s recursive -X theirs <branch>

-s recursive是默认值,只有一个<branch>,所以你可以在这里省略它。)

现在您的树中已经存在冲突,您可以

  • 关注manual resolution route
    • 根据您的心愿编辑文件
    • git add它(Git中的add加倍标记已解析的文件)
    • git commit完成合并;或
  • 使用git merge --abort恢复合并前状态,然后使用上述自动解析选项重试合并

答案 2 :(得分:4)

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

对冲突的文件进行编辑以使其满意,将其暂存(git add),并在完成所有操作后git commit

具体而言......

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

答案 3 :(得分:3)

将开发推向主

git push --force origin branchA:branchB

这将强制合并然后按

答案 4 :(得分:1)

如果您知道要在当前工作分支中进行更改,则只需将ours标志添加到git merge中即可。

git merge -s ours master

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

此处提供更多信息和策略:https://www.atlassian.com/git/tutorials/using-branches/merge-strategy