还原不在当前分支

时间:2017-11-09 08:32:20

标签: git git-revert

我有两个分支:主人和特色。

• master
• feature

我在功能分支上做了两次提交

• master
• C1 • C2 • feature

现在,我想在master中合并feature。我使用git merge --squash feature进行合并。

• C3 • master     // C3 is the squashed commit
• C1 • C2 • feature

目前,有没有办法将C1从主人身上还原?

一种选择是在功能上恢复C1,然后在主设备中再次压缩合并功能。

1 个答案:

答案 0 :(得分:3)

是的,您可以使用merge --squash恢复某些提交,即使包含在聚合中git-revert通过识别您标识的提交中引入的更改,然后创建一个撤消("还原")这些更改的新更改来工作。

它使用三向合并算法来执行此操作 - 使用提交恢复为基础,然后与提交的祖先和当前提交(HEAD)进行比较。这将隔离仅在该提交中引入的更改。

要查看一个非常人为的示例,假设您有一些文件有三处更改(C0C1C2),这些是每个文件的内容版本:

| C0    | C1    | C2    |
|-------|-------|-------|
| one   | one   | one   |
| two   | 2     | 2     |
| three | three | three |
| four  | four  | FOUR  |

现在,如果您要还原C1,我们会设置一个三向合并作为基础,C0C2作为每一方进行更改。

在三向合并算法中,与基础相比,您可以查看每一侧。如果所有三行都相等,则将该行放入未修改的结果中。如果一个侧进行了更改,则将更改的行添加到结果中。 (如果两个方在同一行上进行了更改,则将该行标记为冲突。)

设置还原可以:

base     sides     result
----     -----     ------
         one
       / two   \
      /  three  \
one  /   four    \ one
2                  two
three              three
four \   one     / FOUR
      \  2      /
       \ three /
         FOUR

您可以看到撤消 C1中引入的更改的结果(在右侧),因为其中一方(C0,在此case)是唯一的,所以它的变化保留在结果中。这具有撤消("还原")其中引入的更改的逻辑效果。

  

即使你做了一次压缩合并,这也是真的 - 在这种情况下,它会查看存储库的内容。 CM实际上C1作为共同的祖先并不重要。

您可以在包含这些内容的简单存储库中向您自己证明这一点。即使在南瓜合并之后:

commit 9e7497c7ae34aa35cdb7d7b965a00d56bf0b9dfa
Author: Edward Thomson <ethomson@edwardthomson.com>
Date:   Thu Nov 9 10:20:31 2017 +0000

    Squashed commit of the following:

    commit 8a8a9e73e62e21683e15269d89e1fbfbbf35cfa1
    Author: Edward Thomson <ethomson@edwardthomson.com>
    Date:   Thu Nov 9 10:20:18 2017 +0000

        C2

    commit d984b27140e48c5faa8968364c415d29dcd7034c
    Author: Edward Thomson <ethomson@edwardthomson.com>
    Date:   Thu Nov 9 10:20:08 2017 +0000

        C1

您仍然可以正确还原其中一个组件。在这种情况下,我将还原C1

> git revert d984b27
[master 405f108] Revert "C1"
 1 file changed, 1 insertion(+), 1 deletion(-)

> git show HEAD
commit 405f1080e24504fa418d423a0755a2123b85ecd8 (HEAD -> master)
Author: Edward Thomson <ethomson@edwardthomson.com>
Date:   Thu Nov 9 10:20:42 2017 +0000

    Revert "C1"

    This reverts commit d984b27140e48c5faa8968364c415d29dcd7034c.

diff --git a/hello.txt b/hello.txt
index 9d980ae..14cf0bc 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,5 +1,5 @@
 Hello, world!
 one
-2
+two
 three
 four