Во-первых, давайте ответим на вопрос, который вы не знали, задать
... Я знаю, что могу получить хэш веток refs/pull-requests/1/from
и refs/pull-requests/1/merge
, но могу ли я получить что-то вроде коммита "merge"?
Это не функции Git, а функции Bitbucket. (Возможно, какой-то другой веб-сервис использует ту же технику, но я приму здесь Bitbucket.) См. https://community.atlassian.com/t5/Bitbucket-questions/Difference-of-refs-pull-requests-lt-ID-gt-merge-and-refs-pull/qaq-p/772142 (и обратите внимание на предостережения в ответе на этот вопрос).
Эти два технически не являются ответвлениями , за исключением того, что это зависит от того, как мы определяем слово ответвление . См. Что именно мы подразумеваем под "ветвью"? Но они являются хеш-идентификаторами коммитов. Идентификатор хэша, заданный refs/pull-requests/1/from
, всегда существует и является коммитом из серии коммитов, которые имел тот, кто сделал PR # 1, когда делал запрос на извлечение. Имя refs/pull-requests/1/merge
может не существовать , но если оно существует, то это хэш-идентификатор коммита слияния, который Bitbucket уже сделал. Это результат слияния, которое пытался выполнить Bitbucket, чтобы увидеть, можно ли объединить запрос извлечения как есть.
Если коммит слияния уже существует, вы можете извлечь его в свой собственный Git-репозиторий. Обратите внимание, что если существует , это означает, что Git Bitbucket смог разрешить слияние без помощи человека. Поэтому ваш Git может сделать то же самое, если это проще или удобнее, чем получить их слияние. Хотя вы получите другое слияние commit , у него будет такое же связанное дерево: см. Ниже.
Почему первоначальный вопрос немного глуп?
Хэш-идентификатор коммита вычисляется путем хэширования содержимого коммита.
Вот содержимое примера коммита (но с @
, измененным на
, чтобы, возможно, уменьшить чью-то спам-нагрузку):
tree a830f927ccaf7164b03602729cc7078c79d5bbf2
parent fab4a8a39666793d407371f519e8b6d25d33fa84
author Junio C Hamano <gitster pobox.com> 1558252002 +0900
committer Junio C Hamano <gitster pobox.com> 1558252002 +0900
Git 2.22-rc1
Signed-off-by: Junio C Hamano <gitster pobox.com>
Обратите внимание, что дерево слияния (хэш-идентификатор после слова tree
здесь) неизвестно до тех пор, пока не будет выполнено слияние, но вы можете выполнить слияние, чтобы найти дерево, а затем вы знать дерево.
Вышеуказанное является коммитом без слияния; вот коммит слияния:
tree ea8851107dda1a726b3eec91d347996ead1ab683
parent 8c59ba9a764f1ae1f8d176ea17c636183cfd7267
parent f3a3a021c716b46ed35e6b7171bbff4d8042da68
author Junio C Hamano <gitster pobox.com> 1558251935 +0900
committer Junio C Hamano <gitster pobox.com> 1558251935 +0900
Merge branch 'js/difftool-no-index'
The "--dir-diff" mode of "git difftool" is not useful in "--no-index"
mode; they are now explicitly marked as mutually incompatible.
* js/difftool-no-index:
difftool --no-index: error out on --dir-diff (and don't crash)
Ключевое отличие состоит в том, что у слияния есть два родителя. родители слияния очевидны: первый - это текущий коммит до того, как вы выполните слияние, а другой - хэш-идентификатор коммита, который вы намереваетесь слить.
После строк tree
и parent
следуют строки author
и committer
. Они не только содержат известное количество - имя и адрес электронной почты - но также и непредсказуемое: точную секунду, в которую выполняется слияние (например, 1558252002
).
Остальное содержимое коммита слияния - это сообщение коммита, которое, вероятно, вы знаете.
Итак, чтобы предсказать слияние, вам необходимо:
- Выполните объединение, чтобы найти
tree
- Предскажите время, когда вы выполните слияние позже
Как только вы узнаете эти два бита данных, вы можете заполнить содержимое заголовка и вычислить хеш-идентификатор слияния.
Конечно, этого первого шага - выполнить слияние - теперь достаточно: у вас есть слияние; так что просто используйте это. Именно поэтому Bitbucket выполняет тестовое слияние, как и GitHub, хотя их имена refs/pull/<em>number</em>/head
и refs/pull/<em>number</em>/merge
.