首页 > 解决方案 > 强制 git pull 通过丢弃所有本地提交来解决分歧?

问题描述

问题

我有一个包含 3 个提交的本地仓库:

A -> B -> C

远程仓库还有另外 3 个提交:

A -> B -> D

如何git pull通过丢弃所有本地提交来解决分歧?之后的本地仓库git pull --some-magic应该是:

A -> B -> D

请注意,这git reset HEAD~1 --hard不起作用,因为我的脚本不知道必须还原多少次提交以避免冲突。

为什么我需要这个

我正在编写一个脚本来在 github 和 gitlab 存储库之间进行同步。其中之一是只读镜像。我的脚本只是尝试git pull --force从 origin1git push到 origin2。

但是,如果有人更改了 的历史记录origin1git pull我的脚本中的 将失败并显示错误消息。解决问题的唯一方法是删除整个本地存储库,然后git clone从拉伸中执行。既浪费带宽又慢!

标签: gitgit-mergegit-pullgit-merge-conflict

解决方案


你不应该这样做git pull,因为git pull它是为不同的目的而设计的:结合工作。但是你不想合并工作;你想反映他们最新的提交

为此,只需运行git fetch以获取他们的最新提交,然后使用git reset --hard将您的本地分支重置为他们的最新提交。唯一棘手的部分是git reset --hard要求他们最新提交的身份。这对您可用:如果您知道您的本地分支名称是main因为他们的分支名称是main,那么您自己的 Git 将更新您的origin/main,因此您可以使用git reset --hard origin/main.

或者,您可以使用当前分支的上游设置:

git reset --hard @{upstream}

请注意,这将丢弃已提交和未提交的工作,因此请小心处理。


推荐阅读