2011-11-04 13 views
5

(Nota, non sto cercando la risposta git rebase -i)Come posso "riaprire" un commit Git?

in Mercurial, posso "riaprire" un commit importando nel mio coda delle patch:

hg qimport tip 

il commit è "aperto" nel senso che è proprio come prima che lo avessi commesso, posso ripristinare, fare hg diff, hg status, ecc. Come faccio a farlo in git?

(Tutto quello che ho trovato sul web suggerisce git rebase -i e quindi scegliere modificare, ma questo è diverso, perché il commit non è "aperta" allo stesso modo.)

+0

L'altra opzione è lasciare il commit lì, modificare alcune altre cose e quindi usarle per * modificare * il commit ('git commit --amend'). – Cascabel

risposta

16

Hai solo bisogno di spostare il puntatore di testa senza apportare alcuna modifica alla vostra copia di lavoro:

git reset --soft HEAD^ 

reset sposta il puntatore, e l'opzione morbida specifica che non dovrebbe modificare qualsiasi file. Il valore predefinito è misto, il che ripristinerà il tuo indice e l'opzione hard rimuoverà effettivamente le modifiche da quel commit nella tua copia di lavoro.

HEAD è un puntatore git "magico" che punta sempre sull'attuale ref (cioè il genitore della copia di lavoro). Il segno di omissione (^) indica il genitore. Puoi usarlo ripetutamente, ad es. HEAD ^^ si riferisce al genitore dell'ultimo commit.

+0

Ottima risposta, grazie! Potresti prendere nota del fatto che hai perso il messaggio di commit, come ha fatto @wulong? –

+0

Se si desidera usarlo ripetutamente, 'HEAD ^^^^^' è uguale a 'HEAD ~ 5'. (E più precisamente, 'HEAD' è un riferimento simbolico, che punta al ramo attualmente estratto, che punta al commit attualmente estratto, o direttamente a un commit se si è in stato HEAD staccato, senza alcun ramo controllato fuori.) – Cascabel

+3

@PaulBiggar: evitare di perdere il messaggio di commit è un ottimo motivo per modificare anziché reimpostare. Se resetti, puoi comunque recuperare indirettamente il messaggio di commit, comunque. 'HEAD @ {1}' si riferisce al commit precedentemente estratto, che (se non hai fatto altro) sarà il commit pre-reset. Puoi usare 'git commit -c HEAD @ {1}' per usare il suo messaggio di commit come punto di partenza. (Se hai spostato HEAD da allora, puoi usare 'git reflog' per trovare il commit più indietro nei reflog.) – Cascabel

2

Supponendo che non hai ancora trasferito al repository remoto, git reset --soft HEAD^ "riaprirà" l'ultimo commit a spese della perdita del messaggio di commit.

2

È possibile ottenere lo stesso risultato utilizzando git commit --amend.

Vedi comparison chart tra Hg & Git.