Как восстановить сброшенный тайник в Git?

Откройте файл в режиме добавления, как со следующим кодом:

 PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
1530
задан Randall 1 July 2016 в 18:30
поделиться

6 ответов

После того как Вы знаете, что хеш притона фиксирует Вас отброшенный, можно применить его как притон:

git stash apply $stash_hash

Или, можно создать отдельное ответвление для него с

git branch recovered $stash_hash

После этого можно сделать то, что Вы хотите со всеми нормальными инструментами. Когда Вы сделаны, просто сдуваете ответвление.

Нахождение хеша

Если Вы только что вытолкали его, и терминал все еще открыт, Вам все еще распечатают значение хэш-функции git stash pop на экране (спасибо, Dolda).

Иначе можно найти его с помощью этого для Linux, Unix или Bash Мерзавца для Windows:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

... или использование Powershell для Windows:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $bits = $_ -split ' '; echo $bits[2];}

Это покажет Вам все фиксации в подсказках Вашего графика фиксации, на которые больше не ссылаются ни от какого ответвления или тега – каждая потерянная фиксация, включая каждую фиксацию притона, которую Вы когда-либо создавали, будет где-нибудь в том графике.

Самый легкий способ найти фиксацию притона, которую Вы хотите, состоит в том, чтобы, вероятно, передать тот список gitk:

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

... или см. ответ от emragins при использовании Powershell для Windows.

Это запустит браузер репозитория, показывающий Вам каждая фиксация в репозитории когда-либо, независимо от того, достижимо ли это или нет.

Можно заменить gitk там с чем-то как git log --graph --oneline --decorate если Вы предпочитаете хороший график на консоли по отдельному приложению для GUI.

Для определения фиксаций притона ищите сообщения о фиксации этой формы:

    WIP на somebranch: commithash Некоторое старое сообщение о фиксации

Примечание: Сообщение о фиксации только будет в этой форме (запускающийся с "WIP на"), если Вы не предоставляли сообщение, когда Вы сделали git stash.

2601
ответ дан jpaugh 1 July 2016 в 18:30
поделиться

git fsck --unreachable | grep commit должен показать sha1, хотя список, который он возвращает, мог бы быть довольно большим. git show <sha1> покажет, является ли это фиксация, Вы хотите.

git cherry-pick -m 1 <sha1> объединит фиксацию на текущее ответвление.

38
ответ дан Nathan Jones 1 July 2016 в 18:30
поделиться

Я только что создал команду, которая помогла мне найти мой потерянный коммит:

for ref in `find .git/objects | sed -e 's#.git/objects/##' | grep / | tr -d /`; do if [ `git cat-file -t $ref` = "commit" ]; then git show --summary $ref; fi; done | less

Здесь перечислены все объекты в дереве .git / objects, найдены объекты, которые имеют тип commit, а затем показаны краткое изложение каждого. С этого момента достаточно было просто просмотреть коммиты, чтобы найти подходящий «WIP на работе: 6a9bb2» («work» - это моя ветка, 619bb2 - недавний коммит).

Я отмечаю, что если я использую «git stash apply» вместо «git stash pop», у меня не возникнет этой проблемы, и если я использую «git stash save message », то коммит может иметь было легче найти.

Обновление: с идеей Натана, это становится короче:

for ref in `git fsck --unreachable | grep commit | cut -d' ' -f3`; do git show --summary $ref; done | less
71
ответ дан Greg Hewgill 1 July 2016 в 18:30
поделиться

Мне понравился подход Аристотеля, но мне не нравилось использовать GITK ... так как я привык использовать GIT из командной строки.

Вместо этого я взял оборванные коммиты и вывел код в файл DIFF для просмотра в моем редакторе кода.

git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff

Теперь вы можете загрузить полученный файл diff / txt (он находится в вашей домашней папке) в ваш текстовый редактор и увидеть фактический код и полученный SHA.

Тогда просто используйте

git stash apply ad38abbf76e26c803b27a6079348192d32f52219
16
ответ дан Shaheen Ghiassy 1 July 2016 в 18:30
поделиться

Просто требуемый для упоминания этого дополнения к принятому решению. Это не было сразу очевидно для меня в первый раз, когда я попробовал этот метод (возможно, это должно было быть), но применять притон от значения хэш-функции, просто используйте "притон мерзавца, применяются ":

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

, Когда я был плохо знаком с мерзавцем, это не было ясно мне, и я пробовал различные комбинации "шоу мерзавца", "мерзавец подает заявку", "патч", и т.д.

255
ответ дан Wade 2 July 2016 в 04:30
поделиться

Моим фаворитом является эта острота:

git log --oneline  $( git fsck --no-reflogs | awk '/dangling commit/ {print $3}' )

Это - в основном та же идея как этот ответ , но намного короче. Конечно, можно все еще добавить --graph для получения древовидного дисплея.

при нахождении фиксации в списке подайте заявку с

git stash apply THE_COMMIT_HASH_FOUND

Для меня, использование --no-reflogs действительно показывало, что потерянная запись притона, но --unreachable (как найдено во многих других ответах) не сделала.

Выполнение это на мерзавце колотит, когда Вы находитесь под Windows.

Кредиты: детали вышеупомянутых команд взяты от https://gist.github.com/joseluisq/7f0f1402f05c45bac10814a9e38f81bf

2
ответ дан Adrian W 14 September 2019 в 16:15
поделиться
  • 1
    Для меня элемент имеет два атрибута - Значение и значение.. – Lars 9 June 2014 в 11:26
Другие вопросы по тегам:

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