Откройте файл в режиме добавления, как со следующим кодом:
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true));
После того как Вы знаете, что хеш притона фиксирует Вас отброшенный, можно применить его как притон:
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
.
git fsck --unreachable | grep commit
должен показать sha1, хотя список, который он возвращает, мог бы быть довольно большим. git show <sha1>
покажет, является ли это фиксация, Вы хотите.
git cherry-pick -m 1 <sha1>
объединит фиксацию на текущее ответвление.
Я только что создал команду, которая помогла мне найти мой потерянный коммит:
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
Мне понравился подход Аристотеля, но мне не нравилось использовать GITK ... так как я привык использовать GIT из командной строки.
Вместо этого я взял оборванные коммиты и вывел код в файл DIFF для просмотра в моем редакторе кода.
git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff
Теперь вы можете загрузить полученный файл diff / txt (он находится в вашей домашней папке) в ваш текстовый редактор и увидеть фактический код и полученный SHA.
Тогда просто используйте
git stash apply ad38abbf76e26c803b27a6079348192d32f52219
Просто требуемый для упоминания этого дополнения к принятому решению. Это не было сразу очевидно для меня в первый раз, когда я попробовал этот метод (возможно, это должно было быть), но применять притон от значения хэш-функции, просто используйте "притон мерзавца, применяются ":
$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219
, Когда я был плохо знаком с мерзавцем, это не было ясно мне, и я пробовал различные комбинации "шоу мерзавца", "мерзавец подает заявку", "патч", и т.д.
Моим фаворитом является эта острота:
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