Mi sono impegnato accidentalmente nel ramo sbagliato. Come posso eliminare quel commit?
Mi sono impegnato accidentalmente nel ramo sbagliato. Come posso eliminare quel commit?
Risposte:
Elimina il commit più recente, mantenendo il lavoro svolto:
git reset --soft HEAD~1
Elimina il commit più recente, distruggendo il lavoro svolto:
git reset --hard HEAD~1
git reset --hard origin
git remote
origini delle liste di pensieri . Perché? git reset --hard origin
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
git reset HEAD~1
manterrà anche tutte le modifiche ma ti lascerà con un indice vuoto anziché mantenere tutto (come --soft
farebbe l' opzione).
Mi chiedo perché la migliore risposta che ho trovato sia solo nei commenti! ( di Daenyth con 86 voti positivi )
git reset --hard origin
Questo comando sincronizzerà il repository locale con il repository remoto eliminando tutte le modifiche apportate sul locale. Puoi anche fare quanto segue per recuperare il ramo esatto che hai nell'origine.
git reset --hard origin/<branch>
git reset --hard origin/<branch>
git reset --soft origin/<branch>
, se si desidera eliminare il commit ma mantenere il lavoro locale.
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
, è necessario specificare il ramo come:git reset --hard origin/feature/my-cool-stuff
Non eliminarlo: per un solo commit git cherry-pick
è sufficiente.
Ma se hai avuto diversi commit sul ramo sbagliato, è qui che git rebase --onto
brilla:
Supponi di avere questo:
x--x--x--x <-- master
\
-y--y--m--m <- y branch, with commits which should have been on master
, quindi puoi contrassegnarlo master
e spostarlo dove vorresti essere:
git checkout master
git branch tmp
git checkout y
git branch -f master
x--x--x--x <-- tmp
\
-y--y--m--m <- y branch, master branch
, reimposta il ramo y dove avrebbe dovuto essere:
git checkout y
git reset --hard HEAD~2 # ~1 in your case,
# or ~n, n = number of commits to cancel
x--x--x--x <-- tmp
\
-y--y--m--m <- master branch
^
|
-- y branch
e infine sposta i tuoi commit (riapplicali, effettuando effettivamente nuovi commit)
git rebase --onto tmp y master
git branch -D tmp
x--x--x--x--m'--m' <-- master
\
-y--y <- y branch
Se si desidera spostare quel commit in un altro ramo, ottenere lo SHA del commit in questione
git rev-parse HEAD
Quindi cambiare il ramo corrente
git checkout other-branch
E cherry-pick
l'impegno aother-branch
git cherry-pick <sha-of-the-commit>
git reset --hard HEAD~1
successivo. Penso che l'utilizzo di un reset --soft
cambio di succursale e un nuovo impegno avrebbero risparmiato lavoro extra. Poi di nuovo stavo usando SourceTree per fare la maggior parte delle mie cose di base, solo con la riga di comando dopo questo errore.
Per tuo riferimento, credo che tu possa "tagliare" il commit dal tuo ramo attuale non solo con git reset --hard, ma anche con il seguente comando:
git checkout -B <branch-name> <SHA>
Infatti, se non ti interessa fare il check-out, puoi impostare il ramo su quello che vuoi con:
git branch -f <branch-name> <SHA>
Questo sarebbe un modo programmatico per rimuovere i commit da un ramo, per esempio, al fine di copiare nuovi commit su di esso (usando rebase).
Supponiamo di avere un ramo disconnesso dal master perché hai preso le fonti da un'altra posizione e l'hai scaricato nel ramo.
Ora hai un ramo in cui hai applicato le modifiche, chiamiamolo "argomento".
Ora creerai un duplicato del tuo ramo argomento e poi lo riposizionerai sul dump del codice sorgente che si trova nel ramo "dump":
git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate
Ora le tue modifiche vengono riapplicate nel ramo topic_duplicate in base al punto iniziale di "dump", ma solo i commit che sono avvenuti dopo "master". Quindi le tue modifiche dal master ora vengono riapplicate in cima a "dump" ma il risultato finisce in "topic_duplicate".
È quindi possibile sostituire "dump" con "topic_duplicate" eseguendo:
git branch -f dump topic_duplicate
git branch -D topic_duplicate
O con
git branch -M topic_duplicate dump
O semplicemente scartando la discarica
git branch -D dump
Forse potresti anche scegliere solo dopo aver cancellato l'attuale "topic_duplicate".
Quello che sto cercando di dire è che se si desidera aggiornare l'attuale ramo "duplicato" basato su un antenato diverso, è necessario prima eliminare i commit precedentemente "cherrypicked" eseguendo un git reset --hard <last-commit-to-retain>
o git branch -f topic_duplicate <last-commit-to-retain>
e quindi copiando gli altri commit (dal principale argomento) mediante rebasing o cherry-picking.
Il rifacimento funziona solo su un ramo che ha già i commit, quindi è necessario duplicare il ramo dell'argomento ogni volta che lo si desidera.
La crittografia è molto più semplice:
git cherry-pick master..topic
Quindi l'intera sequenza scenderà a:
git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic
Quando il tuo ramo duplicato di argomento è stato estratto. Ciò eliminerebbe i commit precedentemente selezionati dalla ciliegia dal duplicato corrente e riapplicerebbe tutte le modifiche che si verificano in "topic" in aggiunta al "dump" corrente (antenato diverso). Sembra un modo ragionevolmente conveniente per basare lo sviluppo sul "vero" master upstream mentre si utilizza un master "downstream" diverso per verificare se anche le modifiche locali si applicano ancora a quello. In alternativa puoi semplicemente generare un diff e quindi applicarlo al di fuori di qualsiasi albero dei sorgenti di Git. Ma in questo modo puoi mantenere una versione aggiornata (patchata) aggiornata che si basa sulla versione della tua distribuzione mentre il tuo sviluppo reale è contro il vero master upstream.
Quindi, solo per dimostrare:
Spero che questo aiuti qualcuno. Volevo riscriverlo, ma non ci riesco ora. Saluti.
Dopo che il comando ha funzionato per me, tutte le modifiche locali impegnate vengono eliminate e locale viene reimpostato sullo stesso ramo origine / ramo remoto.
git reset --hard origin