How to Diff between local uncommitted changes and origin

Solution 1:

Given that the remote repository has been cached via git fetch it should be possible to compare against these commits. Try the following:

$ git fetch origin
$ git diff origin/master

Solution 2:

I know it's not an answer to the exact question asked, but I found this question looking to diff a file in a branch and a local uncommitted file and I figured I would share

Syntax:

git diff <commit-ish>:./ -- <path>

Examples:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Thanks Eric Boehs for a way to not have to type the filename twice)

Solution 3:

To see non-staged (non-added) changes to existing files

git diff

Note that this does not track new files. To see staged, non-commited changes

git diff --cached

Solution 4:

If you want to compare files visually you can use:

git difftool

It will start your diff app automatically for each changed file.

PS: If you did not set a diff app, you can do it like in the example below(I use Winmerge):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false

Solution 5:

Generally speaking, the following command can make it, which gets all the details about the diffs between branches (current branch vs. another one), including uncommitted changes:

$ git diff origin/master

It is different from the command below, which ignores the diffs for uncommitted changes:

$ git diff origin/master..develop

You can add some options to filter out the diffs:

$ git diff origin/master [--name-only] [--diff-filter=A] [<path>]

The option '--diff-filter=A' means to filter out added files from origin/master branch. However, if you have run git rm before that, you will have to firstly push the changes into git stash and then restore the git repo and apply the stashed changes later on. Otherwise, it doesn't show the proper diffs as expected.

So it helps to see the diffs with an option '--name-status' for status.

$ git diff origin/master [--name-status]