{"thread":{"id":"30719","subject":"a diff equivalent to show?","startedAt":"2012-06-05T16:39:43Z","lastAt":"2012-06-05T16:39:43Z","messageCount":1,"participants":["Brian Ericson"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"192927","messageId":"4FCE364F.1030307@ptc.com","threadId":"30719","inReplyTo":null,"subject":"a diff equivalent to show?","fromName":"Brian Ericson","fromEmail":"bericson@ptc.com","sentAt":"2012-06-05T16:39:43Z","receivedAt":"2012-06-05T16:39:43Z","isPatch":false,"sender":{"key":"bericson@ptc.com","avatar":"https://gravatar.com/avatar/8ee326fa7a162bc30cb2b3f4f454773d63c864ca6d4095af9312e9dd856587cd?d=mp&s=160"},"body":"Is there a way I can get the same results (files & diff content) using \n\"git diff\" that I can get using \"git show\"?  I ask because I want show's \nbasic results (changes it represents via, for example, --name-status), \nbut need the options and output of diff.\n\nI'm interested, in particular, in three merge cases involving merges to \nmaster from \"other\" (see example repo below):\n* other changed file (10241ee as \"First merge.\")\n* master changed file (178f994 as \"Second merge.\")\n* Conflicting merge resolved by keeping my changes (bc1291a as \"Third \nmerge.\")\n\nIn all three cases, \"show\" shows no changes (via git show bc1291a \n178f994 10241ee).  However, I can't consistently get diff to replicate \nthe show's result, as shown via\nfunction differ() {\n   local RESULT=$( git --no-pager diff --name-status $1 )\n   printf \"%-29s -- %s\\n\" \"$1\" \"${RESULT:-OK}\"\n}\n\nfor commit in bc1291a 178f994 10241ee\ndo\n   #Shouldn't this work?\n   differ $commit^!\n   #Should be equivalent to previous\n   differ \"^$commit^@ $commit\"\n   #Yet another way of representing the same thing.\n   differ \"^$commit^1 ^$commit^2 $commit\"\n   #Hrm...  This is also equivalent?!\n   differ \"^$commit^1 $commit\"\n   #I probably should (better) understand why order matters...\n   differ \"$commit ^$commit^@\"\n   #Thrown in for good measure.\n   differ \"^$commit^2 $commit\"\n   echo\ndone\n\nwhich produces:\n10241ee^!                     -- M    file\n^10241ee^@ 10241ee            -- M    file\n^10241ee^1 ^10241ee^2 10241ee -- M    file\n^10241ee^1 10241ee            -- M    file\n10241ee ^10241ee^@            -- OK\n^10241ee^2 10241ee            -- OK\n\n178f994^!                     -- A    unrelated_file\n^178f994^@ 178f994            -- A    unrelated_file\n^178f994^1 ^178f994^2 178f994 -- A    unrelated_file\n^178f994^1 178f994            -- A    unrelated_file\n178f994 ^178f994^@            -- OK\n^178f994^2 178f994            -- M    file\n\nbc1291a^!                     -- OK\n^bc1291a^@ bc1291a            -- OK\n^bc1291a^1 ^bc1291a^2 bc1291a -- OK\n^bc1291a^1 bc1291a            -- OK\nbc1291a ^bc1291a^@            -- M    file\n^bc1291a^2 bc1291a            -- M    file\n\nTangentially, it seems odd to me that $commit^! seems equivalent to \n^$commit^1 $commit.  What's also odd to me is that, removing \n--name-status, \"git --no-pager diff 10241ee^!\" shows a \"-1\" -- exactly \nthe opposite of what I'd expect (\"+1\"):\ndiff --git a/file b/file\nindex d00491f..e69de29 100644\n--- a/file\n+++ b/file\n@@ -1 +0,0 @@\n-1\n\nExample repo to demonstrate:\ngit init && touch file && git add file && git commit -m 'Empty file.'\ngit checkout -b other && echo 1 >> file && git commit -am 'other \nappended 1 to file.'\ngit checkout master && git merge --no-ff -m 'First merge.'\ngit checkout master && git merge --no-ff -m 'First merge.' other\necho 2 >> file && git commit -am 'master appended 2 to file'\ngit checkout other && touch unrelated_file && git add unrelated_file && \ngit commit -m 'other added unrelated_file.'\ngit checkout master && git merge -m 'Second merge.' other\necho 3 >> file && git commit -am 'master appended 3 to file'\necho 4 >> file && git commit -am 'master appended 4 to file'\ngit checkout other && echo 3 >> file && git commit -am 'other appended 3 \nto file'\ngit checkout master && git merge other ; git checkout HEAD file && git \ncommit #Edit commit to make first line \"Third merge.\"\n\nHere is the resulting tree:\n*   bc1291a Third merge.\n|\\\n| * 11ce5db other appended 3 to file\n* | 9c92ac7 master appended 4 to file\n* | 4bd6eda master appended 3 to file\n* |   178f994 Second merge.\n|\\ \\\n| |/\n| * fb424bf other added unrelated_file.\n* | d854a9e master appended 2 to file\n* |   10241ee First merge.\n|\\ \\\n| |/\n| * 0d73874 other appended 1 to file.\n|/\n* 468a04b Empty file.\n\nI am using git version 1.7.10.2.\n"}]}