Ci sono un certo numero di risposte qui con un'idea sbagliata git reset --soft
. Sebbene vi sia una condizione specifica in cui git reset --soft
cambierà HEAD
(a partire da uno stato di testa staccato), in genere (e per l'uso previsto), sposta il riferimento di ramo che hai attualmente estratto. Ovviamente non può farlo se non hai un ramo estratto (quindi la condizione specifica in cui git reset --soft
cambierà solo HEAD
).
Ho trovato che questo è il modo migliore di pensare git reset
. Non ti stai solo muovendo HEAD
( tutto lo fa ), stai anche spostando il riferimento del ramo , ad es master
. Questo è simile a ciò che accade quando si esegue git commit
(il ramo corrente si sposta insieme a HEAD
), tranne che invece di creare (e passare a) un nuovo commit, si passa a un precedente commit .
Questo è il punto reset
, cambiare un ramo in qualcosa di diverso da un nuovo commit, non cambiare HEAD
. Puoi vederlo nell'esempio di documentazione:
Annulla un commit, rendendolo un ramo argomento
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Hai fatto alcuni commit, ma ti rendi conto che erano prematuri nel ramo "master". Volete continuare a lucidarli in un ramo argomento, quindi create un ramo "topic / wip" fuori dall'HEAD corrente.
- Riavvolgi il ramo principale per sbarazzarti di questi tre commit.
- Passa al ramo "topic / wip" e continua a lavorare.
Qual è il punto di questa serie di comandi? Vuoi spostare un ramo , qui master
, quindi mentre hai fatto il master
check-out, corrigit reset
.
La risposta più votata qui è generalmente buona, ma ho pensato di aggiungere questo per correggere le diverse risposte con idee sbagliate.
Cambia il tuo ramo
git reset --soft <ref>
: reimposta il puntatore del ramo per il ramo attualmente estratto sul commit al riferimento specificato, <ref>
. I file nella directory di lavoro e nell'indice non vengono modificati. Commettere da questa fase ti riporterà al punto in cui eri prima del git reset
comando.
Cambia anche il tuo indice
git reset --mixed <ref>
o equivalentemente
git reset <ref>
:
Fa ciò che --soft
fa AND reimposta anche l'indice in modo che corrisponda al commit nel riferimento specificato. Mentre git reset --soft HEAD
non fa nulla (perché dice spostare il ramo estratto nel ramo estratto) git reset --mixed HEAD
, o equivalentementegit reset HEAD
, è un comando comune e utile perché reimposta l'indice sullo stato dell'ultimo commit.
Cambia anche la tua directory di lavoro
git reset --hard <ref>
: fa quello che --mixed
fa E sovrascrive anche la tua directory di lavoro. Questo comando è simile git checkout <ref>
, tranne per il fatto che (e questo è il punto cruciale reset
) tutte le forme di git reset
spostamento HEAD
a cui punta il ramo .
Una nota su "tale e tale comando sposta la TESTA":
Non è utile dire che un comando sposta il HEAD
. Qualsiasi comando che cambi dove ti trovi nella cronologia di commit sposta HEAD
. Questo è ciò che HEAD
è , un puntatore a ovunque tu sia. HEAD
sei tu , e così si sposterà ogni volta che lo fai.