【问题标题】:Rolling back in Git在 Git 中回滚
【发布时间】:2008-10-20 10:40:12
【问题描述】:

我已经提交并推送了几个补丁: A1-->A2-->A3-->A4(头部)

每个人都将这些变更集提取到他们的本地副本中。

现在我们想要“回滚”到 A2,并从那里继续开发 - 基本上放弃 A3 和 A4。最好的方法是什么?

【问题讨论】:

    标签: git


    【解决方案1】:

    从你的工作副本的根目录执行

    git checkout A2 -- .  
    git commit -m 'going back to A2'
    

    为此目的使用git revert 会很麻烦,因为您想摆脱一系列提交,而revert 一次撤消一个。

    你也不想要git reset。这只会改变你的master 分支指针:你没有错误方向的记录。协调起来也很痛苦:由于您将master 更改为的提交不是远程存储库的master 分支指针的子项,因此推送将失败——除非您添加-f(强制)或删除master首先在远程存储库中分支并通过推送重新创建它。但是每个尝试拉取的人仍然会在他们本地的master 分支中保留旧历史,因此一旦origin/master 分歧,git pull 将尝试执行合并。这不是世界末日:他们可以通过git rebase --onto origin/master $old_origin_master_commit master 摆脱这种情况(即,将他们在旧origin/master 之上的本地提交重新定位到新origin/master 之上)。但 Git 不会自动执行此操作,因此您必须与每个协作者协调。简而言之,不要那样做。

    【讨论】:

      【解决方案2】:

      丢弃这些提交可能会对从您的存储库中提取的任何人产生一些负面影响。作为另一种选择,您可能需要考虑从 A2 开始创建替代开发分支:

      A1-->A2-->A3-->A4 (master/HEAD) \ -->B1-->B2(新主/HEAD)

      这样做很简单

      git branch new-master master~2

      【讨论】:

        【解决方案3】:

        您需要git-revert git-reset,具体取决于您要如何处理 A3 和 A4。要删除 A3 和 A4 的所有痕迹,请使用 git-reset --hard 要保留 A3 和 A4 并记录您正在还原的事实,请使用 git-revert

        编辑:Aristotle Pagaltzis 的git-checkout 解决方案更胜一筹,但对于小型还原,我认为git-revert 没有问题。尽管如此,我还是希望将来支持Aristotle Pagaltzis's answer

        我发现git magic 是一个很好的 git 资源。

        【讨论】:

        • 原始发帖人几乎可以肯定想要还原而不是重置。由于每个人都将 A3 和 A4 拉到自己的本地存储库中,我认为重置会搞砸。
        • git-revert 一次只会还原一个提交,而 git-reset 对已发布的更改是错误的。正确答案是 git-checkout。
        • 亚里士多德 Pagaltzis:你是对的,我已经从我的回答中删除了它。
        猜你喜欢
        • 2016-06-04
        • 2012-07-28
        • 2012-04-29
        • 1970-01-01
        • 2017-04-24
        • 2021-08-10
        • 2010-10-09
        • 1970-01-01
        • 2012-05-03
        相关资源
        最近更新 更多