将旧的 git commit 与 master 的 HEAD 合并



我在合并同事的提交时犯了一些错误。现在,我们已经发现了它,我们需要再次应用旧提交,以手动选择文件中的更改。情况如下所示:

A--       /--F--
    C--D--E       H--I
B--/^      --G--/   ^
    |                |
WRONG MERGE       MASTER

我需要 git 再次要求我将 B 与 I 合并,就像 B 在历史上从未出现过一样。换句话说,我需要 git 要求我为所有在 B 中不同的文件选择合并,并且我提交。做这样的事情的最佳方法是什么?我可以通过樱桃采摘来实现这一点吗?如何?

您可以使用提交复制技巧:

# make a branch named B started on the commit B
git checkout -b B <sha1 id of the commit B> 
# it creates a branch which starts at a commit
# right before B and has exact copy of commit as B,
# but with a different sha1 id.
git rebase --no-ff HEAD~1
# now we do simple merge
git checkout master
git merge B

它还允许使用提交范围并保留日期,作者,提交消息等。

实际上,文档中描述了您的方案:

--no-ff......使用新提交重新创建主题分支,以便可以成功重新合并

好吧,我终于解决了这个问题。我从B创建了差异(针对 master,在我的示例中I),并在 meld difftool 中手动应用所有更改:

[master]$ yes | git difftool <B hash> -t meld

然后,添加所有更改的文件并提交。

您可以使用

git revert -m 1 <commit>还原有问题的合并提交,然后再次使用git merge <B_branch>。这会将还原提交添加到您的历史记录中。否则,您可以使用git rebase -i从历史记录中删除 B 的提交。后者对协作工作的破坏性更大,因为所有 WIP 和所有协作者现在都必须重置其master分支。

如果您不介意还原提交,我强烈建议您这样做。这是获得所需内容的最简单方法。但是,如果 D、E、F、G、H 或 I 基于 B 的更改集,则还原可能会变得复杂。

假设主控已签出

git branch temp <sha1 of B>

创建对旧提交的引用。

git rebase --preserve-merges -i <sha1 of A>

然后取出应该是合并提交的第一行。

现在,您所需要的只是取回您的 B

git merge temp

相关内容

  • 没有找到相关文章

最新更新