On Tue, Jul 9, 2019 at 4:13 PM Elijah Newren <newren@xxxxxxxxx> wrote: > > Hi John, > > On Tue, Jul 9, 2019 at 3:57 PM McRoberts, John <John.McRoberts@xxxxxx> wrote: > > > > I am responsible for generating a list of all files changed between two > > successive releases of software. I was using 'git diff' but have run into a > > problem. > > > > Consider the following situation: A development branch comes off of commit A > > and files are changed three times. A tag (REL1) is placed on the third > > commit. Then the branch is merged back to master. At this point, master's > > HEAD is at C (and it remains there). Two development branches are created > > off of master, the first of which is not important here. In the second one, > > there are files changed and a tag (REL2) applied. > > > > > > ---------------------[I] > > > > / {dev branch} > > > > / > > > > / > > {master branch} > > / > > [A] ---------------------------------[B]------------------------------->[C] > > master <HEAD> > > \ filelist 6 / \ > > \ / > > \ > > \ / > > \ > > \ / > > \ > > \ {development branch} / > > \ > > \------->[D]----------------------->[E]-------------------[F] > > \------[G]--------[H] > > REL1 > > REL2 > > fileset 1 fileset 2 fileset 3 > > fileset 4 fileset 5 > > > > At this point, I run > > 'git diff -m --first-parent --pretty=fuller --decorate=short > > --name-only REL2..REL2' > > Wow, we really, really need to throw errors and warnings when people > use crazy range operators with diff.[1][2] What version of git are > you using that accepts --decorate=short as an argument to `git diff`? > And why in the world does git diff accept --first-parent or > --pretty=fuller?!? That's insane for git-diff to swallow that. > (#leftoverbits?) Also, I think you meant `REL1` one of the two times > you wrote `REL2`, which makes me suspect you may have done some > copy-edit-paste and didn't try this actual command. > > > I expect to see only filesets 4 and 5 listed. I also see filesets 1, 2 and > > 3 showing up. This means that the git diff command is showing files that,in > > fact, did not change between the two tags. By the way, I verified with a > > file by file comparison that under REL2 and REL1, the files represented by > > filesets 1, 2 and 3 had identical contents. > > From your description, I assume you actually ran something like > git diff --name-only REL1..REL2 Did you mean REL1...REL2 (3 dots)? 2 dots (REL1..REL2) is identical to no dots (REL1 REL2), per the documentation for "git diff": git diff [<options>] <commit> <commit> [--] [<path>...] This is to view the changes between two arbitrary <commit>. git diff [<options>] <commit>..<commit> [--] [<path>...] This is synonymous to the previous form. If <commit> on one side is omitted, it will have the same effect as using HEAD instead. (Forgive me if I'm mistaken here!) > > which compares REL2 to the merge base of REL1 and REL2 (yes, this is > totally counter-intuitive to a large percentage of the git userbase, > but it is well documented and hard to change). Also from your > description, what you seem to want is > git diff --name-only REL1 REL2 > > since you want to compare the two endpoints. Does that help get what you want? > > Hope that helps, > Elijah > > [1] https://public-inbox.org/git/CABPp-BECj___HneAYviE3SB=wU6OTcBi3S=+Un1sP6L4WJ7agA@xxxxxxxxxxxxxx/ > [2] https://public-inbox.org/git/CABPp-BGg_iSx3QMc-J4Fov97v9NnAtfxZGMrm3WfrGugOThjmA@xxxxxxxxxxxxxx/