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.
[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
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.
[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 sta mostrando la lettera Dprima del nome del file. Ciò indica che il file è stato eliminato dal repository locale.
[tom@CentOS src]$ git checkout string_operations.c
[tom@CentOS src]$ ls -1
Makefile
string_operations.c
[tom@CentOS 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.
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
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.
[tom@CentOS src]$ git checkout HEAD -- string_operations.c
[tom@CentOS 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.
[jerry@CentOS project]$ cat .git/refs/heads/master
577647211ed44fe2ae479427a0668a4f12ed71a1
Ora, visualizza l'ultimo ID commit, che corrisponderà all'ID commit sopra.
[jerry@CentOS 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.
[jerry@CentOS project]$ git reset --soft HEAD~
Ora, ripristiniamo semplicemente il puntatore HEAD di una posizione. Controlliamo il contenuto di.git/refs/heads/master file.
[jerry@CentOS project]$ cat .git/refs/heads/master
29af9d45947dc044e33d69b9141d8d2dad37cc62
L'ID commit dal file è cambiato, ora verificalo visualizzando i messaggi di commit.
jerry@CentOS 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.
[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src
[jerry@CentOS 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.
[jerry@CentOS 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.
[jerry@CentOS 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.
[jerry@CentOS src]$ git add string_operations.c
[jerry@CentOS 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.
[jerry@CentOS 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.
[jerry@CentOS src]$ git status -s
Lo stato di Git mostra che il file è stato ripristinato dall'area di staging.
[jerry@CentOS 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.