我有一些分支:分支1和分支2.它们来自主分支。现在主分支发生了一些变化。一个是关键的错误修正,必须在分支1和2上导入。但是有一个更改(或者可能是多个)不应该在其他分支上导入。
GIT世界如何解决这个问题?
我提出的一个想法是在对主分支进行其他更改之前创建错误修复分支。如果您回到历史记录中并且您知道此时分支1和2使用的代码库与主分支中的代码库相同,那么这将有效。
如果分支1和2包含不同版本的主服务器,但受影响的代码是相同的呢?
分支1:掌握v1.0
分支2:掌握v1.1
我无法将最新版本的master合并到其他分支中,因为有些更改,分支不应该得到。是否应该在每个分支进行更改?
答案 0 :(得分:2)
合并而不是樱桃挑选!
cherry-pick
在您的分支上进行新的提交,并且该提交不会引用最初创建错误修复的位置,隐藏实际历史记录。此外,错误修复可能是几个提交,或未来进一步开发(例如,它没有真正修复它第一次)。这使cherry-pick
不方便。
我更喜欢merge
错误修复分支。当你在master上创建bugfix提交时,你肯定有一个分支吗?
$ git checkout master
$ git checkout -b bugfix_1234
... work work work
$ git commit -a -m"Fix the bug blablabla"
... oh snap, I forgot to clean blublu. Work work work
$ git commit -a -m"Clean blublu"
... test, it's fine, merge to master
$ git checkout master
$ git merge bugfix_1234 --no-ff
... mmm, my branches 1 and 2 also need the change
$ git checkout branch_1
$ git merge bugfix_1234
$ git checkout branch_2
$ git merge bugfix_1234
完成!这样做的好处是你没有重复的提交做同样的事情。您的历史记录还反映了您实际执行的操作,在分支机构上工作,将其更改集成到其他分支机构。
如果您不再拥有分支bugfix_1234
,则可以随时重新创建一个或带注释的标记。
查看this git workflow中的红点,它正是它正在做的事情。
编辑:根据您在其他答案中的评论,您需要将您的错误修正(工作流程中的修补程序)基于分支和母版的共同祖先。如果修复既适用于分支和主分支,那么无论如何它都是有意义的。
答案 1 :(得分:1)
你想要从master
分支出来进行错误修复是个好主意。修复之后,您将要合并而不是挑选bug
到不同的分支:
git checkout branch1
git merge bug
git checkout branch2
git merge bug
git checkout master
git merge bug
这样,当你稍后将master
合并到其中一个分支中时,git会知道已经合并了什么。如果你做了一个樱桃选择,git就不会知道这些变化来自哪里,你可能会遇到冲突。
顺便说一下,你可能想看看Git flow;它很好地解决了这些问题。
答案 2 :(得分:0)
你可以这样做。
进入您要应用提交的分支。
git checkout branch-name
执行以下git命令:
git cherry-pick <commit-hash>