L'ordre git reset ens permet moure la referència de la branca actual a qualsevol
altre commit del repositori.
Això significa que podem modificar la història del repositori local,
per ajustar o refer la història a les nostres necessitats.
Algunes de les accions que podem fer mitjançant aquestes eines són:
Desfer o modificar commits anteriors.
Reorganitzar els commits abans de publicar-los.
Moure punters de les branques.
Perill
Aquestes eines són molt potents, però cal tindre en compte que modificar la història del repositori
pot ser perillós.
Especialment, en les branques que ja han segut publicades (push), ja que pot ocasionar
problemes entre els col·laboradors del repositori.
Figura 1. Funcionament de git reset
Al moure la referència d'una branca, podem deixar enrere commits amb els seus canvis corresponents.
El com es gestionen aquests canvis dependrà del mode amb el qual executem l'ordre git reset:
--soft: Els canvis es conservaran a l'Àrea de Preparació.
--mixed: Comportament per defecte. Els canvis es conservaran al Directori de Treball.
--hard: Els canvis es descartaran.
Figura 2. Resum de l'eina git reset.
A més, aquesta ordre pot provocar que alguns commits perden totes les referències i,
per tant, seran esborrats pel recol·lector de brossa de Git.
Exemple
A la Figura 1 els commitsCanvi B i Canvi C
seran esborrats perquè han perdut tots les referències.
Preparació del repositori
Danger
Crea el nou repositori en una carpeta independent per evitar
problemes amb els exemples i exercicis anteriors.
El mode reset --hard mou la referència de la branca actual al commit especificat.
modificant l'estat del repositori i revertint-lo a la referència especificada.
Perill
Tots els canvis es descarten permanentment.
git reset --hard <ref>
Exemple: reset --hard
Establim la referencia de la branca main al commit Canvi B.
En aquest cas, es perdran els canvis del commit Canvi C,
que no es conservaran enlloc i no es podran 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 reset --keep és molt similar al comportament per defecte.
En aquest cas, no permet realitzar el reset si això comporta
que els canvis actuals del Directori de Treball siguen sobreescrits
per els canvis de l'operació de reset.
git reset --keep <ref>
Exemple: reset --keep
Com que realitzar el reset comportaria sobreescriure els canvis del Directori de Treball,
l'operació no es realitza.
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