Git - napraw błędy

Błądzić jest rzeczą ludzką. Tak więc każdy VCS zapewnia funkcję naprawiania błędów do pewnego momentu. Git udostępnia funkcję, której możemy użyć do cofnięcia modyfikacji, które zostały wprowadzone w lokalnym repozytorium.

Załóżmy, że użytkownik przypadkowo wprowadza pewne zmiany w swoim repozytorium lokalnym, a następnie chce je cofnąć. W takich przypadkachrevert operacja odgrywa ważną rolę.

Cofnij niezatwierdzone zmiany

Załóżmy, że Jerry przypadkowo modyfikuje plik w swoim lokalnym repozytorium. Ale chce cofnąć swoją modyfikację. Aby poradzić sobie z tą sytuacją, możemy użyćgit checkoutKomenda. Możemy użyć tego polecenia, aby przywrócić zawartość pliku.

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git status -s
M string_operations.c

[jerry@CentOS src]$ git checkout string_operations.c

[jerry@CentOS src]$ git status –s

Ponadto możemy użyć git checkoutpolecenie uzyskania usuniętego pliku z lokalnego repozytorium. Załóżmy, że Tomek usuwa plik z lokalnego repozytorium i chcemy ten plik z powrotem. Możemy to osiągnąć za pomocą tego samego polecenia.

[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src

[tom@CentOS src]$ ls -1
Makefile
string_operations.c

[tom@CentOS src]$ rm string_operations.c

[tom@CentOS src]$ ls -1
Makefile

[tom@CentOS src]$ git status -s
D string_operations.c

Git pokazuje list Dprzed nazwą pliku. Oznacza to, że plik został usunięty z lokalnego repozytorium.

[tom@CentOS src]$ git checkout string_operations.c

[tom@CentOS src]$ ls -1
Makefile
string_operations.c

[tom@CentOS src]$ git status -s

Note - Możemy wykonać wszystkie te operacje przed zatwierdzeniem.

Usuń zmiany z obszaru przejściowego

Widzieliśmy, że kiedy wykonujemy operację dodawania, pliki są przenoszone z lokalnego repozytorium do obszaru określania. Jeśli użytkownik przypadkowo zmodyfikuje plik i doda go do obszaru przemieszczania, może cofnąć swoje zmiany, używającgit checkout Komenda.

W Git jest jeden wskaźnik HEAD, który zawsze wskazuje na najnowsze zatwierdzenie. Jeśli chcesz cofnąć zmianę z obszaru pomostowego, możesz użyć polecenia git checkout, ale w przypadku polecenia checkout musisz podać dodatkowy parametr, tj. Wskaźnik HEAD. Dodatkowy parametr wskaźnika zatwierdzenia instruuje polecenie git checkout, aby zresetować drzewo robocze, a także usunąć wprowadzone zmiany.

Załóżmy, że Tom modyfikuje plik w swoim lokalnym repozytorium. Jeśli sprawdzimy stan tego pliku, pokaże on, że plik został zmodyfikowany, ale nie został dodany do obszaru przemieszczania.

tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
# Unmodified file

[tom@CentOS src]$ git status -s

# Modify file and view it’s status.
[tom@CentOS src]$ git status -s
M string_operations.c

[tom@CentOS src]$ git add string_operations.c

Stan Git pokazuje, że plik jest obecny w obszarze przejściowym, teraz przywróć go za pomocą polecenia git checkout i wyświetl stan przywróconego pliku.

[tom@CentOS src]$ git checkout HEAD -- string_operations.c

[tom@CentOS src]$ git status -s

Przesuń wskaźnik HEAD za pomocą Git Reset

Po wprowadzeniu kilku zmian możesz zdecydować się je usunąć. Polecenie resetowania Git służy do resetowania lub cofania zmian. Możemy wykonać trzy różne rodzaje operacji resetowania.

Poniższy diagram przedstawia obrazkową reprezentację polecenia resetowania Git.

Miękki

Każda gałąź ma wskaźnik HEAD, który wskazuje na najnowsze zatwierdzenie. Jeśli użyjemy polecenia resetowania Git z opcją --soft, po której nastąpi identyfikator zatwierdzenia, to zresetuje tylko wskaźnik HEAD bez niszczenia czegokolwiek.

.git/refs/heads/masterplik przechowuje identyfikator zatwierdzenia wskaźnika HEAD. Możemy to zweryfikować za pomocągit log -1 Komenda.

[jerry@CentOS project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1

Teraz zobacz najnowszy identyfikator zatwierdzenia, który będzie zgodny z powyższym identyfikatorem zatwierdzenia.

[jerry@CentOS project]$ git log -2

Powyższe polecenie da następujący wynik.

commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary


commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary

Zresetujmy wskaźnik HEAD.

[jerry@CentOS project]$ git reset --soft HEAD~

Teraz po prostu cofamy wskaźnik HEAD o jedną pozycję. Sprawdźmy zawartość.git/refs/heads/master file.

[jerry@CentOS project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62

Identyfikator zatwierdzenia z pliku został zmieniony, teraz sprawdź go, przeglądając komunikaty o zatwierdzeniach.

jerry@CentOS project]$ git log -2

Powyższe polecenie da następujący wynik.

commit 29af9d45947dc044e33d69b9141d8d2dad37cc62
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:16:25 2013 +0530

Added compiled binary


commit 94f7b26005f856f1a1b733ad438e97a0cd509c1a
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 10:08:01 2013 +0530

Added Makefile and renamed strings.c to string_operations.c

mieszany

Resetowanie Git z opcją --mixed przywraca te zmiany z obszaru przejściowego, które nie zostały jeszcze zatwierdzone. Cofa zmiany tylko z obszaru przejściowego. Faktyczne zmiany dokonane w kopii roboczej pliku pozostają niezmienione. Domyślny reset Git jest równoważny z resetem git - mixed.

ciężko

Jeśli użyjesz opcji --hard z poleceniem resetowania Git, wyczyści to obszar przemieszczania; zresetuje wskaźnik HEAD do ostatniego zatwierdzenia określonego identyfikatora zatwierdzenia i usunie również zmiany w pliku lokalnym.

Sprawdźmy identyfikator zatwierdzenia.

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git log -1

Powyższe polecenie da następujący wynik.

commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Jerry zmodyfikował plik, dodając jednowierszowy komentarz na początku pliku.

[jerry@CentOS src]$ head -2 string_operations.c
/* This line be removed by git reset operation */
#include <stdio.h>

Sprawdził to za pomocą polecenia git status.

[jerry@CentOS src]$ git status -s
M string_operations.c

Jerry dodaje zmodyfikowany plik do obszaru przemieszczania i weryfikuje go za pomocą polecenia git status.

[jerry@CentOS src]$ git add string_operations.c
[jerry@CentOS src]$ git status

Powyższe polecenie da następujący wynik.

# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
#
modified: string_operations.c
#

Stan Git wskazuje, że plik znajduje się w obszarze przejściowym. Teraz zresetuj HEAD z opcją - twardą.

[jerry@CentOS src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1

HEAD is now at 5776472 Removed executable binary

Polecenie resetowania Git powiodło się, co spowoduje przywrócenie pliku z obszaru przemieszczania, a także usunięcie wszelkich lokalnych zmian dokonanych w pliku.

[jerry@CentOS src]$ git status -s

Stan Git wskazuje, że plik został wycofany z obszaru przemieszczania.

[jerry@CentOS src]$ head -2 string_operations.c
#include <stdio.h>

Polecenie head pokazuje również, że operacja resetowania usunęła również lokalne zmiany.