奇怪的是,以下步骤存在合并冲突:
- 我在 GitHub 上分叉了一个存储库
foo
- 我
git clone
这个分叉的存储库到我的硬盘驱动器 - 3 天后,有人向分支提交了大量代码
xyz
- 因此,为了使分支在我的分叉存储库上完全相同,我再次从分叉存储库
git clone
到一个新的文件夹bar
cd bar
git checkout xyz
git remote add upstream <the URL for foo>
git pull upstream xyz
并且出现了大量的合并冲突。 我从来没有碰过树枝xyz
里的任何东西.是另一个开发人员将很多东西提交到xyz
中,因此分支xyz
应该使用他的所有更改进行更新,而不是合并冲突。 后来他说它有合并冲突,因为他git push -f
,如果他从未使用过-f
,那么它不应该有合并冲突。
这种情况是如何解决的?
您应该将pull
分解为fetch
,然后merge
:
git fetch upstream xyz
git merge upstream/xyz
然后你必须解决冲突。
后来他说它有合并冲突,因为他
git push -f
,如果他从未使用过-f
,那么它不应该有合并冲突。
这是正确的。
假设原始xyz
分支看起来很简单
A --- B --- C --- D
也就是说,有四个提交,D
是最新的。这是您克隆的内容。
现在,另一个人强制推动,使存储库看起来像这样:
A --- B --- C --- E
也就是说,已删除提交D
,并添加了提交E
。考虑一下运行git fetch
时会发生什么:
A --- B --- C --- D <-- local xyz branch
`
`--- E <-- remote xyz branch
完成此操作后,无法确定提交D
最初来自远程分支。它与您在本地创建的提交没有区别,因此,您的后续git merge
尝试保留其内容。
在这种情况下,你想完全忽略D
,你只想得到E
。git reset --hard E
会这样做。你可以用任何通常的方式来指代E
,这里对我来说最合适的似乎是git reset --hard @{upstream}
.