Update 2022: git checkout -p <other-branch>
is basically a shortcut for all this.
FYI This was written in 2010, though I guess people still find it useful at least as of 2021. I haven't had to do it ever again, so if it goes out of date I probably won't know.
Example: You have a branch refactor
that is quite different from master
. You can't merge all of the
commits, or even every hunk in any single commit or master will break, but you have made a lot of
improvements there that you would like to bring over to master.
Note: This will not preserve the original change authors. Only use if necessary, or if you don't mind losing that information, or if you are only merging your own work.
On master:
> git co -b temp
On temp:
> git merge --no-commit --no-ff refactor
… which stages everything, so:
> git reset HEAD
Then begin adding the pieces you want:
> git add --interactive
The following is from an actual merge.
staged unstaged path
1: unchanged +1/-1 deploy_settings.py
2: unchanged +4/-3 requirements.txt
3: unchanged +2/-1 settings/defaults.py
4: unchanged +1/-1 settings/production.py.example
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
Choose p
for patch.
staged unstaged path
1: unchanged +1/-1 deploy_settings.py
2: unchanged +4/-3 requirements.txt
3: unchanged +2/-1 settings/defaults.py
4: unchanged +1/-1 settings/production.py.example
Patch update>>
Enter the number next to the file you want to process first. You can keep entering numbers until you've selected all the files, or you can do them one at a time. An asterisk will appear next to the files you select.
When you are finished selecting files, press 'enter' without entering a number (or anything) to continue to the next step.
You will see a single diff hunk and it will ask you whether to stage it or not.
diff --git a/deploy_settings.py b/deploy_settings.py
index 9b110f4..c5b228e 100644
--- a/deploy_settings.py
+++ b/deploy_settings.py
@@ -4,7 +4,7 @@ This file holds the Fabric deployment settings for this project
from fabric.state import env
#env.project = 'my_project' #The name of this project
-#env.repo_base = '[email protected]:%s.git' % env.project
+#env.repo_base = '[email protected]:%s.git' % env.project
Stage this hunk [y,n,q,a,d,/,e,?]?
Enter y
to stage or n
to skip. This will go on for every diff hunk in the selected files until you get back to:
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
You can enter s
to see what you changed
staged unstaged path
1: unchanged +1/-1 deploy_settings.py
2: +4/-3 nothing requirements.txt
3: +2/-1 nothing settings/defaults.py
4: unchanged +1/-1 settings/production.py.example
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
You can quit now, so enter q
, Then do some status and diff commands to explore the staged vs unstaged changes and make sure it looks like you expected.
Don't forget to git add
any untracked files as appropriate.
Commit the staged changes:
> git commit -m "merged selected patches from refactor branch"
# don't do commit -a here… you only want to commit the staged changes
Revert the unstaged changes
> git checkout .
And finally, merge to master:
> git checkout master
> git merge temp
> git branch -D temp
@rakisomaiah
Step 1: Switch to the branch you want to merge with, for example, dev_target_branch
Step 2: Merge a branch with dev_target_branch, for example, dev_another_branch
git merge --no-commit --no-ff dev_another_branch
Step 3:
In IDEA, go to Project -> Git, click 'Commit Directory...'. Only choose those files/directories you want to commit, then Commit.
Step 4:Override those files/directories you don't want to commit.
git checkout -- files_or_directories_you_do_not_want_to_commit
Step 5:Commit and push partial commits
Step 6:
In IDEA, merge origin/master with dev_target_branch, then commit and push.
After a few days, I found some codes in files_or_directories_you_do_not_want_to_commit no in the branch dev_another_branch.
Unfortunately, I can't reproduce this issue according above steps. I don't know exactly why this happens.