Git: после подготовки реального коммита слияния, как создать простой коммит? - PullRequest
6 голосов
/ 14 июня 2010

После вызова git merge --no-commit <commit> выполнение фиксации приведет к фиксации слияния с двумя (или более) родителями. Какую команду вызывать для создания простого коммита (без необходимости повторного выполнения команды слияния с опцией --squash)?

Ответы [ 3 ]

4 голосов
/ 15 июня 2010

Согласно справочной странице git-merge , опция --squash не записывает $ GIT_DIR / MERGE_HEAD . $ GIT_DIR / MERGE_HEAD отвечает за создание коммитов слияния; Вы можете увидеть это в исходниках Git, файл builtin / commit.c :

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

Решение : после обычного слияния просто избавьтесь от $ GIT_DIR / MERGE_HEAD , чтобы избежать получения коммита слияния. Вы можете вручную очистить $ GIT_DIR / MERGE_MSG и $ GIT_DIR / MERGE_MODE, а также оставить это задание на усмотрение Git при успешной фиксации.

1 голос
/ 13 января 2012

Лучшее решение без каких-либо хакеров в каталоге .git - использовать сохранение и сброс.

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

Автоматизировать это, если вам это нужно чаще, просто.

Обратите внимание, что на первый взгляд кажется, что это работает без части тайника, но завершается ошибкой при добавлении файлов, поэтому нельзя пропустить дополнительную поездку через тайник.

0 голосов
/ 14 июня 2010

Вы можете попробовать git merge --squash.

Смотрите вопрос " В git, в чем разница между merge --squash и rebase? "

от

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

до:

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

Будет произведен сдавленный коммит в ветви назначения, без пометки каких-либо отношений слияния.

...