Git - Risolvi gli errori

Errare è umano. Quindi ogni VCS fornisce una funzionalità per correggere gli errori fino a un certo punto. Git fornisce una funzionalità che possiamo usare per annullare le modifiche che sono state apportate al repository locale.

Si supponga che l'utente apporti accidentalmente alcune modifiche al proprio repository locale e quindi desideri annullarle. In questi casi, il filerevert l'operazione gioca un ruolo importante.

Annulla modifiche non confermate

Supponiamo che Jerry modifichi accidentalmente un file dal suo repository locale. Ma vuole annullare la sua modifica. Per gestire questa situazione, possiamo usare ilgit checkoutcomando. Possiamo usare questo comando per ripristinare il contenuto di un file.

[[email protected] src]$ pwd
/home/jerry/jerry_repo/project/src

[[email protected] src]$ git status -s
M string_operations.c

[[email protected] src]$ git checkout string_operations.c

[[email protected] src]$ git status –s

Inoltre, possiamo usare il git checkoutcomando per ottenere un file eliminato dal repository locale. Supponiamo che Tom cancelli un file dal repository locale e lo vogliamo indietro. Possiamo ottenere ciò utilizzando lo stesso comando.

[[email protected] src]$ pwd
/home/tom/top_repo/project/src

[[email protected] src]$ ls -1
Makefile
string_operations.c

[[email protected] src]$ rm string_operations.c

[[email protected] src]$ ls -1
Makefile

[[email protected] src]$ git status -s
D string_operations.c

Git sta mostrando la lettera Dprima del nome del file. Ciò indica che il file è stato eliminato dal repository locale.

[[email protected] src]$ git checkout string_operations.c

[[email protected] src]$ ls -1
Makefile
string_operations.c

[[email protected] src]$ git status -s

Note - Possiamo eseguire tutte queste operazioni prima del commit.

Rimuovi modifiche dall'area di gestione temporanea

Abbiamo visto che quando eseguiamo un'operazione di aggiunta, i file si spostano dal repository locale all'area di dichiarazione. Se un utente modifica accidentalmente un file e lo aggiunge nell'area di gestione temporanea, può annullare le modifiche utilizzando ilgit checkout comando.

In Git, c'è un puntatore HEAD che punta sempre all'ultimo commit. Se vuoi annullare una modifica dall'area staged, puoi usare il comando git checkout, ma con il comando checkout devi fornire un parametro aggiuntivo, cioè il puntatore HEAD. Il parametro aggiuntivo del puntatore del commit indica al comando git checkout di reimpostare l'albero di lavoro e anche di rimuovere le modifiche staged.

Supponiamo che Tom modifichi un file dal suo repository locale. Se visualizziamo lo stato di questo file, verrà mostrato che il file è stato modificato ma non aggiunto all'area di staging.

[email protected] src]$ pwd
/home/tom/top_repo/project/src
# Unmodified file

[[email protected] src]$ git status -s

# Modify file and view it’s status.
[[email protected] src]$ git status -s
M string_operations.c

[[email protected] src]$ git add string_operations.c

Lo stato di Git mostra che il file è presente nell'area di staging, ora ripristinalo utilizzando il comando git checkout e visualizza lo stato del file ripristinato.

[[email protected] src]$ git checkout HEAD -- string_operations.c

[[email protected] src]$ git status -s

Spostare il puntatore HEAD con Git Reset

Dopo aver apportato alcune modifiche, potresti decidere di rimuoverle. Il comando Git reset viene utilizzato per ripristinare o annullare le modifiche. Possiamo eseguire tre diversi tipi di operazioni di ripristino.

Il diagramma sottostante mostra la rappresentazione grafica del comando reset di Git.

Morbido

Ogni ramo ha un puntatore HEAD, che punta all'ultimo commit. Se usiamo il comando Git reset con l'opzione --soft seguita dall'ID commit, resetterà solo il puntatore HEAD senza distruggere nulla.

.git/refs/heads/masterfile memorizza l'ID di commit del puntatore HEAD. Possiamo verificarlo utilizzando ilgit log -1 comando.

[[email protected] project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1

Ora, visualizza l'ultimo ID commit, che corrisponderà all'ID commit sopra.

[[email protected] project]$ git log -2

Il comando precedente produrrà il seguente risultato.

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

Resettiamo il puntatore HEAD.

[[email protected] project]$ git reset --soft HEAD~

Ora, ripristiniamo semplicemente il puntatore HEAD di una posizione. Controlliamo il contenuto di.git/refs/heads/master file.

[[email protected] project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62

L'ID commit dal file è cambiato, ora verificalo visualizzando i messaggi di commit.

[email protected] project]$ git log -2

Il comando precedente produrrà il seguente risultato.

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

misto

Git reset con --mixed opzione ripristina le modifiche dall'area di staging che non sono state ancora salvate. Annulla le modifiche solo dall'area di sosta. Le modifiche effettive apportate alla copia di lavoro del file non vengono modificate. Il valore predefinito di Git reset è equivalente a git reset - mixed.

difficile

Se usi l'opzione --hard con il comando Git reset, cancellerà l'area di staging; ripristinerà il puntatore HEAD all'ultimo commit dell'ID commit specifico ed eliminerà anche le modifiche al file locale.

Controlliamo l'ID del commit.

[[email protected] src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry[email protected] src]$ git log -1

Il comando precedente produrrà il seguente risultato.

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

Removed executable binary

Jerry ha modificato un file aggiungendo un commento su una riga all'inizio del file.

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

Lo ha verificato utilizzando il comando git status.

[[email protected] src]$ git status -s
M string_operations.c

Jerry aggiunge il file modificato all'area di staging e lo verifica con il comando git status.

[[email protected] src]$ git add string_operations.c
[[email protected] src]$ git status

Il comando precedente produrrà il seguente risultato.

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

Lo stato di Git mostra che il file è presente nell'area di staging. Ora resetta HEAD con l'opzione - hard.

[[email protected] src]$ git reset --hard 577647211ed44fe2ae479427a0668a4f12ed71a1

HEAD is now at 5776472 Removed executable binary

Il comando Git reset è riuscito, che ripristinerà il file dall'area di staging e rimuoverà tutte le modifiche locali apportate al file.

[[email protected] src]$ git status -s

Lo stato di Git mostra che il file è stato ripristinato dall'area di staging.

[[email protected] src]$ head -2 string_operations.c
#include <stdio.h>

Il comando head mostra anche che l'operazione di reset ha rimosso anche le modifiche locali.