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

时间:2016-05-12 21:44:23

标签: git github git-merge

所以这是一个很大的问题。我创建了如下所述的分支更改分支,我需要将1.3.6和1.4.1中的更改​​合并到此分支中。现在的问题是我想有选择地合并更改。我不希望从1.3.6的所有更改变为更改分支。我该怎么做这个?

这是结构

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

2 个答案:

答案 0 :(得分:2)

git cherry-pick 是最简单的。你可以 git cherry-pick 你想要的任何提交到当前的HEAD中。你也可以尝试 git cherry-pick A..B 来挑选从A的孩子到B的所有提交。

git rebase 也足以完成这项工作,但它有点棘手和令人困惑。

答案 1 :(得分:1)

您有四种方法:使用带有merge标记的--no-commit命令,使用revert后的merge,选择性rebase或{ {1}}。

cherry-pick合并可能是保留历史记录的最佳方法,但由于您需要在提交之前手动回滚更改,因此这将是更多工作。

另一个选项是--no-commit,然后使用merge选择revert进行更改。但这只会让历史变得更加混乱。

如果您不关心历史是“纯粹的”,您可以简单地使用git revert,但这只能在您尚未将更改推送到公共仓库时安全地工作(如果您正在工作)与其他人一起)或者你从一个扔掉的分支做退缩。你会做这样的事情:

rebase

这会git rebase --interactive master 1.3.6 rebase对主人的更改,但会先让您选择要保留,编辑或忽略的提交。我很确定它会删除你正在做1.3.6的任何分支,所以你应该在rebase之前在1.3.6的同一个地方再做一个扔掉分支,然后make { {1}}指向与throw away分支相同的提交,然后最终删除throw away分支。

使用rebase允许您有选择地合并提交,但不明确记住父项。如果master分支保存在原始仓库中,那么由于您仍然拥有某个历史记录而没有两个合并父项并不是一件非常重要的事情,并且cherry-pick可以自动引用提交编号说明。这会产生一种不纯的历史,就像选择性1.3.6那样。

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