UPD : более чистый способ сделать то же самое, не связываясь напрямую с sha1:
$ echo "merge commit" | git commit-tree topic^{tree} -p master -p topic
4201b6abae6bb06f929ea00fbc35019679d55535
$ git merge 4201b6abae6bb06f929ea00fbc35019679d55535
Updating b826a8e..4201b6a
Fast-forward
Или даже однострочная команда:
$ git merge $(echo "merge commit" | git commit-tree topic^{tree} -p master -p topic)
Для получения подробной информации о том, что это делает - прочитайте весь ответ:)
Я полностью согласен с другими в том, что для меня это не имеет смысла, но если вы действительно этого хотите - это возможно с низкоуровневыми командами слесарного дела, как описано ниже.
Прежде всего, вы должны знать sha1 ваших родительских коммитов. Я полагаю, что у B есть комментарий «изменение из темы», у A есть комментарий «изменение из мастера», и мы в настоящее время находимся в B (ветвь темы).
$ git log --format=oneline -2
b826a8e93ac8da0de5bfb5b70d5f4e7c352a01fa change from topic
8b7653a529fb3ce964fda79bfd57e645441ad893 change from master
Тогда вы должны знать sha1 конкретного объекта дерева коммита B:
$ git cat-file -p topic
tree 867f31c455a371756ec353b54d755f51d98d62c4
parent 8b7653a529fb3ce964fda79bfd57e645441ad893
author ivan-danilov <email@gmail.com> 1311518908 +0300
committer ivan-danilov <email@gmail.com> 1311518908 +0300
change from topic
Так что это 867f31c455a371756ec353b54d755f51d98d62c4
. И, наконец, вы должны выполнить команду git-commit-tree
:
$ echo "merge commit" | git commit-tree 867f31c455a371756ec353b54d755f51d98d62c4 -p b826a8e93ac8da0de5bfb5b70d5f4e7c352a01fa -p 8b7653a529fb3ce964fda79bfd57e645441ad893
4201b6abae6bb06f929ea00fbc35019679d55535
Обратите внимание, что я использовал перенаправление конвейера, так как git-commit-tree
получает комментарий из потока stdin
. Первый параметр - это sha1 дерева, который мы получили с git cat-file
, а два других - это sha1 коммита, который мы получили с git log
.
Вывод команды - это sha1 вновь созданного коммита слияния. Теперь вы хотите быстро перейти к следующей ветке темы:
$ git merge 4201b6abae6bb06f929ea00fbc35019679d55535
Updating b826a8e..4201b6a
Fast-forward
Вот и все. Вы получили то, что хотели.