Marcin Morawski

Git - odzyskanie zatwierdzonych zmian (commits) po wywołaniu git reset –hard

Jeśli wywołaliśmy polecenie

git reset --hard origin/master

ale wcześniej zatwierdziliśmy zmiany poprzez git commit, to jesteśmy w stanie odzyskać utracone zmiany. A przynajmniej do momentu kiedy git nie wykona garbage collection. Możemy to zrobić za pomocą polecenia git reflog albo git fsck.

reflog

Polecenie reflog wyświetla informacje o aktualizacji wskaźnika HEAD w Git. Pokazuje do którego zatwierdzenia (commit) wskazywał wskaźnik HEAD. To jest historia, która mówi jak poruszaliśmy się po naszym repozytorium. Zasadniczo wszystko co powoduje, że HEAD wskazuje na coś nowego, jest zapisywane w dzienniku zmian. Wykonując polecenie reflog, możemy znaleźć utracone zatwierdzenia, na które nie wskazuje żadna z gałęzi.

Wywołujemy polecenie git reflog

git reflog
c7c64e5 HEAD@{0}: reset: moving to origin/master
c4c8b13 HEAD@{1}: commit: commit changes after apply patch
8d2a0d3 HEAD@{2}: commit: add php-version script and patch
000a487 HEAD@{3}: commit: add user gem bin dir to PATH env
2b4196e HEAD@{4}: commit: remove system composer's bin dirs (/usr/share/composer/) from PATH env
d551f70 HEAD@{5}: commit: climate autocompletion
0960885 HEAD@{6}: commit: enable enhancd
87838c9 HEAD@{7}: commit: cpu alias
e2e9a77 HEAD@{8}: pull origin master: Fast-forward
cdfa380 HEAD@{9}: commit: zypper search in filelist alias
cd74a8d HEAD@{10}: commit: extract tar.xz file

Interesuje mnie zmiana c4c8b13, więc przełączam się do tej wersji.

git checkout c4c8b13
Note: checking out 'c4c8b13'.

Sprawdzam czy jestem na dobrej rewizji.

git log --decorate
commit c4c8b134d62ef19aa20d80f50c87a88e72ce1d86 (HEAD)
Author: Marcin Morawski <marcin@morawskim.pl>
Date:   Sun May 14 11:31:12 2017 +0200

    commit changes after apply patch

Następnie generuje plik patch z zmianami, które utraciłem.

git format-patch HEAD~2
0001-add-php-version-script-and-patch.patch
0002-commit-changes-after-apply-patch.patch

Przechodzę na gałąź master.

git checkout master
Warning: you are leaving 2 commits behind, not connected to
any of your branches:

  c4c8b13 commit changes after apply patch
  8d2a0d3 add php-version script and patch

Nakładam zmiany.

git am 000*patch
Applying: add php-version script and patch
....

Sprawdzam czy wszystko jest poprawnie wykonane.

git log --oneline
58a528b commit changes after apply patch
69acd2d add php-version script and patch
c7c64e5 alias climate
19e1532 composer bash autocomplete

fsck

Innym narzędziem, który może nam pomóc w znalezieniu i odzyskaniu zatwierdzeń (commits) jest git fsck. Polecenie te testuje bazę obiektów i sprawdza połączenia między obiektami. Te polecenie zastosujemy w scenariuszu znalezienia obiektów, które nie są dostępne z żadnej referencji (np. nazwa gałęzi).

git fsck --unreachable