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
.)