Git: after preparing a real merge commit, how to create a simple commit?

瘦欲@ 提交于 2019-12-23 09:14:54

问题


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)?


回答1:


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.




回答2:


The best solution without any hackery in the .git directory is to use stashing and resetting.

>git merge --no-commit $otherbranch
>git stash
>git reset HEAD
>git stash pop
>git commit -a

This should be trivial to automatize if you need this more often.

Note that this seems to work without the stash part at first sight, but fails when files are added, so the extra trip through the stash cannot be left out.




回答3:


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.



来源:https://stackoverflow.com/questions/3038422/git-after-preparing-a-real-merge-commit-how-to-create-a-simple-commit

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!