【问题标题】:Force git pull to resolve divergent by discard all local commits?强制 git pull 通过丢弃所有本地提交来解决分歧?
【发布时间】:2021-07-07 07:52:22
【问题描述】:

问题

我有一个包含 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 从 origin1 和 git push 到 origin2。

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

【问题讨论】:

  • 如何循环/当 git pull 命令不成功时,执行git reset HEAD~1 --hard

标签: git git-merge git-pull git-merge-conflict


【解决方案1】:

您不应该对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}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多