【问题标题】:How to revert multiple commits as part of a single commit如何将多个提交还原为单个提交的一部分
【发布时间】:2012-05-12 00:49:49
【问题描述】:

这不是什么大问题,只是我想知道是否可行。

假设我们有两个提交,abcd123wxyz789,它们发生在不相邻的不同位置,远在回购的历史上。现在假设我们要还原它们。正在做

git revert abcd123 wxyz789

将导致两个单独的提交,一个还原abcd123,另一个还原wxyz789

这一切都很好,但是如果我们要修复的两个提交中的错误在逻辑上是相关联的,并且出于自我文档的目的,我们希望进行一个包含单个 "我破坏了一些东西,所以现在我正在恢复文件 x、y 和 z”评论?有没有 git 命令可以做到这一点?

(我当然知道可以创建一个提交,我只需手动修复所有更改然后推送。由于所有明显的原因,这很痛苦。)

【问题讨论】:

    标签: git revert


    【解决方案1】:
    git revert -n <commits>
    git commit
    

    第一个命令将执行所有还原而不创建任何提交并暂存最终结果(-n 选项)。之后,commit 命令创建一个提交。

    【讨论】:

    • 完美。简洁。它允许您在所有还原后添加您的提交消息,而不是返回修改其他答案建议的提交。
    • 除非它不起作用。我需要回滚最后 5 次提交,其中 3 次是这些奇妙的 Git 合并,每当你拉入别人的更改时就会发生。因此,'commit 的错误是合并,但没有给出 -m 选项'。每个合并都有两个父级,显然我必须确定我需要保留每个合并的哪个父级。我到底是怎么解决这个问题的,更不用说我如何将它指定给我不知道的恢复命令了。
    • @Neutrino 你应该可以使用 --no-merges 来避免合并提交。
    • 虽然知道它并不能解决问题很有趣。我想在我的提交流中合并提交,我只是不想手动确定每个父级的恢复选项应该遵循哪个父级,然后必须将其输入到恢复过程中。在我看来,revert 选项应该足够聪明,可以选择我要从中恢复的分支上的父级。
    【解决方案2】:

    如果是复杂的还原,它们会相互改变,revert --no-commit 可能会出现问题。

    我的简单解决方案是做真正的还原,然后壁球:

    git revert <all commits>
    git rebase -i
    

    然后将除第一个之外的所有还原标记为squash,以创建单个提交。

    【讨论】:

    • +1。对于 git 学习者:1. 阅读一下提交是什么,2. 精通交互式变基:压缩、删除、编辑、变基、重新排序提交。一旦你熟悉了它(提示:这只是时间旅行),这个解决方案就变得比使用--no-commit 之类的东西更自然。 (并且不要害怕“不要变基发布”规则——只要你在本地或私有分支上这样做,你就可以做任何事情。)
    • 额外提示: 第一个可以从pick 更改为reword(用于输入新的提交消息)或edit(用于暂存更改而不提交)。对于其他还原,如果您不关心提交消息,可以使用 fixup 而不是 squash
    • @AloisMahdal 我实际上尝试将已推送的提交还原并重新设置为原始提交,并且效果很好。它没有修改提交的历史记录,它只是创建了一个新的单个提交。我想知道为什么他们说不要对原始推送的提交进行交互式 rebase,或者它将如何修改 git 历史记录。你有什么想法吗?
    • @KarenAnne 它与你在 rebase 中究竟改变了什么有关。在我的示例(git revert + git rebase)中,您只需创建一些本地提交并将它们压缩到单个本地提交。但是,如果您尝试 rebase 现有提交,它将更改历史记录。例如,尝试运行 git rebase -i origin/master~2 并尝试更改已经合并的提交
    【解决方案3】:

    你可以这样做:

    git revert abcd123
    git revert --no-commit wxyz789
    git commit --amend
    

    ...然后编写适当的提交消息,描述恢复两个提交的综合效果。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-31
    • 2014-06-02
    • 2017-05-07
    • 1970-01-01
    • 2011-07-15
    • 2019-01-04
    • 2011-01-08
    相关资源
    最近更新 更多