Git объединить получить имя ветви источника после закрытия окна терминала - PullRequest
0 голосов
/ 01 мая 2020

В Git как я могу получить имя исходной ветви слияния?

Я вчера начал слияние, получил конфликты, которые я не окончил sh, а затем windows обновление перезапустило мой компьютер, закрыв окно терминала.

1 Ответ

2 голосов
/ 01 мая 2020

TL; DR

Посмотрите на первую строку .git/MERGE_MSG.

Long-i sh

В комментарии мы имеем следующую ситуацию:

  • Что-то - возможно, не вы, или вы, вероятно, помните, что вы сделали - запустило git merge <em>string</em>.
  • Это слияние имело конфликты, поэтому оно остановилось в середине слияния.
  • Затем, пока вы работали над этим, что-то еще привело к перезагрузке компьютера (предположительно, безопасно, но вы потеряли контекст).
  • Дополнительные команды Git могут выполняться или не выполняться, но вы все еще находитесь в середине конфликтующего слияния.
  • Теперь вы хотите вернуть string.

Есть только одно место, которое Git сохранил буквальную строку, и она находится в файле MERGE_MSG в каталоге Git. Если у вас типичная настройка и вы находитесь на верхнем уровне вашего рабочего дерева, это:

$ cat .git/MERGE_MSG
Merge branch 'A' into B

# Conflicts:
#   new-filename

Первая строка будет читать:

Merge branch 'string'

или:

Merge branch 'string' into <name>

, где name - название ветви, в которой вы находились, когда началось объединение. (Часть into <name> пропускается тогда и только тогда, когда <name> является литеральным текстом master. Это одно из немногих мест в Git, где имя master получает специальную обработку: оно изменяет стандартное сообщение слияния немного.)

Если ваша директория Git (собственно хранилище) находится где-то еще, используйте git rev-parse --git-dir, чтобы найти ее.

Необработанный идентификатор ha sh ID легче получить :

$ git rev-parse MERGE_HEAD
243e415273b34b1553ce5eaeb6a189595d322015

Вы можете превратить это в набор имен ветвей, которые указывают непосредственно на этот коммит с помощью git branch --points-at:

$ git branch --points-at MERGE_HEAD

, но этот может произвести вообще никаких имен - например, если вы запустили git merge с необработанным идентификатором ha sh или с тех пор имя ветви было перемещено - или это может привести к появлению более одного имени. Так что первая строка .git/MERGE_MSG - это, вероятно, место для поиска.

Кстати, обратите внимание, что вы можете просматривать коммиты, достижимые из MERGE_HEAD с git log как обычно:

$ git log MERGE_HEAD

Это иногда полезный способ увидеть , что вы объединяете, в зависимости от того, сколько коммитов на каждой "ветке" каждой ветви:

$ git log --decorate --oneline --graph --boundary MERGE_HEAD...HEAD

С использованием репозитория, который я использовал, это дает:

* 243e415 (A) modify renamed file too
* 57b6097 rename in branch A
| * c8d5dd8 (HEAD -> B) remove orig-filename
|/  
o 3a5c9ae (master) add orig-filename

В этом случае визуализация, вероятно, достаточна, но в более сложных графиках может быть полезно добавление --left-right:

$ git log --decorate --oneline --graph --left-right --boundary MERGE_HEAD...HEAD
< 243e415 (A) modify renamed file too
< 57b6097 rename in branch A
| > c8d5dd8 (HEAD -> B) remove orig-filename
|/  
o 3a5c9ae (master) add orig-filename

Обратите внимание, что «наша» ветка, HEAD или B, находится справа от трех точек MERGE_HEAD...HEAD, и некоторые коммиты помечены >, потому что они находятся в нашей ветке. «Их» ветвь MERGE_HEAD aka A помечена <, поскольку MERGE_HEAD находится слева от MERGE_HEAD...HEAD.

(опция --boundary регулирует набор коммитов, включенных в вывод git log, так что мы видим последний коммит здесь, в данном случае, на master. Без этого этот коммит исключается из вывода git log.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...