强制 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}
请注意,这会丢弃已提交和未提交的工作,因此请小心。
问题
我有一个包含 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}
请注意,这会丢弃已提交和未提交的工作,因此请小心。