Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does "hg status" show changed files when "hg diff -g" doesn't? (One parent)

Tags:

mercurial

I have a repository where:

> hg st 

shows that my working directory has some uncommitted changes, while

> hg diff   > hg diff -g   > hg diff --git 

display nothing.

I read here: 4.10. hg status shows changed files but hg diff doesn't! the following:

hg status reports when file contents or flags have changed relative to either parent. hg diff only reports changed contents relative to the first parent. You can see flag information with the --git option to hg diff and deltas relative to the other parent with -r.

However, if I run hg parents it shows only one parent (the tip). As I mention above, I have also tried hg diff --git and it still displays nothing.

Note:

  • The above is on Mercurial version 2.0.1
  • hg status only shows M next to a regular file.
  • hg diff and hg diff -g print nothing
  • The filesystem is NFS.
  • hg parents prints only one parent
like image 856
Amelio Vazquez-Reina Avatar asked Dec 08 '11 23:12

Amelio Vazquez-Reina


People also ask

What hg command shows a list of changed files?

If you are using the terminal in windows add hg status --rev x:y > your-file. txt to save the list to a file. To only see changes in the current directory: hg status --rev x:y .

What hg status means?

hg status shows the status of a repository. Files are stored in a project's working directory (which users see), and the local repository (where committed snapshots are permanently recorded). hg add tells Mercurial to track files. hg commit creates a snapshot of the changes to 1 or more files in the local repository.


1 Answers

Some excerpts from Mercurial in daily use (Mercurial: the definitive guide) (copying here because there seems to be no way to give a convinient link to the end of the page):

The default output of the hg diff command is backwards compatible with the regular diff command, but this has some drawbacks.

The output of hg diff above obscures the fact that we simply renamed a file. The hg diff command accepts an option, --git or -g, to use a newer diff format that displays such information in a more readable form.

This option also helps with a case that can otherwise be confusing: a file that appears to be modified according to hg status, but for which hg diff prints nothing. This situation can arise if we change the file's execute permissions.

The normal diff command pays no attention to file permissions, which is why hg diff prints nothing by default. If we supply it with the -g option, it tells us what really happened.

To summarize, hg diff command misses several kinds of information on changes: attributes, permissions, file names, etc. These changes may exist even if you have a single parent. And hg status correctly takes into account all changes. To see what has happened, use hg diff -g. It's the answer to the question 'what happens'.

Seems like backwards compatibility is the 'why'. I'm not sure, but I suppose that the 'normal diff' is some widespread or built-in Unix/Linux tool (judging from the fact that both hg and git come from that world).

like image 95
Pavel Gatilov Avatar answered Sep 19 '22 18:09

Pavel Gatilov