关于git:如何在发生冲突时强制合并成功?

How to force a merge to succeed when there are conflicts?

我正在尝试合并一个文件中有一个冲突的拉请求(见下文)。Github提供了合并拉请求的说明,如下所示。执行此合并非常重要,因此提交PR的人可以获得此合并的学分。

1
2
3
4
5
6
7
8
# 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的指令合并时生成的输出:

1
2
3
4
5
6
7
8
9
10
$ 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 git checkout --theirs 从要合并的分支中签出版本。下面是一个例子:

假设您在分段中合并主分支:

1
2
git checkout master
git merge staging

Git显示了一系列冲突:

1
2
3
...
CONFLICT: Readme.md
...

如果您想保留master上的Readme.md版本,那么您可以运行:

1
git checkout --ours Readme.md

请注意,由于您在"主"上,所以1(10)指的是"本"分支,即"主"。

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

1
git add Readme.md

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

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

1
git commit -m"whatever..."

为了对所有有冲突的文件重复此操作,可以执行以下操作

1
2
3
4
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来解决问题,例如:

1
git merge -s recursive -X theirs <branch>

(当只有一个时,默认为-s recursive,因此您可以在这里省略它)

既然你的树上已经有了冲突,你也可以

  • 遵循手动解决路线
    • 根据您的心愿编辑文件
    • git addit(git中的add加倍表示文件已解决)
    • git commit完成合并;或
  • 使用git merge --abort恢复预合并状态,并使用上述自动解决方案重新尝试合并。


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

编辑有冲突的文件使您满意,将它们分阶段(git add),完成后,git commit

具体来说……

  • 编辑test.cpp以修复冲突(它们有<<<<标记)
  • 埃多克斯1〔5〕
  • 运行测试以确保一切正常。
  • 埃多克斯1〔2〕


把发展推向主人

1
git push --force origin branchA:branchB

这将强制合并,然后按