tags:

views:

49

answers:

2

After invoking git merge --no-commit <commit>, performing a commit will result in a merge commit with two (or more) parents. What command to invoke to create a simple commit instead (without having to re-perform the merge command with the --squash option)?

A: 

You could try a git merge --squash.

See the question "In git, what is the difference between merge --squash and rebase?"

from:

      X                   stable
     /                   
a---b---c---d---e---f---g dev

to:

      X-------------------G stable
     /                   
a---b---c---d---e---f---g dev

It will produced a squashed commit on the destination branch, without marking any merge relationship.

VonC
Thanks. I know about the squash-option (see the text in braces), but how to change my Index/Working Tree state *after* I have performed git-merge without the squash option to not create a merge commit?
mklhmnn
+2  A: 

According to the git-merge man page, the --squash option does not record $GIT_DIR/MERGE_HEAD. $GIT_DIR/MERGE_HEAD is responsible for creating merge commits; you can see this in the Git sources, file builtin/commit.c:

in_merge = file_exists(git_path("MERGE_HEAD"));
...
if (in_merge) {
... // Perform merge_commit
}

Solution: after having performed a normal merge, simply get rid of $GIT_DIR/MERGE_HEAD to avoid getting a merge commit. You may manually clean up $GIT_DIR/MERGE_MSG and $GIT_DIR/MERGE_MODE as well or leave this task up to Git upon successful commit.

Marc Strapetz