Esistono due modi per gestirlo. Quale è più facile dipende dalla tua situazione
Ripristina
Se il commit di cui vuoi sbarazzarti è stato l'ultimo commit e non hai fatto alcun lavoro aggiuntivo che puoi semplicemente usare git-reset
git reset HEAD^
Riporta il tuo ramo al commit appena prima del tuo HEAD attuale. Tuttavia, in realtà non modifica i file nell'albero di lavoro. Di conseguenza, le modifiche apportate a quel commit vengono visualizzate come modificate: è come un comando "non impegnativo". In effetti, ho un alias per fare proprio questo.
git config --global alias.uncommit 'reset HEAD^'
Quindi puoi semplicemente utilizzarlo git uncommit
in futuro per eseguire il backup di un commit.
schiacciamento
Annullare un commit significa combinare due o più commit in uno. Lo faccio abbastanza spesso. Nel tuo caso hai una funzione metà impegnata e poi la finiresti e commetterai di nuovo con il messaggio di commit permanente e corretto.
git rebase -i <ref>
Dico sopra perché voglio chiarire che potrebbe trattarsi di un numero qualsiasi di commit. Esegui git log
e trova il commit di cui vuoi sbarazzarti, copia il suo SHA1 e usalo al posto di <ref>
. Git ti porterà in modalità rebase interattiva. Mostrerà tutti gli impegni tra il tuo stato attuale e qualunque cosa tu abbia messo al posto di <ref>
. Quindi, se <ref>
10 commit fa, ti mostrerà tutti i 10 commit.
Di fronte a ogni commit, avrà la parola pick
. Trova il commit si vuole sbarazzarsi di e cambiare da pick
a fixup
o squash
. Usare fixup
semplicemente i rigetti che eseguono il commit del messaggio e uniscono le modifiche al suo predecessore immediato nell'elenco. La squash
parola chiave fa la stessa cosa, ma consente di modificare il messaggio di commit del commit appena combinato.
Si noti che i commit verranno nuovamente impegnati nell'ordine in cui vengono visualizzati nell'elenco quando si esce dall'editor. Quindi, se hai effettuato un commit temporaneo, hai fatto altri lavori sullo stesso ramo e hai completato la funzione in un commit successivo, l'utilizzo di rebase ti consentirebbe di riordinare i commit e di schiacciarli.
AVVERTIMENTO:
Rebasing modifica la cronologia - NON eseguire questa operazione per tutti i commit che hai già condiviso con altri sviluppatori.
stashing
In futuro, per evitare questo problema, è consigliabile utilizzare git stash
per archiviare temporaneamente il lavoro senza commit.
git stash save 'some message'
Questo memorizzerà le tue attuali modifiche lateralmente nell'elenco degli stash. Sopra è la versione più esplicita del comando stash, che consente un commento per descrivere ciò che si sta nascondendo. Puoi anche semplicemente eseguire git stash
e nient'altro, ma nessun messaggio verrà memorizzato.
Puoi sfogliare l'elenco di stash con ...
git stash list
Questo ti mostrerà tutti i tuoi stash, su quali rami sono stati fatti, e il messaggio e all'inizio di ogni riga e identificatore per quello stash che assomiglia a questo stash@{#}
dove # è la sua posizione nella matrice di stash.
Per ripristinare uno stash (che può essere fatto su qualsiasi ramo, indipendentemente da dove lo stash è stato originariamente creato) devi semplicemente eseguire ...
git stash apply stash@{#}
Ancora una volta, c'è # la posizione nella matrice di stash. Se lo stash che si desidera ripristinare è nella 0
posizione, ovvero se era lo stash più recente. Poi si può solo eseguire il comando senza specificare la posizione di scorta, git assumerà si intende l'ultimo: git stash apply
.
Quindi, ad esempio, se mi trovo a lavorare sul ramo sbagliato, posso eseguire la seguente sequenza di comandi.
git stash
git checkout <correct_branch>
git stash apply
Nel tuo caso ti sei spostato un po 'di più nei rami, ma la stessa idea è ancora valida.
Spero che sia di aiuto.
git stash