所以这是一个很大的问题。我创建了如下所述的分支更改分支,我需要将1.3.6和1.4.1中的更改合并到此分支中。现在的问题是我想有选择地合并更改。我不希望从1.3.6的所有更改变为更改分支。我该怎么做这个?
这是结构
master
|- track1
|- track2
|---|- msr-657
|---|---|--1.4.1
|---|---|--change-branch
|- track3
|---|-- 1.3.6
答案 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
分支以及您希望历史最终看起来如何。