I have a script that works fine in one branch and is broken in another. I want to look at the two versions side-by-side and see what’s different. Is there a way to do this?
To be clear I’m not looking for a compare tool (I use Beyond Compare). I’m looking for a Git diff command that will allow me to compare the master version to my current branch version to see what has changed. I’m not in the middle of a merge or anything. I just want to say something like
git diff mybranch/myfile.cs master/myfile.cs
git diff can show you the difference between two commits:
git diff mybranch master -- myfile.cs
git diff mybranch..master -- myfile.cs
Note you must specify the relative path to the file. So if the file were in the src directory, you’d say
src/myfile.cs instead of
Using the latter syntax, if either side is
HEAD it may be omitted (e.g.,
You may also be interested in
git diff documentation):
This form is to view the changes on the branch containing and up to the second
<commit>, starting at a common ancestor of both
git diff A...Bis equivalent to
git diff $(git-merge-base A B) B.
In other words, this will give a diff of changes in
master since it diverged from
mybranch (but without new changes since then in
In all cases, the
-- separator before the file name indicates the end of command line flags. This is optional unless Git will get confused if the argument refers to a commit or a file, but including it is not a bad habit to get into. See Dietrich Epp’s answer to Meaning of Git checkout double dashes for a few examples.
The same arguments can be passed to
git difftool if you have one configured.
You can do this:
git diff branch1:path/to/file branch2:path/to/file
If you have difftool configured, then you can also:
git difftool branch1:path/to/file branch2:path/to/file
How do I view ‘git diff’ output with my preferred diff tool/ viewer?
More modern syntax:
git diff ..master path/to/file
The double-dot prefix means “from the current working directory to”. You can also say:
master.., i.e. the reverse of above. This is the same as
mybranch..master, explicitly referencing a state other than the current working tree.
v2.0.1..master, i.e., referencing a tag.
[refspec]..[refspec], basically anything identifiable as a code state to Git.