Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any way to delete local commits in Mercurial?

Tags:

mercurial

People also ask

How do you strip a commit?

To remove the last commit from git, you can simply run git reset --hard HEAD^ If you are removing multiple commits from the top, you can run git reset --hard HEAD~2 to remove the last two commits. You can increase the number to remove even more commits.

How do you delete a local branch in Heartgold?

Hence to delete a branch, you must strip out all the commits that are in/on that branch. The simplest way to do that is using hg strip .


Enable the "strip" extension and type the following:

hg strip #changeset# --keep

Where #changeset# is the hash for the changeset you want to remove. This will remove the said changeset including changesets that descend from it and will leave your working directory untouched. If you wish to also revert your committed code changes remove the --keep option.

For more information, check the Strip Extension.

If you get "unkown command 'strip'" you may need to enable it. To do so find the .hgrc or Mercurial.ini file and add the following to it:

[extensions]
strip =

Note that (as Juozas mentioned in his comment) having multiple heads is normal workflow in Mercurial. You should not use the strip command to battle that. Instead, you should merge your head with the incoming head, resolve any conflicts, test, and then push.

The strip command is useful when you really want to get rid of changesets that pollute the branch. In fact, if you're in this question's situation and you want to completely remove all "draft" change sets permanently, check out the top answer, which basically suggests doing:

hg strip 'roots(outgoing())'

If you are using Hg Tortoise just activate the extension "strip" in:

  1. File/Settings/Extensions/
  2. Select strip

Then select the bottom revision from where you want to start striping, by doing right click on it, and selecting:

  1. Modify history
  2. Strip

Just like this:

enter image description here

In this example it will erase from the 19th revision to the last one commited(22).


Modern answer (only relevant after Mercurial 2.1):

Use Phases and mark the revision(s) that you don't want to share as secret (private). That way when you push they won't get sent.

In TortoiseHG you can right click on a commit to change its phase.

Also: You can also use the extension "rebase" to move your local commits to the head of the shared repository after you pull.


As everyone else is pointing out you should probably just pull and then merge the heads, but if you really want to get rid of your commits without any of the EditingHistory tools then you can just hg clone -r your repo to get all but those changes.

This doesn't delete them from the original repository, but it creates a new clone that doesn't have them. Then you can delete the repo you modified (if you'd like).