8

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

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

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

4

4 回答 4

7

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

# 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...使用新提交重新创建主题分支,以便可以成功地重新合并

于 2012-08-10T19:27:47.983 回答
2

好吧,我终于以这种方式解决了。B我从(在我的示例中针对 master )创建了 diffI并手动应用了 meld difftool 中的所有更改:

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

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

于 2012-08-11T09:59:29.617 回答
1

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

如果您不介意还原提交,我强烈推荐它。这是得到你想要的最简单的方法。但是,如果 D、E、F、G、H 或 I 基于 B 的更改集,则还原可能会变得复杂。

于 2012-08-10T16:17:49.480 回答
1

假设 master 已签出

git branch temp <sha1 of B>

创建对旧提交的引用。

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

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

现在你只需要让你的 B 回来

git merge temp
于 2012-08-10T23:45:11.290 回答