2012-10-18 22 views
8

Ci sono alcuni commit su un ramo remoto che mi piacerebbe eliminare. Per esempio, se la storia si presenta come:Come posso cancellare un commit su git

A->B->C->D 

vorrei eliminare C e D di darmi:

A->B 

dove B è ora a capo?

+1

Vedere la domanda in allegato; ad eccezione di "HEAD ~ 2" (per eliminare gli ultimi 2 commit). – cmbuckley

+0

Utilizzare 'git reset' per eliminare i commit. [Questa guida] (http://git-scm.com/2011/07/11/reset.html) spiega cosa fa. –

risposta

14

ho intenzione di tracciare tutti i diversi modi per eliminare commit per voi e quando si dovrebbe usarli. Prima di fare qualsiasi di queste consigliamo vivamente di copiare la filiale in un'altra filiale solo per sicurezza.

farlo facendo git checkout -b copy_branch e poi tornare alla vostra filiale originale facendo git checkout the_branch_i_want_to_delete_from_again

Se si è già spinto, come nel tuo caso, è possibile passare alla # 3, ma se non si è spinto si può guardare a 1 e 2.

1) non ho ancora spinto o sto lavorando da solo e il commit (s) voglio rimuovere sono i commit più recenti:

se ho: A --- B --- C --- D

e voglio eliminare C e D.

Poi fare git reset --hard sha_of_B

che si traduce in: A --- B

Se si è già spinto, come nel tuo caso, è potrebbe ancora farlo in questo modo quindi fare un git push --force origin the_branch, ma questo non è raccomandato in quanto si potrebbe incasinare altre persone a lavorare su questo progetto. Dovresti invece seguire # 3.

2) non ho ancora spinto o sto lavorando da solo ei commit (s) Voglio rimuovere sono nel bel mezzo del mio ramo:

Se ho: A --- B- -C --- D

e voglio fare eliminare C.

git rebase -i sha_of_B_the_commit_before_the_one_i_want_to_delete 

che apre la schermata estremamente utile rebase interattivo:

pick sha_of_C C 
pick sha_of_D D 

Come git ti suggerisce "# Se rimuovi una riga QUI CHE COMMITERA SARÀ PERDUTA." questo è ciò che ci accingiamo a fare

a cancellare la linea pick sha_of_C C, il che mi lascia con:.

pick sha_of_D D 

risparmio in VI: wq, che si traduce in:

A --- B --- D

Se hai già spinto, come nel tuo caso, potresti ancora farlo in questo modo quindi fare un git push --force origin the_branch, ma questo non è raccomandato in quanto potresti fare in modo che altre persone possano lavorare su questo progetto. Dovresti invece seguire # 3.

3) Ho già spinto e sto lavorando con altre persone:

Se ho: A --- B --- --- C D e voglio eliminare e C D.

poi fare

git revert sha_of_D 

si noti che potrebbe essere necessario risolvere i conflitti qui e poi commettere. Poi do

git revert sha_of_C 

Si noti che potrebbe essere necessario risolvere i conflitti qui e poi commettere.

Questo si traduce in:

A --- B --- --- C D --- --- Reverted_D Reverted_C

Questo è sicuro di spingere come si sta in realtà solo aggiungendo un commit che inverte tutte le modifiche di C e D, essenzialmente cancellandole.

Generalmente si dovrebbe evitare di fare un git push --force a meno che non sia assolutamente necessario. Ma se stai per fare una forza di spinta, usa la protezione, dovresti sicuramente fare una copia della tua branca prima di farlo. In generale, è buona norma attenersi alla # 3 se si è già stati spinti.

Speriamo che questo sia utile.

Dan

+0

Grande spiegazione ed esempi, grazie. – Kasyx

1

Per cancellare l'ultima commit

$ git reset --hard HEAD^ 

Per eliminare l'ultima 2 commette

$ git reset --hard HEAD~2 

È possibile scaricare il ramo locale. Quindi eliminare i commit ed eseguire una spinta --force

$ git pull origin 
$ git checkout origin/<branchname> 
$ git checkout -b <branchname> 
$ git reset --hard HEAD~2 
$ git push origin <branchname> --force 
Problemi correlati