Commit a change to more than one branch in Git

2019-05-01 11:24发布

问题:

Typical usage scenario:

I have master, branch_foo and branch_bar. All are up to date. Now, I do a "git checkout master" and work on a bug fix.

Lets say that fix was on a tracked file that is in the same state on all branches - ie. before the fix, a diff of the file from each branch results in no differences.

Is there a way to commit this fix to all branches?

回答1:

I expect git cherry-pick is what you want.

After committing the fix to the first branch, you can use git cherry-pick to merge it into each of the other branches.

This related question on SO may be of interest: Git & Working on multiple branches



回答2:

The common approach to this is "merging upwards". From man gitworkflows:

Always commit your fixes to the oldest supported branch that require them. Then (periodically) merge the integration branches upwards into each other.

This gives a very controlled flow of fixes. If you notice that you have applied a fix to e.g. master that is also required in maint, you will need to cherry-pick it (using git-cherry-pick(1)) downwards. This will happen a few times and is nothing to worry about unless you do it very frequently.

The first method is of course preferred - it's good to have a commit in your repo only once, and to be able to see the history of how it got into each branch. Life isn't perfect, though, and you'll sometimes find yourself in the second category. If that situation becomes common enough, you could perhaps write a script like

multi-cherry-pick <commit> <branch> [<branch>...]

which checks out each branch in turn and cherry-picks the given commit.



回答3:

Yes, there is. Make this commit on separate topic (feature) branch (branching off oldest branch / earliest state), and then merge this topic branch into any branch you want.

This workflow is described for example in Never merging back blog post by Junio C Hamano (maintainer of Git).

That is roughly what Jefromi wrote wrote