【问题标题】:Reverting an old merge commit files without effecting subsequent commits恢复旧的合并提交文件而不影响后续提交
【发布时间】:2020-06-28 23:24:18
【问题描述】:

我需要从主分支恢复一个非常旧的合并提交。

问题是,我不希望恢复操作影响从那时起在主分支上所做的其他更改。

据我所知,如果我使用:

git revert -m 1 [哈希合并提交]

它会恢复到合并提交的父提交,并会删除所有后来添加的更改。

合并提交涉及多个文件。

除了逐个文件之外,有没有办法通过 git 中的内置命令来实现这一点?

【问题讨论】:

    标签: git git-merge git-revert


    【解决方案1】:

    您可以交互地变基,从合并提交之前的提交开始,然后删除该合并提交的提交。

    让我们从某个分支 feature/rebase-test 获取这段历史记录:

    * 1ff3147 - (tag: v0.4.3, origin/master, origin/HEAD, master) Add test to show URLs with port work
    * a686fbf - (tag: v0.4.2) Enable setting custom RequestHandler
    * f682d20 - Add php 7.4 to Travis
    * 0973364 - Make code coverage script CLI runnable
    * cb106fc - Add composer.phar to gitignore
    *   1d89b5e - (tag: v0.4.1) Merge pull request #62 from mvdbos/fix/event-dispatcher
    |\
    | * 3376b9c - Revert to the legacy EventDispatcher
    |/
    * f761a2c - Update README badges
    *   b8447e6 - (tag: v0.4) Merge pull request #60 from mvdbos/feature/cleanup
    |\
    | * e278cde - Simplify build and clean up use statements
    |/
    *   ac6af67 - Merge pull request #59 from mvdbos/feature/update-scrutinizer
    

    现在假设我要删除 b8447e6(因此要删除 e278cde,这是合并提交的一部分)。

    我可以做到git rebase --rebase-merges --onto ac6af67 f761a2c feature/rebase-test)。 这将从f761a2c 向前移动直到feature/rebase-test 的尖端,并将其重新定位到ac6af67,这是我们想要摆脱的合并之前的提交。

    在我的情况下,这导致了一些冲突,在解决之后,我的历史看起来像这样:

    * d7e5919 - (HEAD -> feature/rebase-test) Add test to show URLs with port work
    * 0d8e15f - Enable setting custom RequestHandler
    * ce365b0 - Add php 7.4 to Travis
    * 42d6f59 - Make code coverage script CLI runnable
    * ad0c861 - Add composer.phar to gitignore
    *   3292f4c - Merge pull request #62 from mvdbos/fix/event-dispatcher
    |\
    | * 3e2ceef - Revert to the legacy EventDispatcher
    |/
    *   ac6af67 - Merge pull request #59 from mvdbos/feature/update-scrutinizer
    

    请注意,合并提交已消失,后续提交的结构保持不变,包括合并提交。这是由于 rebase 命令的 --rebase-merges 标志。

    一个警告:您可能已经注意到,ac6af67 之后的所有提交都有一个新的哈希值(它们实际上是新的提交)。这意味着我们之前历史中存在的标签并不指向那些新的提交。它们仍然存在,所以不会被破坏。它们只是指向仍然包含您要删除的合并提交的历史记录。无法判断这是否会给您带来问题。

    【讨论】:

    • 谢谢!我不知道那个选项。最后我选择了 git revert。有一些冲突,但都解决了。
    猜你喜欢
    • 2017-07-14
    • 2012-04-28
    • 2018-11-29
    • 2016-06-23
    • 2015-10-08
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多