2012-03-22 12 views
5

Próbuję usunąć drugie zatwierdzenie do repozytorium. W tym momencie mogę tylko zdmuchnąć .git dir i ponownie to zrobić, ale jestem ciekaw, jak to zrobić ... Usunąłem zobowiązuje wcześniej, ale najwyraźniej nigdy 2nd jeden :)git: usuń drugi 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 

w którym momencie mam w moim edytorze:

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. 
# 

teraz moim problemem jest to, że nie można po prostu zdmuchnąć ten 2-ty popełnić ponieważ „jeśli usunąć wszystko, rebase zostanie przerwana”

Odpowiedz

5

w aby usunąć najwyższy commit, użyj git reset --hard HEAD~. Rebase nie jest potrzebny, ponieważ nie usuwasz niczego pomiędzy innymi zatwierdzeniami.

0

Jeśli jest to ostatni popełnić, to można zrobić:

git reset --hard HEAD~ 

A jeśli to nie jest ostatni popełnić, byś miał inny popełnić conajmniej na liście zmieniają bazę i można usunąć 2nd popełnić .

1

Dlaczego nie cofasz swojego zatwierdzenia?

git revert 535dce28f1c68e8af9d22bc653aca426fb7825d8 lub git revert HEAD~1

+0

ponieważ to bezsensownie dodaje kolejny commit –

+0

jak to robi różnicę? Twoim celem jest usunięcie zmiany. – bluesman

+0

Ponieważ nie pchnąłem jeszcze i naprawdę nie widzę sensu w popychaniu "zatwierdzenia", "cofnięciu poprzedniego zatwierdzenia". Twoja odpowiedź nie jest błędna, po prostu lubię inne lepiej: P –

2

to już odpowiedział (powyżej), ale należy pamiętać, że w nowszych git, jest noop poleceń można umieścić w pliku. Więc można zastąpić linię pick z 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. 
$ 

Wprawdzie to nie robi nic, że git reset nie zrobić tak łatwo ... ale jeśli już rozpoczął interaktywną rebase, a ty tylko uświadomić sobie, co chcesz po fakcie sztuczka noop jest przydatna.

0

Można również wykonać następujące czynności:

git rebase -i --root 

ten obejmie korzeń popełnić w rebase. Następnie możesz wybrać opcję fixup, squash lub całkowicie usunąć drugie zatwierdzenie.