'Git merge without auto commit
Is it possible to do a git merge, but without a commit?
"man git merge" says this:
With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.
But when I try to use git merge with the --no-commit it still auto-commits. Here's what I did:
$> ~/git/testrepo$ git checkout master
Switched to branch 'master'
$> ~/git/testrepo$ git branch
* master
v1.0
$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
file1 | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
A subsequent git log reveals all the commits from the v1.0 branch merged into master.
Solution 1:[1]
You're misunderstanding the meaning of the merge here.
The --no-commit prevents the MERGE COMMIT from occuring, and that only happens when you merge two divergent branch histories; in your example that's not the case since Git indicates that it was a "fast-forward" merge and then Git only applies the commits already present on the branch sequentially.
Solution 2:[2]
If you only want to commit all the changes in one commit as if you typed yourself, --squash will do too
$ git merge --squash v1.0
$ git commit
Solution 3:[3]
I prefer this way so I don't need to remember any rare parameters.
git merge branch_name
It will then say your branch is ahead by "#" commits, you can now pop these commits off and put them into the working changes with the following:
git reset @~#
For example if after the merge it is 1 commit ahead, use:
git reset @~1
Note: On Windows, quotes are needed. (As Josh noted in comments) eg:
git reset "@~1"
Solution 4:[4]
When there is one commit only in the branch, I usually do
git merge branch_name --ff
Solution 5:[5]
You could also do
git cherry-pick <commit hash>
for each commit if you want to preserve the commit history...
I'm not really seeing a "nice" way to merge multiple commits from another branch with the git merge command without it adding a merge commit at some point (i.e. only having the commits you want to include)
Solution 6:[6]
Old question with many answers, but this is too big for a comment.
As another answer mentioned, merging v1.0 into master resulted in a fast-forward merge. In fact, there really was no merge. The v1.0 tag had a commit whose parent commit was the tip of master. Got just advanced the pointer for master ahead one commit.
If doing that introduces an bad merge, what you *really" gave us a bad commit at the v1.0 tag.
The more appropriate solution is to do the fast forward merge of v1.0 into master, the add a commit to master correcting the bad code. After that either delete the v1.0 tag and recreate it, or retag v1.0 and force push the tag. Better yet, create a v1.0.1 tag from the commit that fixes v1.0.
Every other answer points you too the wrong solution from a coding standpoint.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | pfabri |
| Solution 2 | Adrian Li |
| Solution 3 | Will Ediger |
| Solution 4 | Sithu |
| Solution 5 | Adam Dunmars |
| Solution 6 | Greg Burghardt |
