Как узнать родительские ревизии текущего слияния?


Я начал слияние, но у него были конфликты, которые я разрешил,и теперь все готово к фиксации. Я просто хочу перепроверить, какие родительские ревизии я объединил.

До сих пор пытались:

  • git show со спецификатором формата %P-за исключением того, что я не могу понять, как заставить его сообщить мне родителей незафиксированного слияния
  • git rev-list с различными вариантами, безрезультатно
  • поиск в гугле git-эквивалента hg parents, который возвращает меня к git rev-list но безуспешно: он перечисляет пять ревизий, и он не может перечислить ревизию, которую я фактически передал git merge <rev>
  • git commit и посмотрите на сообщение фиксации
Последний вариант-единственный, который действительно работал, за исключением того, что он показывает только одного из родителей моего незафиксированного слияния.

Должен быть лучший способ, чем git commit! Как мне сделать это правильно?

1 2

1 ответ:

Обратите внимание, что, поскольку коммит слияния еще не существует, вы не сможете использовать git log или git show со спецификатором формата %P (который соответствует родительским хэшам) для доступа к родителям этого будущего коммита слияния.

Простое слияние

В случае простого слияния одной ветви в другую можно запустить

git log -n 1 --pretty=format:"%H"
git log -n 1 --pretty=format:"%H" MERGE_HEAD

Который напечатает полный ШАС

  • кончик текущей ветви, и
  • объединяемая ветвь in,

Соответственно.

Осьминог слияние

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

git log -n 1 --pretty=format:"%H" MERGE_HEAD

Будет только печатать SHA из одной ветвей, в которых происходит слияние; он не будет перечислять SHAs из всех этих ветвей.

Однако не все потеряно; есть способ напечатать их все. Оказывается, что файл .git/MERGE_HEAD содержит SHAs всех объединяемых ветвей; поэтому более надежный подход состоит в простом сбрасывании содержимого этого файла:
cat .git/MERGE_HEAD

Привести в порядок мысли, Вот это (добровольно надуманный) пример прерванного осьминог объединить:

# set things up
$ mkdir test_octopuss
$ cd test_octopuss
$ git init

# create an initial commit
$ printf "foo\n" > README.md
$ git add README.md
$ git commit -m "add 'foo' in README"

# create three different commits on branches whose tips count the root commit as parent
$ printf "bar\n" >> README.md 
$ git commit -am "add 'bar' in README"
$ git checkout -b another master^
$ printf "bar\n" >> README.md 
$ git commit -am "add 'bar' in README"
$ git checkout -b yetanother master^
$ printf "bar\n" >> README.md 
$ git commit -am "add 'bar' in README"

# get our bearings
$ git log --oneline --graph --all --decorate
* 93e4667 (HEAD, yetanother) add 'bar' in README
| * a114920 (another) add 'bar' in README
|/  
| * 7adc927 (master) add 'bar' in README
|/  
* bc400cd add 'foo' in README

# merge using the --no-commit flag (to pretend that the merge failed)
$ git merge --no-commit master another
Trying simple merge with master
Trying simple merge with another
Automatic merge went well; stopped before committing as requested

# the following command fails to list all the heads being merged in
$ git log -n 1 --pretty=format:"%H" MERGE_HEAD
7adc927d9f7a0c8864d0ff784c0c53b0ded00616

# list of all the heads being merged in the current branch
$ cat .git/MERGE_HEAD
7adc927d9f7a0c8864d0ff784c0c53b0ded00616
a114920072210417a1fa6c9b2b33b5729097ee93