有没有办法在过去应用合并所做的更改?

时间:2017-10-16 09:35:32

标签: git github merge git-merge

我不得不将合并恢复到主分支,因为分支包含一些不需要的更改。然而,该分支还包含许多我需要修改的更改。有没有办法将这个合并添加到主服务器的所有更改应用到我当前的分支中,并决定我想要进行哪些更改以及哪些更改会被遗漏?

提前致谢。

1 个答案:

答案 0 :(得分:0)

与往常一样,您可以选择合并,或者还原合并的还原。如果您选择合并,则必须提供父编号,与提供父编号的方式相同,以便还原合并。

如果您不希望提交结果,即使cherry-pick或revert命令自己成功,您也可以告诉命令不要执行提交步骤。或者,您可以允许提交,然后使用git reset --soft HEAD^git reset --soft HEAD~1将当前分支向后移动一步 - 几乎与删除提交本身相同 - 而无需更改索引和工作树的内容一点都不。

(我说"几乎相同"因为提交仍然存在,默认情况下受保护至少30天,因为它的哈希ID至少存储在reflog条目中。)

替代

然而,这可能不是最明智的整体策略。

假设你有类似的东西:

...--o--o-----*---------M--F--W--G--H   <-- mainline
         \             /
          A--B--C--D--E   <-- feature

其中M是错误合并,A--B--C--D--E是用于尝试生成某些功能的原始提交链。提交W是合并M的恢复(w有点颠倒),也可能有其他各种提交,例如F到{{1} }。

什么提交H /当然是合并 - 是它根据差异对其第一个父(M,上面)进行更改从*的合并基础父项到最后一个A提交feature。因此,它引入了一系列变化,您现在发现大量的变化都是错误的。提交E引入了另一大组更改:完全撤消W

如果你现在还原M或挑选W,你会得到另一大组修改。如果你在没有提交(或退出)的情况​​下这样做,你可以通过乱搞工作树来选择性地应用或撤消这些更改(可能使用你的索引这样做,或者只是完全手动)然后M修改后的大变更和承诺。但是,这会在您的新提交git add中为您提供另一大块更改:

I

上次时间你添加了大量的更改,这是错误的。也许以一种方式逐步引入变化是一个好主意,每个变化都是可以单独测试的,而不是...--o--o-----*---------M--F--W--G--H--I <-- mainline \ / A--B--C--D--E <-- feature 序列。

事实上,这个序列可能是一个很好的起点。假设您要将A-B-C-D-E序列中的每个提交复制(但已更正)提交:A-B-C-D-E,然后是{{1} },然后是A',依此类推。如果B'本身是正确的 - 如果所有问题都在,例如,C'然后再将其复制:

A

重复B A' <-- feature.1 / ...--o--o-----*---------M--F--W--G--H <-- mainline \ / A--B--C--D--E <-- feature

B

现在你有一个正确的(并经过测试)修改过的功能分支,你可以照常合并:

E

此时不需要任何特殊内容, A'-B'-C'-D'-E' <-- feature.1 / ...--o--o-----*---------M--F--W--G--H <-- mainline \ / A--B--C--D--E <-- feature 分支完全可以在新添加的功能中找到任何错误,这些错误仅与名称和意图相关(但是最初添加的错误功能,不提交哈希值。

事实上,既然您已了解它,那么您可能已经已使用 A'-B'-C'-D'-E' <-- feature.1 / \ ...--o--o-----*---------M--F--W--G--H---------------M' <-- mainline \ / A--B--C--D--E 查找 feature.1引入了哪些内容错误,所以如果您可以通过git bisect整合A-B-C-D-E来生成AE(还没有合并),那么您可以运行{{1然后放入明智的A'来修复它们,或者使用Git的自动壁球/自动修复功能。

你需要的只是&#34; en masse copy&#34;操作......事实证明,已经内置于E' ,作为git rebase -i选项,如here所述。