简体   繁体   中英

git: remove 2nd commit

I'm trying to remove the 2nd commit to a repo. At this point I could just blow away the .git dir and re-do it, but I'm curious how to do this... I've deleted commits before, but apparently never the 2nd one :)

> 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

at which point I get in my 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.
#

Now my problem is that I can't just blow away this 2nd commit since "if you remove everything, the rebase will be aborted"

In order to remove the topmost commit, use git reset --hard HEAD~ . Rebase is not needed since you are not removing anything in between other commits.

This is already answered (above) but note that in newer git, there is a noop command you can put in the file. So you can replace the pick line with 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.
$ 

Admittedly this does nothing that git reset does not do just as easily ... but if you've already started the interactive rebase, and you only realize what you wanted after the fact, the noop trick is handy.

Why dont you revert your commit?

git revert 535dce28f1c68e8af9d22bc653aca426fb7825d8 or git revert HEAD~1

You can also do the following:

git rebase -i --root

This will include the root commit in your rebase. You can then choose to fixup , squash , or delete that 2nd commit entirely if you desire.

If it is the last commit, then you can do:

git reset --hard HEAD~

And if it is not the last commit, you would have had another commit atleast in the rebase list and you can remove the 2nd commit.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM