On Wednesday 04 June 2008, David wrote: > > rebase --onto? > > Thanks, I checked the manuals further, and it looks like this will > (mostly) do what I need. > > What's still missing is multiple cherry pick ;-) > > In other words, is there a simple way to *copy* a large number of > commits from one branch to another, without rebasing? Depends on you definition of "simple". Here are 5 commands that gets the job done in a (IMHO) conceptually simple way. Use git checkout -b [tmpBranch] [fromBranch] to create (and checkout) a _new_ branch pointing to the same commit as the "from"-branch. Then use git rebase --onto [toBranch] [fromBranchStart] [tmpBranch] to rebase all commits between [fromBranchStart] and [fromBranch] on top of [toBranch]. Since this was done with HEAD == [tmpBranch], the original [fromBranch] is not moved, and therefore *still* points to the old commits. [tmpBranch], however, have been moved to point at the rebased commits. This in effect *copies* the commits from [fromBranch] to [tmpBranch]. Now, all that remains is to reconcile [tmpBranch] and [toBranch], and finally remove [tmpBranch]: git checkout [toBranch] git merge [tmpBranch] git branch -d [tmpBranch] The merge should be a simple fast-forward without any conflicts. Here is an illustrated version of what's going on: Initial layout: G---H---I <---- [fromBranch] / A---B---C---D---E---F <-- [toBranch] ^----------------- [fromBranchStart] git checkout -b [tmpBranch] [fromBranch] G---H---I <---- [fromBranch] / ^------- [tmpBranch] A---B---C---D---E---F <-- [toBranch] ^----------------- [fromBranchStart] git rebase --onto [toBranch] [fromBranchStart] [tmpBranch] G---H---I <------------------- [fromBranch] / A---B---C---D---E---F---G'---H'---I' <-- [tmpBranch] ^ ^-------------------- [toBranch] --------------------------------- [fromBranchStart] git checkout [toBranch] git merge [tmpBranch] git branch -d [tmpBranch] G---H---I <------------------- [fromBranch] / A---B---C---D---E---F---G'---H'---I' <-- [toBranch] ^-------------------------------- [fromBranchStart] This should also work even if your commit graphs are considerably more complicated. If you need to drop/edit/squash any commits between [fromBranchStart] and [fromBranch], simply add a "--interactive" to the rebase command. Have fun! ...Johan -- Johan Herland, <johan@xxxxxxxxxxx> www.herland.net -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html