我正在尝试合并一个文件中有一个冲突的拉取请求(见下文)。合并拉取请求的说明由 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