如何在不丢失提交历史的情况下合并?
所以这是一个很大的问题。我创建了如下所述的分支更改分支,我需要将1.3.6和1.4.1的更改合并到此分支中。现在问题是我想要选择性地合并更改。我不希望从1.3.6到更改分支的所有更改。我如何去做这件事?如何在不丢失提交历史的情况下合并?
这是结构
master
|- track1
|- track2
|---|- msr-657
|---|---|--1.4.1
|---|---|--change-branch
|- track3
|---|-- 1.3.6
您有四种方式:使用带有--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的变基也强大到足以做的工作,但它是一个有点棘手和混乱。
听起来像一个'樱桃采摘'的工作。 – isherwood
谢谢@isherwood –