Skip to contentSkip to conversation

git log omits deleting merges

DISCUSSION Ephrim Khong 3 participants 6 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

Hi, git log seems to omit merge commits that delete a file if --follow or --diff-filter=D is given. Below is a testcase. I'm not sure if it is desired behaviour for --diff-filter=D, but it's probably not correct that --follow _removes_ the merge commit from the log output.

Thanks - Eph

--
git init
touch some_file
git add some_file
git commit -m "initial"
git branch other_branch
echo foo > some_file
git commit -a -m "commit in master" git checkout other_branch
echo bar > some_file
git commit -a -m "commit in other_branch"

git merge master --no-commit rm some_file
git rm some_file
git commit -m "merge"

echo "log 1 - no output"

# note that --diff-filter=A and M work as expected
# the merge does not show up for --diff-filter=ACDMRTUXB either
git log --pretty=oneline --diff-filter=D -- some_file

echo "log 2 - merge is missing"
git log --pretty=oneline --follow --all -- some_file

echo "log 3 - complete"
git log --pretty=oneline --all -- some_file --

#1 lore raw
Quoted 4 lines · Ephrim Khong

Hi, git log seems to omit merge commits that delete a file if --follow or --diff-filter=D is given. Below is a testcase. I'm not sure if it is desired behaviour for --diff-filter=D, but it's probably not correct that --follow _removes_ the merge commit from the log output.

This is by design. Git-log does not calculate or show merge diffs unless "-c" or "--cc" is specified, and thus no diff-filter can match.

Quoted 4 lines

echo "log 1 - no output"

# note that --diff-filter=A and M work as expected
# the merge does not show up for --diff-filter=ACDMRTUXB either
git log --pretty=oneline --diff-filter=D -- some_file

Try:

  git log -c --diff-filter=D -- some_file

which does show it.

-Peff

#2 lore raw

From: "Jeff King" <[email protected]>

Quoted 10 lines · Ephrim Khong
Quoted 8 lines

Hi, git log seems to omit merge commits that delete a file if --follow or
--diff-filter=D is given. Below is a testcase. I'm not sure if it is desired
behaviour for --diff-filter=D, but it's probably not correct that --follow
_removes_ the merge commit from the log output.

Quoted 3 lines

This is by design. Git-log does not calculate or show merge diffs unless
"-c" or "--cc" is specified, and thus no diff-filter can match.

This is hard to discern from the log(1) man page as this conflates commit inclusion (limiting?) with the diff formatting.

The -c and -cc options are listed in the diff formatting section, but
that's well down the man page. Even then, the note for the options doesn't say that it will cause the log output to now include the merge commits.

Perhaps the -c and -cc options should also be noted in the options or
the commit limiting section, but exactly where is probably contentious (maybe under the --merges).

(or I may have misunderstood)

Quoted 6 lines
Quoted 5 lines

echo "log 1 - no output"

# note that --diff-filter=A and M work as expected
# the merge does not show up for --diff-filter=ACDMRTUXB either
git log --pretty=oneline --diff-filter=D -- some_file
Quoted 8 lines

Try:

git log -c --diff-filter=D -- some_file

which does show it.

-Peff
--

Philip

#3 lore raw
Quoted 10 lines · Philip Oakley
Quoted 3 lines

This is by design. Git-log does not calculate or show merge diffs unless
"-c" or "--cc" is specified, and thus no diff-filter can match.

This is hard to discern from the log(1) man page as this conflates commit inclusion (limiting?) with the diff formatting.

The -c and -cc options are listed in the diff formatting section, but that's well down the man page. Even then, the note for the options doesn't say that it will cause the log output to now include the merge commits.

Merge commits are always considered. But we don't show merge _diffs_ without "-c" or "--cc". And they cannot match a diff-filter if we don't calculate the diffs.

That being said, I can certainly imagine there is room for improvement in the documentation. The --diff-filter option is in the "diff options" section, but perhaps the top of that section might want to make special mention of "-c" and "--cc"?

-Peff

#4 lore raw
In reply to Jeff King

Am 20.03.14 20:54, schrieb Jeff King:

Quoted 9 lines · Ephrim Khong
Quoted 5 lines

Hi, git log seems to omit merge commits that delete a file if --follow or --diff-filter=D is given. Below is a testcase. I'm not sure if it is desired behaviour for --diff-filter=D, but it's probably not correct that --follow _removes_ the merge commit from the log output.

This is by design. Git-log does not calculate or show merge diffs unless "-c" or "--cc" is specified, and thus no diff-filter can match.

Thank you for the explanation, I now understand why this is happening from a technical point of view. From a usability perspective, it is a bit confusing that a flag that should intuitively increase the number of shown commits (--follow) removes a commit from the output. Though this is just a minor annoyance, so no strong opinion here.

- Eph

#5 lore raw
Quoted 5 lines · Ephrim Khong

Thank you for the explanation, I now understand why this is happening from a technical point of view. From a usability perspective, it is a bit confusing that a flag that should intuitively increase the number of shown commits (--follow) removes a commit from the output. Though this is just a minor annoyance, so no strong opinion here.

Sorry, I focused on the --diff-filter aspect of your question. As for --follow, I think that is less "by design" and more "what happens to occur, because --follow is a bit of a hack".

So there may be a bug, or room for improvement in the code there, though if the solution involves turning on diffs for all merges, that may be prohibitively expensive.

-Peff