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 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.
El mode reset --mixed mou la referència de la branca actual al commit especificat.
Els canvis es conserven en el Directori de Treball.
Aquest es el comportament per defecte si no s'especifica cap altra opció.
git reset --mixed <ref>
Exemple: reset --mixed
Establim la referencia de la branca main al commit Canvi B.
En aquest cas, es perdran els canvis del commit Canvi C,
que es conservaran en el Directori de Treball.
jpuigcerver@fp:~/git_reset(main)$gitreset--mixed04fafb7
Unstaged changes after reset:M README.mdjpuigcerver@fp:~/git_reset(main)$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(main)$gitlga
*04fafb7-(0 seconds ago)Canvi B-Joan Puigcerver(HEAD -> main)*4dc7c85-(0 seconds ago)Canvi A-Joan Puigcerver*16786db-(0 seconds ago)Commit inicial-Joan Puigcerver
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(main)$gitreset--hard04fafb7
HEAD is now at 04fafb7 Canvi Bjpuigcerver@fp:~/git_reset(main)$gitstatus
On branch mainnothing to commit, working tree cleanjpuigcerver@fp:~/git_reset(main)$gitlga
*04fafb7-(0 seconds ago)Canvi B-Joan Puigcerver(HEAD -> main)*4dc7c85-(0 seconds ago)Canvi A-Joan Puigcerver*16786db-(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(main)$echo"- Canvi C">>README.md
jpuigcerver@fp:~/git_reset(main)$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(main)$gitreset--keep4dc7c85
error: Entry 'README.md' not uptodate. Cannot merge.fatal: Could not reset index file to revision '4dc7c85'.jpuigcerver@fp:~/git_reset(main)$gitlga
*04fafb7-(0 seconds ago)Canvi B-Joan Puigcerver(HEAD -> main)*4dc7c85-(0 seconds ago)Canvi A-Joan Puigcerver*16786db-(0 seconds ago)Commit inicial-Joan Puigcerver
L'opció git commit --amend permet realitzar canvis a l'últim commit realitzat.
Permet modificar el missatge de l'últim commit, afegir nous fitxers o afegir
nous canvis els fitxers del repositori, inclòs els que han segut modificats en aquest últim commit.
El funcionament d'aquesta ordre consisteix en crear un nou commit amb els canvis de l'Àrea de Preparació
i els canvis del commit anterior. A més, el nou commit substitueix l'anterior.
La sintaxi és:
gitcommit--amend[-m<missatge>]
-m <missatge>: Permet especificar un nou missatge per al commit.
Exemple: Amend
Hem modificat l'últim commitCanvi B,
on hem afegit canvis a README.md i modificat el missatge del commit.
jpuigcerver@fp:~/git_reset(main)$gitlga
*04fafb7-(0 seconds ago)Canvi B-Joan Puigcerver(HEAD -> main)*4dc7c85-(0 seconds ago)Canvi A-Joan Puigcerver*16786db-(0 seconds ago)Commit inicial-Joan Puigcerverjpuigcerver@fp:~/git_reset(main)$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(main)$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(main)$gitaddREADME.md
jpuigcerver@fp:~/git_reset(main)$gitcommit--amend-m"Canvi B i C"[main 3aedfd5] Canvi B i C Date: Sun Oct 20 20:21:37 2024 +0200 1 file changed, 2 insertions(+)jpuigcerver@fp:~/git_reset(main)$gitlga
*3aedfd5-(0 seconds ago)Canvi B i C-Joan Puigcerver(HEAD -> main)*4dc7c85-(0 seconds ago)Canvi A-Joan Puigcerver*16786db-(0 seconds ago)Commit inicial-Joan Puigcerver