强制 git 拉动以通过丢弃所有本地提交来解决分歧?

Force git pull to resolve divergent by discard all local commits?

问题

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

A -> B -> C

并且远程仓库还有另外 3 次提交:

A -> B -> D

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

A -> B -> D

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

为什么我需要这个

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

但是,如果有人更改了 origin1 的历史记录,我的脚本中的 git pull 将失败并显示一条错误消息。解决问题的唯一方法是删除整个本地存储库,然后执行 git clone from stretch。它浪费带宽而且速度很慢!

您不应该对 git pull 执行此操作,因为 git pull 是为不同的目的而设计的:合并工作。但是您不想合并工作;你想镜像他们最新的提交.

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

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

git reset --hard @{upstream}

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