Как узнать родительские ревизии текущего слияния?
Я начал слияние, но у него были конфликты, которые я разрешил,и теперь все готово к фиксации. Я просто хочу перепроверить, какие родительские ревизии я объединил.
До сих пор пытались:
-
git show
со спецификатором формата %P-за исключением того, что я не могу понять, как заставить его сообщить мне родителей незафиксированного слияния -
git rev-list
с различными вариантами, безрезультатно - поиск в гугле git-эквивалента
hg parents
, который возвращает меня кgit rev-list
но безуспешно: он перечисляет пять ревизий, и он не может перечислить ревизию, которую я фактически передалgit merge <rev>
-
git commit
и посмотрите на сообщение фиксации
Должен быть лучший способ, чем git commit
! Как мне сделать это правильно?
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