【问题标题】:Revert past git commits but keep changes introduced since恢复过去的 git 提交,但保留从那时起引入的更改
【发布时间】:2017-04-16 04:59:04
【问题描述】:

我是 git 新手,不知道如何处理。

我想撤消我们认为不是解决问题的好方法的一系列特定提交(与单个文件相关),但我想保留此后引入的所有其他提交。

我不想只编辑文件以删除那段代码,因为我觉得在这里还原更明确,并且可以更好地传达意图。

它是这样的:

X -> Y -> X -> -X -> Y -> X -> X

其中 Y 是指与该特定功能相关的提交,而 X 是我们希望保持不变的所有提交,最终为:

X -> X -> -X -> X -> X

我不确定 rebase 在这里如何工作,因为我不想只包含从某个时间点开始的所有提交。

cherry-pick 会是更好的方法吗?

编辑:可能值得一提的是所有这些提交都是推送的。

【问题讨论】:

  • 交互式变基,只需从选择列表中删除有问题的提交。

标签: git commit revert


【解决方案1】:

您可以使用交互式变基来修复您的错误如果您的提交尚未共享(仍然是您的存储库中的本地提交)

语法是:git rebase --interactive commit 的哈希(或者只是 git rebase -i commit 的哈希)

如果你说你的第一个 x 提交的哈希是 x1(使用 git log 来 git 这个提交的哈希码),那么你可以使用:git rebase -i x1

对于您要删除的每个提交,将 pick 替换为 drop

然后离开编辑模式(使用ESC键)和:wq

【讨论】:

    【解决方案2】:

    您可以使用git rebase --onto,如下所述:https://blog.pivotal.io/labs/labs/git-rebase-onto

    在您的特定情况下:

    X1 -> Y1 -> X2 -> X3 -> Y2 -> X4 -> X5
    

    命令是:

    git rebase --onto X3 Y2 # strips Y2
    git rebase --onto X1 Y1 # strips Y1
    

    【讨论】:

    • 只是确认一下,这需要按时间倒序进行吗?从最新到最早?
    • @Nobilis:您可以按任意顺序执行此操作,但编辑较早的历史记录可能会更改以后的哈希值,所以我选择这样做是因为您可以在过程开始时写下哈希值,然后然后使用它们而无需再次检查它们。如果你反过来做它不应该做任何可怕的事情,但我认为它可能会失败,你必须在每一步之前再次查找哈希。
    • 感谢您的提示,我将考虑 rebase --onto ,我将来不知道但已经推送了这些提交,在我们的案例中重写历史似乎不是一个可取的选择。我必须走revert 路径。
    【解决方案3】:

    您可以将特定文件恢复到以前的提交:

    git reset <commit hash> <filename>

    最好先查看对文件所做的更改:

    git diff <commit hash> <file name>

    您可以使用git log 获取提交哈希。

    或者,您可以从版本控制中签出文件的先前版本:

    git checkout -- <file name>

    编辑:更多信息here

    【讨论】:

      【解决方案4】:

      就我个人而言,我更喜欢 git rebase -i HEAD~10 (最后 10 次提交的交互式变基),我会通过评论他们的行来删除错误的提交。

      请注意,这需要一个 push --force,这总是需要非常小心的。

      【讨论】:

        猜你喜欢
        • 2021-09-17
        • 2012-04-28
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 2018-12-07
        • 2016-08-15
        • 2020-02-01
        相关资源
        最近更新 更多