如何在不丢失提交历史的情况下合并?

问题描述:

所以这是一个很大的问题。我创建了如下所述的分支更改分支,我需要将1.3.6和1.4.1的更改合并到此分支中。现在问题是我想要选择性地合并更改。我不希望从1.3.6到更改分支的所有更改。我如何去做这件事?如何在不丢失提交历史的情况下合并?

这是结构

master 
|- track1 
|- track2 
|---|- msr-657 
|---|---|--1.4.1 
|---|---|--change-branch 
|- track3 
|---|-- 1.3.6 
+1

听起来像一个'樱桃采摘'的工作。 – isherwood

+0

谢谢@isherwood –

您有四种方式:使用带有--no-commit标志merge命令,使用revert一个merge后,选择性rebase,或使用cherry-pick

--no-commit合并可能是保留历史记录的最佳选择,但它会更好,因为在提交之前需要手动回滚更改。

另一种选择是merge,然后选择revert更改使用git revert。但这只会让历史更加混乱。

如果你不关心历史是“纯粹”的,你可以简单地使用rebase,但是这只有在你还没有将你的修改推到普通回购(如果你和他人一起工作)或者你从一个扔掉的分支进行重新分配。你会做这样的事:

git rebase --interactive master 1.3.6 

rebase更改到主从1.3.6,但会首先让你选择哪一个致力于保存,编辑,或忽略。我很确定它会删除你正在做rebase的任何分支,所以你应该在rebase之前在1.3.6的同一个地方做另一个分支,然后使master指向与throw out分支相同的提交,然后最后删除扔掉的分支。

使用cherry-pick可让您有选择地合并提交,但无需明确记忆父母。如果1.3.6分支保留在原始回购中,因为您仍然有某个历史记录,所以没有合并父母并不是一件大事,并且cherry-pick可以自动引用说明中的提交编号。这会产生像选择性rebase那样的不纯历史。

最后,这取决于您是否在保留1.3.6分支,以及您希望历史最终看起来如何。

git cherry-pick是最简单的。你可以git cherry-pick你想要进入当前HEAD的任何提交。你也可以尝试git的樱桃挑选A..B樱桃采摘所有从A的孩子提交给B.

git的变基也强大到足以做的工作,但它是一个有点棘手和混乱。