Подтвердить что ты не робот

Получить удаленный файл в Git с помощью SourceTree

Я использую исходное дерево. Я создал множество изменений и по ошибке удалил его. Есть ли способ вернуть их обратно?

4b9b3361

Ответ 1

Стойка сохраняется внутри, как фиксация слияния, ссылающаяся на список закладок.

git fsck можно найти оборванные объекты. Он найдет не только ваш удаленный кошелек, но, вероятно, и другие вещи... так что вам будет нужно искать коммиты, которые выглядят так, как будто они могут быть вашим приложением (git show <ID>, чтобы отобразить соответствующую информацию об объекте и решить, это тот, который вы ищете).

Как только у вас есть это, все, что вам нужно сделать, это снова вставить его в список закладок. Список сохраняется в .git/logs/refs/stash, а строка имеет следующий формат:

<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash>

Вот рабочий пример:

16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <[email protected]> 1374227992 +0200  WIP on master: 0dbd812 Update draft release notes to 1.8.4

Просто синтезируйте строку для табуляции, которую вы хотите повторно вставить (имя/почта/метка времени/описание не обязательно должны быть точными), и вы сможете снова использовать ее снова.

Счастливая охота!

Ответ 2

Основываясь на приведенных выше ответах, вот простая последовательность:

Откройте окно терминала и cd в папку в репозитории. Тогда:

git fsck | awk '{print $3}' > tmp.txt
cat tmp.txt | xargs git show > tmp2.txt

Теперь откройте tmp2.txt в редакторе, найдите свой потерянный код и найдите идентификатор commit поверх него. Затем примените код:

git stash apply <commit id>
rm tmp.txt tmp2.txt

Это спасло мою жизнь! Я действительно благодарю всех тех, кто ответил на этот вопрос. Я благословляю создателя git Linus Torvalds для хранения удаленных материалов в базе данных git. Genius!!

Ответ 3

Как и в предыдущих ответах, вы можете использовать git fsck для отображения объектов, которые не ссылаются ни на что, что будет включать ваш удаленный штамп. Но это можно использовать git show для фильтрации этого списка объектов для отображения только такие как:

git fsck 2> /dev/null |
  awk '/commit/{print $3}' |
  git show --stdin --merges --grep '^WIP on'

Если вы знаете, когда был создан stash, вы также можете добавить аргумент, например --since '2 days ago' до последней строки для дальнейшего ограничения выхода. Надеемся, что это приведет к сокращению списка до приемлемого размера.

После того, как вы нашли правильный кошелек, обратите внимание на его идентификатор фиксации, и вы можете использовать git stash apply COMMITID, чтобы применить его так, как если бы он не был удален.

Ответ 4

Как утверждает Ян Крюгер, git fsck - это путь. Однако, если вы не сможете (по какой-либо причине) успешно синтезировать строку в своем файле stash и сделать скрытый список в доступном списке, вы можете напрямую использовать git stash apply <guid>, не добавляя строку. Это немедленно применит (не зафиксирует) изменения файлов в вашу текущую ветку.

Ответ 5

Другое решение:

git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log

найти автора и зафиксировать информацию (дата, хэш, автор и т.д.)

git stash store <hash-id-of-specific-commit>

Ответ 6

for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less

Затем найдите идентификатор фиксации #.

и do

git stash apply {commit#}