I'm using git on a new project that has two parallel -- but currently experimental -- development branches:
master
: import of existing codebase plus a few mods that I'm generally sure ofexp1
: experimental branch #1exp2
: experimental branch #2
exp1
and exp2
represent two very different architectural approaches. Until I get further along I have no way of knowing which one (if either) will work. As I make progress in one branch I sometimes have edits that would be useful in the other branch and would like to merge just those.
What is the best way to merge selective changes from one development branch to another while leaving behind everything else?
Approaches I've considered:
git merge --no-commit
followed by manual unstaging of a large number of edits that I don't want to make common between the branches.Manual copying of common files into a temp directory followed by
git checkout
to move to the other branch and then more manual copying out of the temp directory into the working tree.A variation on the above. Abandon the
exp
branches for now and use two additional local repositories for experimentation. This makes the manual copying of files much more straightforward.
All three of these approaches seem tedious and error-prone. I'm hoping there is a better approach; something akin to a filter path parameter that would make git-merge
more selective.
There is another way do go:
It is a mix between
git checkout
andgit add -p
and might quite be exactly what you are looking for:I know I am a little late but this is my workflow for merging selective files.
I had the exact same problem as mentioned by you above. But I found this git blog clearer in explaining the answer.
Command from the above link:
I found this post to contain the simplest answer. Merely do:
Example:
See the post for more info.
I had the exact same problem as mentioned by you above. But I found this clearer in explaining the answer.
Summary:
Checkout the path(s) from the branch you want to merge,
Hint: It also works without
--
like seen in the linked post.or to selectively merge hunks
Alternatively, use reset and then add with the option
-p
,Finally commit
If you don't have too many files that have changed, this will leave you with no extra commits.
1. Duplicate branch temporarily
$ git checkout -b temp_branch
2. Reset to last wanted commit
$ git reset --hard HEAD~n
, wheren
is the number of commits you need to go back3. Checkout each file from original branch
$ git checkout origin/original_branch filename.ext
Now you can commit and force push (to overwrite remote), if needed.