Alex G
Alex G

Reputation: 747

Git diff not listing specific changes to files?

I've been playing around with adding and committing, and using diff to show discrepancies between the HEAD, index, and working dir. Using diff, my understanding is that it is supposed to specify which files have changed, but also it is supposed to specify the differences between files (eg. if I write "hello" into a file, it should say +hello (or something similar) when I run diff and it compares the two).

When I use diff, however, it only shows me that a file has changed; it fails to show what those changes are. Why isn't it showing the individual changes in files -- the actual text that I've added, what specifically I've deleted, etc.? If diff does not do this, is there a command I can use for it?

Thank you.


To run a full test, I deleted .git and ran a git-init, then found diff did not show diff for all three variations of diff (git diff, git diff --cached, and git diff HEAD). The file I used is t.txt. This is my console, which I formatted for readability; >> is where Powershell prompts for input, which I typed into the console; comments were written as I went, denoted with >> # <comment>. This is my console output:

>> # Starting with nothing.

>> git status
fatal: Not a git repository (or any of the parent directories): .git

>> git init
Initialized empty Git repository in C:/Users/q/Documents/GitHub/.git/

>> ls

>> git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)

>> echo "New file created." > t.txt

>> git status
On branch master
Initial commit
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        t.txt
nothing added to commit but untracked files present (use "git add" to track)


>> git add .

>> git status
On branch master
Initial commit
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   t.txt


>> #open t.txt and add a second line of text to it

>> git status
On branch master
Initial commit
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
       new file:   t.txt
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   t.txt


>> git diff
diff --git a/t.txt b/t.txt
index e7a4f8a..fe91a49 100644
Binary files a/t.txt and b/t.txt differ

>> #How can I see the exact change?
>> #Something like: '''
>> #
>> # + This is the added line.
>> #
>> # ''' in the diff?


>> # I can take this even further by making the first commit, modifying, then staging the file 
                              # with `git add`, then editing again, and then run all three `git-diff`s 
                              # (git diff, git diff --cached, git diff HEAD) and none of them will specify any actual 
                              # changes in the files; Git still just lists the files that have discrepancies, without 
                              # listing any of the detials about /what/ is actually different.


>> git add .

>> git commit -m "Committed with the second line."
[master (root-commit) 14acc45] Committed with the second line.
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 t.txt

>> git diff

>> git log
commit 14acc455b16ba26cdea1661166b0ffc3fa089784
Author: q <[email protected]>
Date:   Sat Nov 7 04:29:20 2015 -0800
    Committed with the second line.

>> git diff HEAD

>> git diff HEAD^
fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'


>> #We change the file again to add a third line


>> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   t.txt
no changes added to commit (use "git add" and/or "git commit -a")


>> git diff
diff --git a/t.txt b/t.txt
index fe91a49..006c33a 100644
Binary files a/t.txt and b/t.txt differ


>> git diff HEAD
diff --git a/t.txt b/t.txt
index fe91a49..006c33a 100644
Binary files a/t.txt and b/t.txt differ


>> git add .

>> #Modify file again.

>> git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   t.txt
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   t.txt


>> git diff
diff --git a/t.txt b/t.txt
index 006c33a..57a6754 100644
Binary files a/t.txt and b/t.txt differ

>> git diff HEAD
diff --git a/t.txt b/t.txt
index fe91a49..57a6754 100644
Binary files a/t.txt and b/t.txt differ

>> git diff --cached
diff --git a/t.txt b/t.txt
index fe91a49..006c33a 100644
Binary files a/t.txt and b/t.txt differ

>>## But how do they differ?

Upvotes: 3

Views: 1262

Answers (1)

VonC
VonC

Reputation: 1328342

If the file is too small, git doesn't know how to interpret it (test or binary): see "Why does Git treat this text file as a binary file?"

You can force a text diff with:

git diff --text

(or you can configure it as text)

Upvotes: 4

Related Questions