我的存储库中有两个分支(出于此问题的目的):master
和performance_testing
。我收到了master
分支的更改。我也需要将它们放入performance_testing
。我需要保持两个分支存在和分离,因此合并是不合适的。我想我可以在一个分支中引入更改并提交,然后在另一个分支中执行相同的操作。但这似乎容易出错,我认为git可以通过某种方式更直接地做到这一点。我该怎么做呢?
答案 0 :(得分:4)
在这种情况下,您通常要做的是cherry picking,其中只涉及将一个分支的提交子集应用到另一个分支。
例如,您在A
上提交了B
,C
,D
,E
,F
,master
并且您希望将提交B
,C
和D
带入performance_testing
:
git checkout performance_testing
git cherry-pick B^..D
或者您可以在多个单独的cherry-pick命令中列出单个提交。当您不一定需要连续的一系列提交时,这非常有用。例如:
git cherry-pick B D
请注意,B在历史记录中 D之前。
有关详情,请参阅:How to cherry-pick multiple commits(其中还包括一些我不会在这个答案中挖掘的优秀图表)。
是的,有很多不同的选择可供选择。这是一个基本且通用的解决方案,读者可以选择应用,因为他们了解它是如何工作的。 git rebase --onto
是另一种选择,不同的分支管理也是如此,但如果没有非常具体的情况,采摘樱桃应该获得最多的里程。
答案 1 :(得分:2)
最好的方法是为更改创建功能分支,并在master
和performance_testing
结束时将其合并。樱桃采摘被认为是一种反模式。
要创建要素分支,首先要找到2个分支的最新共同祖先:
git merge-base master performance_testing
然后使用上一个命令的输出创建feature_branch
:
git branch feature_branch <output of merge-base command>
切换到feature_branch
分支,进行更改并在master
和performance_testing
的最后合并。
如果您更改了2个分支中的相同文件,则会发生冲突。这是不可避免的,即使采摘樱桃,但很容易解决。
这种方法优于采摘樱桃的优势在于,您将获得一个统一的日志,并在两个分支上使用相同的提交哈希值。
答案 2 :(得分:1)
您可以使用git cherry-pick
将一个或多个提交(副本)应用到新分支。
新提交将“与原件具有相同的效果(相同的差异,相同的消息等),但在其他方面是独立的。”
答案 3 :(得分:1)
我需要保持两个分支存在并分开,因此合并是不合适的。
这不一定遵循;在合并之后,两个分支仍然存在并且仍然是分开的。合并不合适的情况是,每个分支当前包含不能在另一个分支中的变化。
当您说“收到master
分支的更改”时,这究竟是什么意思?如果您的意思是有人将更改推送到origin/master
,那么这会限制您的选择。什么是最好的解决方案(在master
和performance_testing
之间的合并基础创建分支,在那里应用更改,然后将该分支合并到master
和{{1}由于需要进行影响已经共享的提交的历史记录重写(以删除对performance_testing
的更改的直接应用),会变得复杂。
如果更改直接应用于master
,并且master
包含无法进入master
的更改:那么除非可以接受协调历史记录重写,否则您的剩余选项可能是樱桃 - 挑选变化。在我看来,经常推荐采用方式进行挑选,并且有明显的缺点,但如果你排除了所有其他解决方案,那么这就是剩下的。