Git bit of the day
Contents
Question from email:
how do I merge 1 file from master -> LIVE
Answer
You cannot. Merge operation creates new commit that has 2 or more parents and will always join full histories of the branches.
You can however:
- replicate all changes done in single commit to different branch - this is “cherry pick”
- take state of single file from different branch into current branch
How to replicate all changes done in single commit to different branch - “cherry pick”
Say you have latest commit in master that contains change to two files you need.
1.) You go to target branch - LIVE, make sure you have clean work tree
git checkout LIVE git status => should show no changes
2.) “cherry pick” the commit from master
git cherry-pick master
This will create new commit on LIVE that has same author, message etc as latest commit on master.
Only the files modified in the commit will be touched - and the state of these files will be identical to master
Note
You can use any TREE-ISH expression in cherry pick - tag name, branch name, remote branch name or SHA1
Cherry pick will cause that “logically” same commit will exist twice in the project history (with different SHA1)
Overuse may cause harder to understand project histories
How to take state of single file from different branch into current branch
Use case: I need exact version of the file ‘src/com/something/Important.java’ from master to LIVE
Manual (stupid) version - DO NOT DO THAT
The only reason I mention this because I have seen people doing it,
- 1). Go to master -
git checkout master
- 2). save file to temp -
cp 'src/com/something/Important.java' /tmp
- 3). Go to live -
git checkout LIVE
-
- copy file back -
cp /tmp/Important.java src/com/something/
- copy file back -
-
- Add and commit file -
git add 'src/com/something/Important.java'; git commit -m "Copied file from master'
- Add and commit file -
Useful way
If you specify file path in ‘git checkout’, it will get only that file(s) and will also add these files to index - ready for commit
1). Go to destination branch - LIVE
git checkout LIVE
- get the file from master
git checkout master – src/com/something/Important.java
Now you can validate with git status that the file is modified and ready to committed
- Commit
git commit -m “Copied file from master'
Difference between cherry-pick and the single file transfer
The end effect of cherry pick for commit with single file and the second way is the same: the file in LIVE has same content as in master.
Difference is that the second way does not indicate in any way that the file status is actually the same (commit has different author and no relation to original commit), while using cherry-pick this information is copied.
Nothing prevents you using the second approach for multiple file (as part of single commit) by repeating checkout – multiple times.
Both will make the history of the project a bit messier. Please always consider whether merge is not an option.
Author Miro Adamy
LastMod 2014-09-22
License (c) 2006-2020 Miro Adamy