Domanda Elimina commit da una filiale in Git


Mi piacerebbe sapere come eliminare un commit.

Di deleteVoglio dire che è come se non avessi fatto quel commit, e quando faccio una spinta in futuro, le mie modifiche non spingeranno al ramo remoto.

Ho letto git help e penso che il comando che dovrei usare sia git reset --hard HEAD. È corretto?


2572
2017-08-27 03:39


origine


risposte:


Attenzione:  git reset --hard  CANCELLA I VOSTRI CAMBIAMENTI DEL DIRECTORY DI LAVORO. Essere sicuri di riponi tutte le modifiche locali che vuoi mantenere prima di eseguire questo comando.

Supponendo che tu sia seduto su quel commit, allora questo comando lo attaccherà ...

git reset --hard HEAD~1

Il HEAD~1 significa il commit prima di testa.

Oppure, potresti vedere l'output di git log, trova l'id di commit del commit a cui vuoi eseguire il backup, quindi esegui questa operazione:

git reset --hard <sha1-commit-id>

Se lo hai già spinto, dovrai fare una spinta forzata per sbarazzartene ...

git push origin HEAD --force

però, se altri lo hanno tirato, allora sarebbe meglio iniziare una nuova filiale. Perché quando tirano, lo uniranno semplicemente al loro lavoro, e lo riavrai nuovamente.

Se hai già spinto, potrebbe essere meglio usarlo git revert, per creare un commit "immagine speculare" che annullerà le modifiche. Tuttavia, entrambi i commit saranno nel registro.


FYI - git reset --hard HEAD è fantastico se vuoi liberarti di WORK IN PROGRESS. Ripristinerà il commit più recente e cancellerà tutte le modifiche nella struttura e nell'indice di lavoro.


Infine, se hai bisogno di trovare un commit che hai "cancellato", è in genere presente git reflog a meno che tu non abbia raccolto i rifiuti nel tuo repository.


3302
2017-08-27 03:44



Se non hai ancora spinto il commit da nessuna parte, puoi usare git rebase -i rimuovere quel commit. Per prima cosa, scopri quanto è lontano (approssimativamente) quel commit. Quindi fa:

git rebase -i HEAD~N

Il ~N significa rebase l'ultimo N commette (N deve essere un numero, per esempio HEAD~10). Quindi, puoi modificare il file che Git ti presenta per eliminare il commit incriminato. Al salvataggio di quel file, Git provvederà a riscrivere tutti i seguenti commit come se quello che hai eliminato non esistesse.

Il Git Book ha un buono sezione su rebasing con immagini ed esempi.

Stai attento con questo però, perché se cambi qualcosa che tu avere spinto altrove, sarà necessario un altro approccio a meno che non stiate progettando di fare una spinta forzata.


603
2017-08-27 03:51



Un'altra possibilità è uno dei miei comandi preferiti personali:

git rebase -i <commit>~1

Questo avvierà il rebase in modalità interattiva -i al punto appena prima del commit che vuoi colpire. L'editore inizierà a elencare tutti i commit da allora. Elimina la riga contenente il commit che vuoi cancellare e salvare il file. Rebase farà il resto del lavoro, eliminando solo quel commit e riproducendo tutti gli altri nel log.


416
2017-08-27 03:49



Sto aggiungendo questa risposta perché non vedo perché chiunque abbia appena provato a commettere un lavoro vorrebbe cancellare tutto quel lavoro a causa di qualche errore nell'usare Git!

Se vuoi mantenere il tuo lavoro e solo 'annullare' quel comando di commit (ti sei beccato prima di spingere al repo):

git reset --soft HEAD~1

Non usare il --hard flag a meno che tu non voglia distruggere il tuo work in progress dall'ultimo commit.


281
2017-10-15 18:17



Se non hai pubblicato le modifiche, per rimuovere l'ultimo commit, puoi farlo

$ git reset --hard HEAD^

(nota che questo rimuoverà anche tutte le modifiche non salvate; usalo con cura).

Se hai già pubblicato commit da cancellare, usa git revert

$ git revert HEAD

47
2017-08-27 10:47



Rimozione di un intero commit

git rebase -p --onto SHA^ SHA

Ovviamente sostituisci "SHA" con il riferimento di cui vuoi liberarti. Il "^" in quel comando è letterale.

http://sethrobertson.github.io/GitFixUm/fixup.html


43
2017-08-31 19:36



git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId si riferisce a quello che si desidera ripristinare


33
2017-10-16 09:51



Se vuoi correggere il tuo ultimo commit, puoi annullare il commit e rimuovere i file al suo interno, facendo:

git reset HEAD~1

Ciò restituirà il repository al suo stato prima che git aggiunga i comandi che mettono in scena i file. Le tue modifiche saranno nella tua directory di lavoro. HEAD ~ 1 si riferisce al commit sotto l'attuale punta del ramo.

Se si desidera annullare N commit, ma mantenere le modifiche al codice nella directory di lavoro:

git reset HEAD~N

Se vuoi eliminare il tuo ultimo commit e non vuoi mantenere le modifiche al codice, puoi eseguire un reset "hard".

git reset --hard HEAD~1

Allo stesso modo, se vuoi scartare gli ultimi N commit e non vuoi mantenere le modifiche al codice:

git reset --hard HEAD~N

29
2018-05-31 07:19



Modifica forzatamente la cronologia

Supponendo che non si voglia solo cancellare l'ultimo commit, ma si vogliono cancellare specifici commit degli ultimi n commit, andare con:

git rebase -i HEAD~<number of commits to go back>, così git rebase -i HEAD~5 se vuoi vedere gli ultimi cinque commit.

Quindi nell'editor di testo cambia la parola pick a drop accanto a ogni commit che vorresti rimuovere. Salva ed esci dall'editor. Ecco!

Additively Change History

Provare git revert <commit hash>. ritornare creerà a nuovo commit che annulla il commit specificato.


20
2018-06-15 23:01



Diciamo che vogliamo rimuovere commit 2 e 4 dal repository.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Nota: È necessario disporre dei diritti di amministratore sul repository dal momento che stai usando --hard e -f.

  • git checkout b3d92c5 Verifica l'ultimo commit utilizzabile.
  • git checkout -b repair Crea una nuova filiale su cui lavorare.
  • git cherry-pick 77b9b82 Esegui tramite commit 3.
  • git cherry-pick 2c6a45b Esegui tramite commit 1.
  • git checkout master Checkout master.
  • git reset --hard b3d92c5 Ripristina il master all'ultimo commit utilizzabile.
  • git merge repair Unisci il nostro nuovo ramo al master.
  • git push -f origin master Spingere il master al repository remoto.

19
2017-09-05 07:19



git rebase -i HEAD~2

Qui '2' è il numero di commit che vuoi rebase.

'git rebase -i HEAD`

se vuoi ribattere tutti i commit.

Quindi sarai in grado di scegliere una di queste opzioni.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Queste righe possono essere riordinate; sono eseguiti dall'alto verso il basso.  Se rimuovi una riga qui CHE COMMITERA SARÀ PERDUTA.  Tuttavia, se rimuovi tutto, il rebase verrà annullato.  Nota che i commit vuoti sono commentati

Puoi semplicemente rimuovere quel commit usando l'opzione "d" o Rimozione di una linea che ha il tuo commit.


14
2018-05-18 23:39