Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

Git. Работа с заначкой (Stash)

Добрый день!
Я сделал часть работы в ветке(условно old_branch). Далее мне понадобилось перенести эту работу в другую ветку(условно new_branch). Так как работа не закончена, я не стал комитить изменения, а воспользовался заначкой(stash)
$ git stash $ git stash branch new_branch
У меня создалась новая ветка new_branch, в которую перенеслись мои незакомиченные изменения. Все ОК.
Далее я вернулся на старую ветку и восстановил ее состояние до моих изменений
$ git checkout old_branch $ git checkout -- .
Изменения откатились не только в старой ветке, но и в новой тоже (WTF?). Понимаю что незакомиченные изменения потеряны навсегда, но есть ли способ восстановить заначку из новой ветки?


Ответ

У меня создалась новая ветка new_branch, в которую перенеслись мои незакомиченные изменения.
нет, они не «перенеслись». просто была создана новая ветка, копия той, в которой была создана «заначка» (stash), т.е., создан новый указатель на тот же самый коммит, который был текущим во время создания «заначки», затем эта новая ветка была назначена текущей, к рабочему каталогу (working directory) были применены сохранённые в «заначке» изменения, а сама «заначка» была удалена.
раз вы сразу после этого выполнили команду checkout (с аргументом ), то изменения в рабочем каталоге были удалены

восстановить удалённую «заначку» теоретически можно (до проведения «сборки мусора»). пример:
$ git fsck --no-reflog Checking object directories: 100% (256/256), done. dangling commit 424c2946da3bfe5cbc719f808c1a006612e5cab7
найденный «подвисший» (dangling) коммит и является удалённой (мною) «заначкой». с этим хэшем можно манипулировать как с «обычной заначкой»:
$ git show 424c294 commit 424c2946da3bfe5cbc719f808c1a006612e5cab7 Merge: 3330f58 8a98560 Author: aleksandr barakin Date: Fri Oct 6 12:46:55 2017 +0300
WIP on master: 3330f58 20171006124552
diff --cc file index abf3108,abf3108..e1743f8 --- a/file +++ b/file @@@ -1,1 -1,1 +1,2 @@@ 2017-10-06 12:45 ++2017-10-06 12:46
$ git stash show -p 424c294 diff --git a/file b/file index abf3108..e1743f8 100644 --- a/file +++ b/file @@ -1 +1,2 @@ 2017-10-06 12:45 +2017-10-06 12:46
$ git stash apply 424c29 On branch new Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory)
modified: file
no changes added to commit (use "git add" and/or "git commit -a")

Комментариев нет:

Отправить комментарий