L'ordre git reset permet moure la referència de la branca actual a qualsevol altre commit del repositori.
Això significa que es pot modificar la història del repositori local per ajustar-la o refer-la
segons les necessitats. Per exemple, permet:
Desfer o modificar commits anteriors: per corregir errors abans de compartir-los.
Reorganitzar els commits abans de publicar-los: per deixar una història més neta.
Moure els punters de les branques: per situar una branca en un altre commit.
git reset modifica la història del repositori i això pot ser perillós.
Sobretot en les branques que ja s'han publicat (push), ja que pot ocasionar problemes
a la resta de persones que col·laboren en el repositori.
Figura 1. Funcionament de git reset.
En moure la referència d'una branca, es poden deixar enrere commits amb els seus canvis.
Com es gestionen aquests canvis depén del mode amb què s'executa l'ordre git reset:
--soft: els canvis es conserven en l'Àrea de preparació.
--mixed: els canvis es conserven en el Directori de treball. És el comportament per defecte.
--hard: els canvis es descarten.
Figura 2. Resum de la ferramenta git reset.
A més, aquesta ordre pot provocar que alguns commits perden totes les referències i que,
per tant, el recol·lector de fem de Git els esborre. Per exemple, en la Figura 1,
els commitsCanvi B i Canvi C s'esborraran perquè han perdut totes les referències.
Preparació del repositori
El repositori dels exemples es prepara amb les ordres següents:
El mode --soft mou la referència de la branca actual al commit especificat
i conserva en l'Àrea de preparació els canvis dels commits que es deixen enrere.
gitreset--soft<ref>
Exemple: reset --soft
Es mou la referència de la branca main al commitCanvi B.
Els canvis del commitCanvi C es conserven en l'Àrea de preparació.
jpuigcerver@fp:~/git_reset$gitreset--soft8999e85
jpuigcerver@fp:~/git_reset$gitstatus
On branch mainChanges to be committed: (use "git restore --staged <file>..." to unstage)modified: README.mdjpuigcerver@fp:~/git_reset$gitdiff--staged
diff --git a/README.md b/README.mdindex dc7fc7d..d05d0d2 100644--- a/README.md+++ b/README.md@@ -1,3 +1,4 @@# Git reset i commit --amend
- Canvi A
- Canvi B
+- Canvi Cjpuigcerver@fp:~/git_reset$gitlga
*8999e85-(0 seconds ago)Canvi B-Joan Puigcerver(HEAD -> main)*ff64d47-(0 seconds ago)Canvi A-Joan Puigcerver*5f92181-(0 seconds ago)Commit inicial-Joan Puigcerver
El mode --mixed mou la referència de la branca actual al commit especificat
i conserva els canvis en el Directori de treball. És el comportament per defecte si no s'especifica cap mode.
gitreset--mixed<ref>
Exemple: reset --mixed
Es mou la referència de la branca main al commitCanvi B.
Els canvis del commitCanvi C es conserven en el Directori de treball.
jpuigcerver@fp:~/git_reset$gitreset--mixed8999e85
Unstaged changes after reset:M README.mdjpuigcerver@fp:~/git_reset$gitstatus
On branch mainChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory)modified: README.mdno changes added to commit (use "git add" and/or "git commit -a")jpuigcerver@fp:~/git_reset$gitdiff
diff --git a/README.md b/README.mdindex dc7fc7d..d05d0d2 100644--- a/README.md+++ b/README.md@@ -1,3 +1,4 @@# Git reset i commit --amend
- Canvi A
- Canvi B
+- Canvi Cjpuigcerver@fp:~/git_reset$gitlga
*8999e85-(0 seconds ago)Canvi B-Joan Puigcerver(HEAD -> main)*ff64d47-(0 seconds ago)Canvi A-Joan Puigcerver*5f92181-(0 seconds ago)Commit inicial-Joan Puigcerver
El mode --hard mou la referència de la branca actual al commit especificat
i torna tot el repositori a l'estat d'aquesta referència.
gitreset--hard<ref>
Tots els canvis es descarten permanentment.
Exemple: reset --hard
Es mou la referència de la branca main al commitCanvi B.
Els canvis del commitCanvi C no es conserven enlloc i no es poden recuperar.
jpuigcerver@fp:~/git_reset$gitreset--hard8999e85
HEAD is now at 8999e85 Canvi Bjpuigcerver@fp:~/git_reset$gitstatus
On branch mainnothing to commit, working tree cleanjpuigcerver@fp:~/git_reset$gitlga
*8999e85-(0 seconds ago)Canvi B-Joan Puigcerver(HEAD -> main)*ff64d47-(0 seconds ago)Canvi A-Joan Puigcerver*5f92181-(0 seconds ago)Commit inicial-Joan Puigcerver
El mode --keep és molt semblant al comportament per defecte. La diferència és que no permet fer
el reset si això implica sobreescriure els canvis actuals del Directori de treball.
gitreset--keep<ref>
Exemple: reset --keep
Es prova de moure la referència de la branca actual amb canvis pendents en el Directori de treball.
jpuigcerver@fp:~/git_reset$echo"- Canvi C">>README.md
jpuigcerver@fp:~/git_reset$gitstatus
On branch mainChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory)modified: README.mdno changes added to commit (use "git add" and/or "git commit -a")jpuigcerver@fp:~/git_reset$gitreset--keepff64d47
error: Entry 'README.md' not uptodate. Cannot merge.fatal: Could not reset index file to revision 'ff64d47'.jpuigcerver@fp:~/git_reset$gitlga
*8999e85-(0 seconds ago)Canvi B-Joan Puigcerver(HEAD -> main)*ff64d47-(0 seconds ago)Canvi A-Joan Puigcerver*5f92181-(0 seconds ago)Commit inicial-Joan Puigcerver
S'observa que, com que el reset sobreescriuria els canvis del Directori de treball,
l'operació no es fa.