Mercurial: roll back an "hg commit --amend".

19,223

Solution 1

NOTE: This answer is now deprecated. See the answer from @Sorina Sandu instead.


See hg help commit, where it says:

The --amend flag can be used to amend the parent of the working directory with a new commit that contains the changes in the parent in addition to those currently reported by "hg status", if there are any. The old commit is stored in a backup bundle in ".hg/strip-backup" (see "hg help bundle" and "hg help unbundle" on how to restore it).

Solution 2

You can use hg reflog (from the journal extension) and hg reset <hash>.

hg reflog -v

should give something like:

<old-hash> -> <new-hash> <user> <timestamp>  commit --amend <some-path>

if that is the amend you want to revert, just use:

hg reset <old-hash>

The commit will be reverted to what is previously was and the changes that were amended should now be uncommitted changes (check using hg status and hg diff).

Solution 3

If your version of Mercurial is new enough, I believe you should be able to use the hg unamend command from the uncommit extension that ships with Mercurial. This may require that obsolescence markers are enabled, I'm not sure.

  1. Enable the uncommit extension, add this to your ~/.hgrc:

    [extensions]
    uncommit =
    
  2. Actually run the unamend:

    hg unamend
    

Solution 4

  1. Find the latest saved backup in .hg/strip-backup directory
  2. hg unbundle .hg/strip-backup/<latest backup>
  3. Now you should have two heads - one with the amended commit, other one with two commits (first one - old commit before amending, second one caled: "temporary amend commit for (old commit hash)".
  4. if you have histedit extension, you can do hg histedit on it in order to change it (e.g. select edit in order to achieve a state just before the commit, i.e. when you can see all changes using hg diff).

Don't forget to strip the old head.

Share:
19,223
Don P
Author by

Don P

@ Facebook currently

Updated on June 02, 2022

Comments

  • Don P
    Don P about 2 years

    I accidentally did a "hg commit --amend" instead of just a commit. How can I roll back the commit to before the amend?