使用远程更改解决从Git远程拉取时的冲突问题

334

我正在尝试将GitHub代码库中的代码拉到我的服务器上,但由于合并冲突,拉取一直失败。我不想保留自上次拉取以来在本地服务器上可能发生的任何更改。

那么有没有办法强制Git覆盖GitHub中的版本,而不用麻烦我处理冲突呢?


重复的问题?http://stackoverflow.com/questions/4779715/error-when-running-git-pull-origin-master/4779723#4779723 - user173973
4
@nvm:不是的。这是关于真正的合并冲突,而不是将被覆盖的未跟踪文件。 - Cascabel
如果这是一个重复的问题,那么反过来也一样。我认为它们没有关联。但很好你回答了另一个问题 ;) - digitaldonkey
2个回答

555
如果你真的想要丢弃你本地做的提交,也就是说将它们永远从历史记录中删除,你不需要进行合并操作(pull),因为合并意味着保留这些提交。你所需做的一切只是:
# fetch from the default remote, origin
git fetch
# reset your current branch (master) to origin's master
git reset --hard origin/master

我个人建议首先在当前HEAD上创建一个备份分支,以便如果您意识到这是个坏主意,您不会失去它的踪迹。

另一方面,如果您想保留这些提交并让它看起来像是与origin合并,并使合并仅保留来自origin的版本,则可以使用ours合并策略:

# fetch from the default remote, origin
git fetch
# create a branch at your current master
git branch old-master
# reset to origin's master
git reset --hard origin/master
# merge your old master, keeping "our" (origin/master's) content
git merge -s ours old-master

1
在 git 命令的第二个块中,第二个命令后面应该加上 'git fetch origin' 吗? - David Tuite
2
在我和Git有关的事情上,没有什么可以被隐含的了 ;-). 但说真的,非常感谢。你的回答正是我所寻找的。 - David Tuite
1
如果起点实际上在前面,这个方法还能行得通吗?也就是说,如果我没有任何超前的提交,事实上该分支可以快进,我是否也能使用它? - Jared Forsyth
为什么要创建备份?如果你搞砸了,难道不能依靠 reflog 来“回到过去”吗? - Coder Guy
现在它被称为 origin/main,不再是 origin/master - bixiou
显示剩余2条评论

162

您可以使用nvm指向的重复链接中的答案。

或者,您可以通过使用其更改来解决冲突(但如果它们与远程版本不冲突,则可能保留某些更改):

git pull -s recursive -X theirs

3
对我来说好像不起作用。使用 git 版本 1.5.6.5 时,我收到了“错误:未知开关 `X'”的提示。我需要升级到不稳定版本吗? - David Tuite
2
@David 你可以从http://backports.debian.org/获取debian的最新版本git。 - Arrowmaster
“-s recursive”【是默认设置】(参考链接:https://dev59.com/SGgv5IYBdhLWcg3wTvE-#S6mfEYcBWogLw_1bz4CW),因此只需使用“git pull -X theirs”即可。 - Cees Timmerman
2
这正是我正在寻找的! - micahblu
2
@CeesTimmerman 不是真的,在最新的git中。X选项被传递到合并策略,只有在合并两个头时才是recursive,所以您的命令会报错“"Could not find merge strategy 'theirs'。 Available strategies are: octopus ours recursive resolve subtree."” - 这很遗憾,因为可以在配置中设置X(例如git config pull.twohead theirs),但不能设置s - OJFord
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接