【问题标题】:Git: Discard all changes on a diverged local branchGit:丢弃分歧的本地分支上的所有更改
【发布时间】:2010-03-01 19:58:48
【问题描述】:

我有一个跟踪远程分支的本地主题分支。为了便于讨论,假设提交历史如下所示:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

查看了相关的提交历史记录后,我现在想放弃对本地 phobos 分支的所有更改,并将其恢复为 origin/phobos 的直接副本,因此本地历史记录如下所示:

A--B--C--O1--O2--O3 (phobos origin/phobos)

我真的不希望对 phobos 分支进行本地更改,并且我真的不希望之后在原始存储库中显示任何合并。 (所以,只是合并不是我的想法。)

这看起来应该很容易,但是我的 google-fu 让我失望了。我该怎么做?

【问题讨论】:

    标签: git


    【解决方案1】:
    git checkout phobos
    git reset --hard origin/phobos
    

    这告诉 Git 将 phobos 的头部重置为与 origin/phobos 相同的提交,并更新工作树以匹配。

    【讨论】:

    • IMO 这应该是公认的答案;它发出“重置”命令来移植分支指针,而不是执行删除/重新创建的手术。
    • 实际上,我首先尝试了这个,它抛出了大量错误,使本地副本几乎无法使用。删除/重新创建可能不太优雅,但我不必问任何后续问题。
    • @Electrons_Ahoy:嗯,这绝对不正常。如果您的存储库处于良好的工作状态,则执行此重置通常应该是没有问题的操作。
    • 或者即使它是 hinky。如果您“意外”发出此命令而没有实际阅读它的作用,请使用 git reflog 找到回家的路。 :)
    • 如果你在分支上并且你在本地搞砸了,这也可以工作。
    【解决方案2】:

    删除分支,然后重新创建:

    $ git branch -D phobos
    $ git checkout --track -b phobos origin/phobos
    

    请注意,删除分支会吹走分支的 reflog。

    另一方面,重置分支(如the other answer所示)不仅保留了reflog,而且实际上在reflog中记录了重置。如果需要,这使得操作在以后很容易撤消。

    【讨论】:

    • 与重置分支头部相比,这种方法的一个问题是删除分支会吹走分支的 reflog。另一方面,重置分支不仅保留了 reflog,而且实际上在 reflog 中记录了重置。如果需要,这使得操作在以后很容易撤消。
    • @Electrons_Ahoy 建议您将此处接受的答案更改为 Dan 的(这样像我这样在 Google 上搜索过如何操作的人可能会选择更安全的方法)。
    • @DanMoulding 的回答不涉及在不必要时删除本地分支。它更安全。
    • Dan Moulding 的回答更安全。我认为你应该选择那个。
    • 我认为这正好回答了 OP 的问题——它抨击当地历史,而不是用你所做的任何当地变化来污染历史。有时完全失忆是你想要的。拥有两个答案是非常好的,这样人们就可以决定什么适合他们的需求
    猜你喜欢
    • 2014-03-31
    • 2021-09-20
    • 2015-12-14
    • 2017-02-08
    • 1970-01-01
    • 2021-07-07
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多