2012-03-22 35 views
5

Sto provando a rimuovere il 2 commit su un repository. A questo punto ho potuto solo soffiare via la .git dir e ri-farlo, ma sono curioso di come fare questo ... Ho cancellato impegna prima, ma a quanto pare non il 2 ° :)git: rimuovere 2nd commit

> git log 

commit c39019e4b08497406c53ceb532f99801793205ca 
Author: Me 
Date: Thu Mar 22 14:02:41 2012 -0700 

    Initializing registry directories 

commit 535dce28f1c68e8af9d22bc653aca426fb7825d8 
Author: Me 
Date: Tue Jan 31 21:04:13 2012 -0800 

    First Commit 

> git rebase -i HEAD~2 
fatal: Needed a single revision 
invalid upstream HEAD~2 

> git rebase -i HEAD~1 

a quel punto ricevo nel mio editor:

pick c39019e Initializing registry directories 

# Rebase 535dce2..c39019e onto 535dce2 
# 
# Commands: 
# 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 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

Ora il mio problema è che non posso semplicemente soffiare via questa seconda commettere poiché "se si rimuove tutto, il rebase verrà interrotta"

risposta

5

in Per rimuovere il commit più in alto, utilizzare git reset --hard HEAD~. Rebase non è necessario poiché non si rimuove nulla tra altri commit.

0

Se è l'ultimo commit, allora si può fare:

git reset --hard HEAD~ 

E se non è l'ultimo commit, si avrebbe avuto un altro commit atleast nella lista rebase e si può rimuovere il 2 ° commettere .

1

Perché non si ripristina il commit?

git revert 535dce28f1c68e8af9d22bc653aca426fb7825d8 o git revert HEAD~1

+0

perché ciò aggiunge inutilmente un altro commit –

+0

come fa a fare la differenza? Il tuo obiettivo di rimuovere la modifica è stato fatto. – bluesman

+0

Perché non avevo ancora spinto e non vedo davvero un punto nel premere "commit", "annulla commit precedente". La tua risposta non è _wrong_, mi piacciono gli altri: P –

2

Questa è già una risposta (sopra) ma nota che nei nuovi git, esiste un comando noop si può mettere nel file. Così si può sostituire la linea pick con noop:

$ git rebase -i HEAD^ 
[in editor, change pick line to noop, and write and quit] 
".git/rebase-merge/git-rebase-todo" 15L, 492C written 
Successfully rebased and updated refs/heads/master. 
$ 

Certo questo non fa altro che git reset non fa altrettanto facilmente ... ma se hai già iniziato il rebase interattivo, e ti rendi conto solo quello che volevi dopo il fatto, il trucco noop è a portata di mano.

0

È inoltre possibile effettuare le seguenti operazioni:

git rebase -i --root 

Ciò includerà la radice impegnarsi nella vostra rebase. È quindi possibile scegliere fixup, squash oppure eliminare il 2 ° commit interamente se lo si desidera.