Com fer amb Git: Desfer compromís

De vegades podríeu cometre canvis a la vostra representació de Git, però aleshores us adoneu que heu comès un error. Ara voleu desfer aquests compromisos perquè el vostre codi torni a funcionar.


En aquesta guia, veurem l’ordre de restabliment de git per a compromisos locals i remots a un dipòsit.

Diferència entre un restabliment de git i el de revertiment de git

És important comprendre la diferència entre restablir i revertir compromisos quan feu servir Git.

  • La comanda de restabliment de git anul·la els compromisos suprimint els compromisos anteriors del dipòsit i restablint el GIT HEAD a un compromís anterior. Es pot perdre una mica d’historial de Git fent això, depenent de quina opció s’utilitzi.
  • La comanda git revert anul·la els compromisos creant un nou compromís que representa un estat anterior del dipòsit. No es perdrà l’historial de Git fent això.

Ja heu empès els canvis i algú altre ha tret aquests canvis? No heu d’utilitzar restabliment de git per desfer canvis, haureu d’utilitzar git revert tal com es descriu a la nostra guia de compromisos de recuperació de Git..

Usant la comanda de restabliment de git per desfer un compromís

Per als exemples següents, suposem que el nostre arbre Git local sembla aquest:

1
2
3

    X

    |

A-B-C

El X representa el canvi local, no compromès, de la nostra Git HEAD, indicat per C.

Per desfer el compromís anomenat “C “A causa d’un error, podem executar una ordre de restabliment de git.

En funció de les necessitats de seguiment de fitxers, voldreu utilitzar l’ordre de restabliment de git amb diferents indicadors.

Cas 1: utilitzeu reset git i traieu fitxers de l’àrea d’escenificació

Podem utilitzar la comanda git reflog per veure el nostre historial de Git.

Podem utilitzar git ls-files per veure els fitxers actualitzats per al nostre projecte:

1
2
3
4
5
6
7
8
9
10

$ Git reflog

f326d13 HEAD @ {0}: commit: S’ha afegit C

358d535 HEAD @ {1}: commit: afegit B

00b61d5 HEAD @ {2}: commit (inicial): S’ha afegit A

 

$ Git ls-files

A
B
C
X

Per mantenir qualsevol fitxer de seguiment des del compromís C, però suprimiu-los de l’índex de Git, podeu executar:

1 Restabliment GIT HEAD ~ 1

Podeu utilitzar la drecera de Git de HEAD ~ 1 per eliminar el compromís de compromís abans de HEAD.

Si heu utilitzat HEAD ~ 5, això eliminaria el compromís que hi ha cinc comissions abans de HEAD.

Canvis a l’índex de Git, també anomenada “zona de posada en escena”, es perdrà, per la qual cosa l’arbre Git seria:

1
2
3

  X

  |

A-B

Què podem confirmar amb aquestes ordres:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

$ Git reflog

358d535 HEAD @ {0}: restabliment: desplaçament a HEAD ~ 1

f326d13 HEAD @ {1}: commit: S’ha afegit C

358d535 HEAD @ {2}: commit: afegit B

00b61d5 HEAD @ {3}: commit (inicial): S’ha afegit A

 

$ Git ls-files

A
B
 

$ Estat de git

En branca mestra

Fitxers no controlats:

  (ús "Git add …" incloure el que es compromet)

 

        C

        X

 

Quan només utilitzeu restabliment de git sense banderes, no suprimirem cap fitxer; només no estan en escena:

1
2

$ ls

A B C X

Tot i així, acabeu suprimint l’entrada del registre del compromís que heu restablit, però:

1
2
3
4
5
6
7
8
9
10
11
12

$ Registre de Git

commit 358d535bc5e06730e61d272be34a6d0e568f42af

Autor: Usuari < [email protected]>

Data: dim. 10 feb 13:54:55 2015 -0500

 

    S’ha afegit B

 

cometre 00b61d53fe06ee672fa0497b175fb7bd89e26b72

Autor: Usuari < [email protected]>

Data: dim. 10 feb 13:54:55 2015 -0500

 

    S’ha afegit A

Cas 2: utilitzeu git reset –soft i preserva canvis als fitxers

Si feu servir el senyalador –soft, es mantindran els canvis dels fitxers rastrejats i l’índex Git:

1 Restabliment Git –soft HEAD ~ 1

Els fitxers que es posen en escena es mantenen així, i no se suprimeix físicament cap fitxer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$ Git ls-files

A
B
C
X
 

$ ls

A B C X

 

$ Estat de git

En branca mestra

Canvis a realitzar:

  (ús "Restablir GIT HEAD …" desmarcar)

 

        nou fitxer: C

        fitxer nou: X

Mitjançant el senyalador –soft, encara suprimiu l’entrada de registre del compromís que heu restablit.

Cas 2: utilitzeu git reset –hard i elimineu tots els canvis als fitxers

Si feu servir el senyalador –hard, es perden tots els canvis als fitxers rastrejats i l’índex Git:

1
2

$ Restableix $ Git –hard HEAD ~ 1

HEAD es troba ara a 3bf1b55 Afegida B

Tots els fitxers posteriors al compromís que heu restablit són desactivats i eliminats físicament:

1
2
3
4
5
6
7
8
9
10

$ Git ls-files

A
B
 

$ ls

A B

 

$ Estat de git

En branca mestra

res a cometre, directori que funciona net

Torneu a eliminar l’entrada del registre de Git per al compromís que heu restablit.

Proveu d’utilitzar git revert quan ja s’han publicat els compromisos

Com s’ha dit anteriorment, si ja heu empès els vostres canvis i algú hagi introduït aquests canvis, no haureu d’utilitzar reset git per desfer canvis, sinó que utilitzeu git revert..

Tanmateix, si realment voleu, podeu aplicar els mateixos passos que a la secció anterior per eliminar alguns compromisos anteriors de Git.

Després d’això, podeu fer un push -f git per utilitzar l’opció de força. Un cop més, això no és recomanable, perquè pot crear conflictes greus entre els diversos estats del dipòsit d’altres usuaris de Git.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me