I have two branches (A and B) and I want to merge a single file from branch A with a corresponding single file from Branch B.
This question is related to
git
merge
git-branch
You could use:
git merge-file
Tip: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
You can checkout the old version of the file to merge, saving it under a different name, then run whatever your merge tool is on the two files.
eg.
git show B:src/common/store.ts > /tmp/store.ts
(where B is the branch name/commit/tag)
meld src/common/store.ts /tmp/store.ts
I will do it as
git format-patch branch_old..branch_new file
this will produce a patch for the file.
Apply patch at target branch_old
git am blahblah.patch
This uses git's internal difftool. Maybe a little work to do but straight forward.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
I came across the same problem. To be precise, I have two branches A
and B
with the same files but a different programming interface in some files. Now the methods of file f
, which is independent of the interface differences in the two branches, were changed in branch B
, but the change is important for both branches. Thus, I need to merge just file f
of branch B
into file f
of branch A
.
A simple command already solved the problem for me if I assume that all changes are committed in both branches A
and B
:
git checkout A
git checkout --patch B f
The first command switches into branch A
, into where I want to merge B
's version of the file f
. The second command patches the file f
with f
of HEAD
of B
. You may even accept/discard single parts of the patch. Instead of B
you can specify any commit here, it does not have to be HEAD
.
Community edit: If the file f
on B
does not exist on A
yet, then omit the --patch
option. Otherwise, you'll get a "No Change." message.
I found this approach simple and useful: How to "merge" specific files from another branch
As it turns out, we’re trying too hard. Our good friend git checkout is the right tool for the job.
git checkout source_branch <paths>...
We can simply give git checkout the name of the feature branch A and the paths to the specific files that we want to add to our master branch.
Please read the whole article for more understanding
The following command will (1) compare the file of the correct branch, to master (2) interactively ask you which modifications to apply.
git checkout --patch master
Assuming B is the current branch:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Note that this only applies changes to the local file. You'll need to commit afterwards.
Here's what I do in these situations. It's a kludge but it works just fine for me.
I tried patching and my situation was too ugly for it. So in short it would look like this:
Working Branch: A Experimental Branch: B (contains file.txt which has changes I want to fold in.)
git checkout A
Create new branch based on A:
git checkout -b tempAB
Merge B into tempAB
git merge B
Copy the sha1 hash of the merge:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <[email protected]>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Checkout your working branch:
git checkout A
Checkout your fixed-up file:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
And there you should have it. Commit your result.
git checkout <target_branch>
git checkout <source_branch> <file_path>
My edit got rejected, so I'm attaching how to handle merging changes from a remote branch here.
If you have to do this after an incorrect merge, you can do something like this:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
Source: Stackoverflow.com