如何在不包括之前提交的情况下在所有其他分支中导入 master 的错误修复?
How to import bugfix of master in all other branches without including the commits before?
我有一些分支:分支 1 和分支 2。它们起源于 master 分支。现在 master 分支发生了一些变化。一个是关键错误修复,必须在分支 1 和 2 上导入。但是有一个更改(或可能是多个)不应在其他分支上导入。
GIT 世界如何解决这个问题?
我想到的一个想法是在对 master 分支进行其他更改之前创建 bugfix 分支。如果您回顾历史并且您知道此时分支 1 和 2 使用与 master 分支中相同的代码库,这将起作用。
如果分支1和分支2包含不同版本的master,但受影响的代码相同怎么办?
分支 1:大师 v1.0
分支 2:master v1.1
我无法将master的最新版本合并到其他分支中,因为有变化,分支还不应该得到。是否应该在每个分支中进行更改?
你可以这样做。
进入你想要应用提交的分支。
git checkout branch-name
执行以下 git 命令:
git cherry-pick <commit-hash>
合并而不是挑选!
cherry-pick
在您的分支上进行新的提交,并且该提交不涉及最初创建错误修复的位置,隐藏了实际历史。此外,错误修复可能是多次提交,或者在未来有进一步的发展(比如,第一次并没有真正修复它)。这使得 cherry-pick
不方便。
我更愿意 merge
错误修复分支。当您在 master 上创建错误修复提交时,您肯定在那里有一个分支吗?
$ 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 中的红点,这正是它在做什么。
编辑:根据你在另一个答案中的评论,你需要你的错误修复(工作流程中的修补程序)基于分支和主人的共同祖先。如果修复同时适用于分支和母版,那么它还是有意义的。
您从 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;它很好地解决了这些问题。
我有一些分支:分支 1 和分支 2。它们起源于 master 分支。现在 master 分支发生了一些变化。一个是关键错误修复,必须在分支 1 和 2 上导入。但是有一个更改(或可能是多个)不应在其他分支上导入。
GIT 世界如何解决这个问题?
我想到的一个想法是在对 master 分支进行其他更改之前创建 bugfix 分支。如果您回顾历史并且您知道此时分支 1 和 2 使用与 master 分支中相同的代码库,这将起作用。
如果分支1和分支2包含不同版本的master,但受影响的代码相同怎么办?
分支 1:大师 v1.0
分支 2:master v1.1
我无法将master的最新版本合并到其他分支中,因为有变化,分支还不应该得到。是否应该在每个分支中进行更改?
你可以这样做。
进入你想要应用提交的分支。
git checkout branch-name
执行以下 git 命令:
git cherry-pick <commit-hash>
合并而不是挑选!
cherry-pick
在您的分支上进行新的提交,并且该提交不涉及最初创建错误修复的位置,隐藏了实际历史。此外,错误修复可能是多次提交,或者在未来有进一步的发展(比如,第一次并没有真正修复它)。这使得 cherry-pick
不方便。
我更愿意 merge
错误修复分支。当您在 master 上创建错误修复提交时,您肯定在那里有一个分支吗?
$ 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 中的红点,这正是它在做什么。
编辑:根据你在另一个答案中的评论,你需要你的错误修复(工作流程中的修补程序)基于分支和主人的共同祖先。如果修复同时适用于分支和母版,那么它还是有意义的。
您从 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;它很好地解决了这些问题。