Вчера у меня возникла странная проблема.
add-trans
с сообщением журнала add transaction final
react
, но один файл был изменен, пришлось его спрятатьmaster
(по ошибке)react
add-trans
Пока все хорошо Но затем осознайте, что коммит «добавить окончательную транзакцию» отсутствует!
git log --graph --oneline --decorate
* ea34d09 (react) Merge branch 'add-trans' into react
|\
* | 0a5cd5a dark theme
* | 49b3148 added color categorie
* | 5aaf600 ordering categories
| * 60d0bc5 (HEAD -> add-trans) add new transaction. draft 1
* | aef34ed merge categories and groups selection
|/
| * 6ddb28d (master) moved flatpickr cdn
| * 6c3954f (origin/master, origin/HEAD) show amount if 0
...
Проклятый ! потерял 4 часа работы. Что случилось ?!
Я знаю, что git не так-то легко стирает данные, поэтому я мог найти потерянный хэш, основываясь на сообщении: Как мне восстановить удаленный тайник в Git?
git log --graph --oneline --decorate --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )
* ea34d09 (react) Merge branch 'add-trans' into react
|\
* | 0a5cd5a dark theme
* | 49b3148 added color categorie
* | 5aaf600 ordering categories
| | * 5c96e57 WIP on (no branch): faa2f21 add transaction final
| | |\
| | | * 558aef4 index on (no branch): faa2f21 add transaction final
| | |/
| | * faa2f21 add transaction final
| |/
| * 60d0bc5 (HEAD -> add-trans) add new transaction. draft 1
* | aef34ed merge categories and groups selection
|/
| * 6ddb28d (master) moved flatpickr cdn
| * 6c3954f (origin/master, origin/HEAD) show amount if 0
...
Я мог бы вернуть коммит faa2f21 add transaction final
и правильно выполнить слияние, но я в замешательстве... может кто-нибудь сказать мне, что произошло?
git reflog (after I fixed the problem)
0522a6d (HEAD -> react) HEAD@{0}: commit (merge): Merge branch 'add-trans' into react
0a5cd5a HEAD@{1}: checkout: moving from add-trans to react
faa2f21 (add-trans) HEAD@{2}: merge add-trans-final: Fast-forward
60d0bc5 HEAD@{3}: checkout: moving from react to add-trans
0a5cd5a HEAD@{4}: reset: moving to HEAD~1
ea34d09 HEAD@{5}: checkout: moving from add-trans to react
60d0bc5 HEAD@{6}: checkout: moving from faa2f21c33ce8da763e8d5580c718590318ed5c1 to add-trans
faa2f21 (add-trans) HEAD@{7}: checkout: moving from add-trans to faa2f21
60d0bc5 HEAD@{8}: checkout: moving from react to add-trans
ea34d09 HEAD@{9}: commit (merge): Merge branch 'add-trans' into react
0a5cd5a HEAD@{10}: checkout: moving from master to react
6ddb28d (master) HEAD@{11}: checkout: moving from faa2f21c33ce8da763e8d5580c718590318ed5c1 to master
faa2f21 (add-trans) HEAD@{12}: commit: add transaction final
60d0bc5 HEAD@{13}: checkout: moving from react to 60d0bc5a707cf626b416a66cad6df75dc167a18c
0a5cd5a HEAD@{14}: commit: dark theme
49b3148 HEAD@{15}: commit: added color categorie
...
Большое спасибо.
Спасибо. Добавлена информация о рефлоге. Теперь я вижу, что после фиксации faa2f21
я вскоре перешел на освоение
Думаю, моя догадка в предыдущем комментарии оправдалась. Судя по редактированию записей рефлога, похоже, что в момент создания фиксации faa2f21
вы не находились в ветке, но через некоторое время после показанных вами записей рефлога вы переуказали add-trans
на идентификатор фиксации faa2f21
, на что он и указывает. сейчас. Итак, 1.) кажется ли возможным, что вы выписали 60d0bc5
вместо add-trans
, и 2.) Помните ли вы, как повторно указали add-trans
на faa2f21
после того, как поняли, что его нет в ветке? (Возможно, это могут показать более поздние записи в журнале, которые вы не показали.)
При объединении вы объединяли локальную ветку (git merge add-trans
) или удаленную ветку (git merge origin/add-trans
)?
Примечание: я не могу понять, что это за запись в рефлоге: 0a5cd5a
. Кажется, было бы больше смысла, если бы это было 49b3148
, поскольку именно это react
указывало на 3 записи вниз, когда вы отходили от нее.
@amphetamachin Думаю, записи в рефлоге отображались бы origin/add-trans
, если бы это было так. Я также только что проверил, что произойдет, если вы проверите origin/add-trans
вместо add-trans
, а также списки записей рефлога origin/add-trans
, так что я предполагаю, что OP действительно каким-то образом проверил идентификатор фиксации вместо ветки.
@amphetamachin add-trans
— это местное отделение, объединенное локально.
@TTT 1) похоже, это причина, по которой слияние было выполнено на 60d0bc5. Я проверил add-trans
использование графического интерфейса VSCode, поэтому не совсем уверен. Однако git reflog
демонстрирует явный переход к 60d0bc5 HEAD@{13}: checkout: moving from react to 60d0bc5
. 2) Нет, я никогда не осознавал, что ветка указывает не на faa2f21
. Более поздние рефлоги показывают только то, как я впоследствии исправил всю историю.
@TTT, отвечаю на ваше примечание. Я добавил в журнал дополнительную историю. 0a5cd5a
отсутствовало в моем копипасте.
@gis Я думаю, 0a5cd5a
в рефлоге тоже отсутствует? Этот коммит должен был быть создан после 49b3148
, и кажется, что он появляется из ниоткуда.
@TTT да, извини... Я пытался минимизировать размер сообщения. Сейчас отредактировал рефлог
@gis ОК. Теперь журнал обновлений соответствует сгенерированному графу. Я также вижу, что графики представлены до того, как вы внесли исправление, а журнал обновлений — после исправления. Теперь информации достаточно, чтобы точно ответить, что я только что и сделал.
Символ WIP on (no branch)
в выводе вашего журнала указывает на то, что вы находились в процессе rebase
или разрешения конфликта, или, возможно, даже merge --no-commit
.
Git позволит вам добавлять/изменять коммиты, но пока вы не определите состояние репозитория, при слиянии add-trans
будет использоваться последнее известное хорошее состояние ветки.
Честно говоря, я не знаю, что происходит с состоянием вашего локального репозитория. git status
— ваш друг и может многое рассказать о том, что происходит в вашем репозитории.
Вот несколько команд, которые стоит попробовать:
git rebase --abort
git am --abort
git merge --abort
git bisect reset
Как только вы получите его обратно, вы сможете перетащить ту странную вещь, которую вы совершили в пустоту, в свою ветку:
git checkout add-trans
git cherry-pick faa2f21
Затем снова объединитесь в react
.
Если вы не можете каждый раз набирать git status
, вы можете добавить индикаторы состояния репо в подсказку, используя git-prompt.sh
:
# Add these lines to ~/.bashrc:
. /usr/lib/git-core/git-sh-prompt
PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
Вам следует настроить строку git-sh-prompt
в соответствии с тем, где она находится в вашей системе. Я просто включил путь, который используется по умолчанию в Ubuntu 23.04.
На самом деле это сообщение «НЗП включено» автоматически генерируется тайником.
Проблема в том, что ваш первый пункт произошел не так, как вы думали:
зафиксировано изменение в ветке
add-trans
с сообщением журналаadd transaction final
Вместо этого эта строка рефлога объясняет, что именно произошло:
60d0bc5 HEAD@{13}: checkout: moving from react to 60d0bc5a707cf626b416a66cad6df75dc167a18c
Обратите внимание, что в момент оформления заказа ветка add-trans
указывала на идентификатор фиксации 60d0bc5
. Если бы вы проверили ветку add-trans
, в рефлоге было бы написано:
60d0bc5 HEAD@{13}: checkout: moving from react to add-trans
и если бы вы это сделали, проблема бы не возникла. Но, проверив идентификатор фиксации вместо ветки, вы оказались в отсоединенном режиме, а затем, когда вы создали фиксацию faa2f21 add transaction final
, она стала потерянной фиксацией, которую вы позже нашли, выполнив поиск тайника, который был создан, пока указывал ваш отсоединенный HEAD
. этому совершению.
Что касается того, как это произошло, в комментарии вы заявили, что думали, что сделали это:
Я проверил
add-trans
с помощью графического интерфейса VSCode, поэтому не совсем уверен.
В зависимости от того, какой плагин VS Code вы использовали, точные детали могут отличаться, но, например, в Git Graph, если вы щелкнете правой кнопкой мыши по имени ветки и выберете «Оформить ветку», это произойдет, но если вы щелкнете правой кнопкой мыши по сообщению фиксации (слегка справа от названия ветки), щелкните правой кнопкой мыши и выберите «Оформить заказ», и он будет оформлен как отсоединенный. (Он также предупредит вас об этом, что вы можете отклонить или отклонить навсегда, что означает, что в следующий раз он вас не предупредит.) Я предполагаю, что вы случайно сделали что-то подобное и не осознавали этого до тех пор, пока не произошло слияние.
Исправление относительно простое, если вы знаете идентификатор потерянного коммита, который обычно легко найти с помощью git reflog
. По вашим записям в рефлоге я могу сказать, что вы это исправили.
Хорошо, большое спасибо за четкий анализ. Попробую воспроизвести эту странную проверку.
хм... До сих пор не понимаю, почему из тайника с дропами удалили faa2f21
@gis удаление тайника не удалило этот коммит. Он все еще там, но поскольку он осиротевший, на него нет ничего, что указывало бы, поэтому он не отображается в обычном git log
. Вот почему в последнем абзаце я предлагаю использовать git reflog
, когда происходят подобные вещи, чтобы вы могли легко найти «скрытый» идентификатор коммита. То же самое происходит с переписанными коммитами после перебазирования: создаются новые коммиты, а старые идентификаторы коммитов становятся бесхозными, но вы все равно можете найти их с помощью git reflog
.
Все ясно, спасибо. спасибо, теперь мне спокойно с рефлогом.
То, что вы описали с помощью GitGraph, могло бы произойти. Хотя я не помню, чтобы появлялось предупреждение, я смог воспроизвести сценарий «щелкните правой кнопкой мыши по сообщению о фиксации».
Похоже, ваш первый пункт может быть неверным. Похоже, что идентификатор фиксации
faa2f21
не был создан, покаadd-trans
был извлечен, потому что этот коммит просто находится там, и на него не указывает ни одна ветка. ИЛИ, может быть, это было в то время, но, возможно, вы выполнили сброс или перебазирование, что изменило веткуadd-trans
, чтобы вместо этого указать на один коммит60d0bc5
. Вы можете попробоватьgit reflog
и узнать, когда был создан коммитfaa2f21
— это может дать вам больше контекста до и после этого.