Вопрос по git, git-tower – В Git, как я могу восстановить промежуточный файл, который был возвращен до фиксации?

27

Я пытался внести изменения в свой репозиторий, используя Git Tower. Когда я это сделал, произошел конфликт, и я по ошибке попал на сцену «все» (как я хотел сделать после разрешения конфликта). Когда я это сделал, конфликт был помечен как разрешенный.

Я хотел разрешить изменение вручную, поэтому нажал «Abort Merge», однако, когда я сделал это, он откатил все мои изменения! Есть ли способ вернуть их?

Ваш Ответ

2   ответа
9

Чтобы расширить ответ Александра с более простой альтернативой: да, если вы подготовили свои изменения, то, вероятно, вы можете получить свои файлы обратно. Когда ты бежишьgit addфайлы фактически добавляются в базу данных объектов Git. В тот момент, когда вы это сделаете, git поместит файл в индекс:

% git add bar.txt
% git ls-files --stage
100644 ce013625030ba8dba906f756967f9e9ca394464a 0   bar.txt
100644 6af0abcdfc7822d5f87315af1bb3367484ee3c0c 0   foo.txt

Обратите внимание, что запись для bar.txt содержит идентификатор объекта файла. Git фактически добавил файл в свою базу данных объектов. В этом случае Git добавил его в репозиторий как свободный объект:

% ls -Flas .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
4 -r--r--r--  1 ethomson  staff  21 14 Jun 23:58 .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a

Эти файлы будутeventually быть мусором (так что, действительно, не запускайте явноgit gc). К счастью, по умолчанию это произойдет в течениеmonths, а не дни. Пока эти файлы не собраны, вы можете восстановить их.

Самый простой способ сделать этоскачать и установитьgit-recover program в интерактивном режиме:

% git recover -i
Recoverable orphaned git blobs:

61c2562a7b851b69596f0bcad1d8f54c400be977  (Thu 15 Jun 2017 12:20:22 CEST)
> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
> tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
> veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
> commodo consequat. Duis aute irure dolor in reprehenderit in voluptate

Recover this file? [y,n,v,f,q,?]: 

git-recover ищет файлы в объектной базе данных, которыеnot совершено (или в указателе). Вы можете узнать больше оgit-recover всообщение в блоге, объявляющее об этом.

51

Если у вас есть что-то готовое для мерзавца, вы, вероятно, сможете вернуть это. (Если вы только что изменили рабочую копию, вы не сможете ее восстановить.)

Прежде всего: сделатьnot бежатьgit gc, Сделайте резервную копию вашего хранилища и рабочей копии, прежде чем идти вперед. (Обязательно сделайте резервную копию.git каталог.) Также не закрывайте терминал, где это произошло, и / или не перезагружайтесь, & # x2014; & # xA0; если все не удается, у вас есть шанс найти материал в истории / памяти.

В любом случае, первое, что нужно попробовать:

git fsck --lost-found

Это напечатает что-то вроде

Checking object directories: 100% (256/256), done.
Checking objects: 100% (30165/30165), done.
dangling blob 8f72c7d79f964b8279da93ca8c05bd685e892756
dangling commit 4993502a6394491190d3f4d6fb3d1e14019c2e9b

Поскольку вы потеряли промежуточные файлы и не сделали коммит, вы заинтересованы вdangling blob записей.

Бежатьgit show <sha> для каждого & # x2014; некоторые из них должны быть вашими файлами.

Спасибо! Я оставил надежду на то, что Git сохранил все не переданные файлы. Я хотел добавить в совет для тех, кто много мусора в своих потерянных и найденных. У меня, например, было 100 записей, поэтому для поиска хеша вы также можете использовать команду типа find-in-file в вашем каталоге git, если вы помните некоторую часть файла, который вы написали. Я использовал найти. | xargs grep 'PIECE_OF_MISSING_CODE & apos; -SL | grep "потерянный-найденный" David
мерзавец шоу & lt; sha & gt; показывает дерьмо, я имею в виду некоторые узнаваемые строки, но остальное дерьмо. Это должно быть как-то декодировано, или это то, чем оно является (не используется).

Похожие вопросы