Git - reset bo czasem trzeba cofnąć

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 516 razy

Polecenie reset umożliwia resetowanie commit-owanych ale tylko w kolejności od najstarszego w dół. Nie można cofnąć zmian konkretnego wybranego commit-a, który znajduje się pomiędzy innymi bez cofnięcia zmian wcześniej utworzonych commitów.

Resetowanie z domyślnymi ustawieniami powoduje usunięcie commit-a z ich zachowaniem w strukturze projektu. Zmiany są również usunięte z listy wyboru plików przeznaczonych do commit-a. Stworzę więc najpierw jakąś drobną zmianę a następnie ją commit-uję:

git add todo.txt
git commit -m "new todo things"
[005_add_merging_operations_types 8ecb7c1] new todo things
 1 file changed, 1 insertion(+)

a następnie usunę:

git reset HEAD~1
Unstaged changes after reset:
M       todo.txt

Używając log możesz przekonać się, że commit w tajemniczych okolicznościach zniknął. Opcja HEAD~1 określa ile commit-ów ma zostać cofniętych.

Jeżeli teraz wpiszesz:

git status

i zatwierdzisz, to możesz zobaczyć, że twoja zmiana istnieje ale nie została wybrana:

On branch 005_add_merging_operations_types
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   todo.txt

no changes added to commit (use "git add" and/or "git commit -a")

Istnieją też inne opcje cofania zmian, np:

git reset --soft HEAD~1

I cóż teraz status pokaże:

git status
On branch 005_add_merging_operations_types
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        modified:   todo.txt

Ostatni sposób cofania zmian usuwający całkowicie zmiany to:

git reset --hard HEAD~1
HEAD is now at 9d2feaf add style for ul elements

Po tym poleceniu status pokaże:

git status
On branch 005_add_merging_operations_types
nothing to commit, working tree clean

Także jak widać trzeba uważać z ostatnią opcją.