What is the difference between hg forget and hg remove?

Version ControlMercurial

Version Control Problem Overview

I want mercurial to remove several files from the current state of the repository. However, I want the files to exist in prior history.

How do forget and remove differ, and can they do what I want?

Version Control Solutions

Solution 1 - Version Control

'hg forget' is just shorthand for 'hg remove -Af'. From the 'hg remove' help:

> ...and -Af can be used to remove files > from the next revision without > deleting them from the working > directory.

Bottom line: 'remove' deletes the file from your working copy on disk (unless you uses -Af) and 'forget' doesn't.

Solution 2 - Version Control

The best way to put is that hg forget is identical to hg remove except that it leaves the files behind in your working copy. The files are left behind as untracked files and can now optionally be ignored with a pattern in .hgignore.

In other words, I cannot tell if you used hg forget or hg remove when I pull from you. A file that you ran hg forget on will be deleted when I update to that changeset — just as if you had used hg remove instead.

Solution 3 - Version Control

From the documentation, you can apparently use either command to keep the file in the project history. Looks like you want remove, since it also deletes the file from the working directory.

From the Mercurial book at http://hgbook.red-bean.com/read/:

> Removing a file does not affect its > history. It is important to > understand that removing a file has > only two effects. It removes the > current version of the file from the > working directory. It stops Mercurial > from tracking changes to the file, > from the time of the next commit. > Removing a file does not in any way > alter the history of the file.

The man page hg(1) says this about forget:

> Mark the specified files so they will > no longer be tracked after the next > commit. This only removes files from > the current branch, not from the > entire project history, and it does > not delete them from the working > directory.

And this about remove:

> Schedule the indicated files for > removal from the repository. This > only removes files from the current > branch, not from the entire project > history.

Solution 4 - Version Control

If you use "hg remove b" against a file with "A" status, which means it has been added but not commited, Mercurial will respond:

  not removing b: file has been marked for add (use forget to undo)

This response is a very clear explication of the difference between remove and forget.

My understanding is that "hg forget" is for undoing an added but not committed file so that it is not tracked by version control; while "hg remove" is for taking out a committed file from version control.

This thread has a example for using hg remove against files of 7 different types of status.

Solution 5 - Version Control

> A file can be tracked or not, you use hg add to track a file and > hg remove or hg forget to un-track it. Using hg remove without > flags will both delete the file and un-track it, hg forget will > simply un-track it without deleting it.


All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPaul NathanView Question on Stackoverflow
Solution 1 - Version ControlRy4an BraseView Answer on Stackoverflow
Solution 2 - Version ControlMartin GeislerView Answer on Stackoverflow
Solution 3 - Version ControlJason CatenaView Answer on Stackoverflow
Solution 4 - Version Controlgm2008View Answer on Stackoverflow
Solution 5 - Version ControlTaoView Answer on Stackoverflow