Introduction to git diff
A diff function is a command-line tool that displays the differences in outputs of two data sources in a git environment. Git diff command helps to show a comparison between files, branches, tags and commits that make up a commit-tree. It can bring out the distinction between various versions of commits history and therefore a powerful tool to use in monitoring the project progress. Diff function is supported by the git log and the git status command when it comes to maintaining the status updates.
Among the changes you can monitor using diff function include differences between a merge, differences between two trees, differences between the index and active tree among others.
In this tutorial, we shall explain different scenarios for working with git diff using examples.
Git diff workflow
![git diff usage explained [Multiple Scenarios] git-diff-image](https://www.golinuxcloud.com/wp-content/uploads/git-diff.png)
The above image is a simplified illustration of how the git diff command works as summarized below;
git-diff-HEAD~1is the distinction betweenHEAD~1and the working tree.git-diff–HEADis the difference betweenHEADand the working tree.git-diff-stagedis the distinction between the HEAD and the index.- The difference between
HEAD~1andindexisgit-diff-staged-HEAD~1 git–diffis the difference between the index and working tree.
git diff syntax
You can use git diff along with following supported options. To get more details on individual supported options, you can refer official git documentation:
git diff [<options>] [<commit>] [--] [<path>…] git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…] git diff [<options>] [--merge-base] <commit> [<commit>…] <commit> [--] [<path>…] git diff [<options>] <commit>…<commit> [--] [<path>…] git diff [<options>] <blob> <blob> git diff [<options>] --no-index [--] <path> <path>
Setting up the lab environment
To practice using the diff command, first, we will have to set up the lab environment. I will therefore clone the remote project git-diff-c to my local workstation that I will be using for this tutorial. I'm using windows 10 pro and git version 2.32.0.windows.2.
See below the expected output:
$ git clone https://github.com/J-Mulombi/git-diff-c.git
Cloning into 'git-diff-c'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
git diff examples
Scenario-1: Use git diff to track changes between the active local directory and the index
We will use git diff command to show the distinction between the staged commits in the index and active directory.
In this example, we shall first create a new branch mybranch from the master branch in our git-diff-c local repository as follows:
$ git checkout -b mybranch
Switched to a new branch 'newbranch'
Let’s now add two files test-1.txt and test-2.txt to the active branch mybranch as shown below:
$ touch test-1.txt $ touch test-2.txt $ git add .
Next, we shall run the git status command to view the new files in staging area as illustrated below:
$ git status
On branch newbranch
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: .test-1.txt
new file: test-2.txt
After adding two files test-1.txt and test-2.txt to the active branch mybranch, we shall proceed to modify both files.
$ echo "edited file" >> test-1.txt $ echo "edited file" >> test-2.txt
Next, we shall run the git status command again to view test-2.txt and test-1.txt files unstaged as displayed below:
$ git status
Sample output:
![git diff usage explained [Multiple Scenarios] git diff usage explained [Multiple Scenarios]](https://www.golinuxcloud.com/wp-content/uploads/gitlab-70.jpg)
Notice from the above output both files test-1.txt and test-2.txt have been modified, unstaged and waiting to be committed.
To illustrate how git diff shows the differences in the local directory and the index, let's again modify test-2.txt file at this stage. Then we will proceed to run the diff command to see the difference.
$ echo "added first line in test-2 file" >> test-2.txt
Check the difference in the local repo:
$ git diff
Sample Output:
![git diff usage explained [Multiple Scenarios] git diff usage explained [Multiple Scenarios]](https://www.golinuxcloud.com/wp-content/uploads/gitlab-71.jpg)
From the output, the diff command has displayed the distinction between two versions of test-2.txt file located in the staging area.
Scenario-2: Apply diff command to track the differences between the active directory and the last commit
You can track changes between the last commit and the active directory as follows:
Let's again make some changes to test-2.txt file before running the diff command in this example.
To see the distinction between the active directory and our last commit, we shall run the git diff HEAD command as illustrated below:
$ echo "added third line in test-2 file" >> test-2.txt $ git diff HEAD diff --git a/test-1.txt b/test-1.txt new file mode 100644 index 0000000..5d3aabf --- /dev/null +++ b/test-1.txt @@ -0,0 +1 @@ +edited file diff --git a/test-2.txt b/test-2.txt new file mode 100644 index 0000000..c88866e --- /dev/null +++ b/test-2.txt @@ -0,0 +1,3 @@ +edited file +added first line in test-2 file +added third line in test-2 file
Sample Output:
![git diff usage explained [Multiple Scenarios] git diff usage explained [Multiple Scenarios]](https://www.golinuxcloud.com/wp-content/uploads/gitlab-72.jpg)
Note that the output shows the changes between the active repository and the last commit. It shows the history of all commits when we first added files test-1.txt and test-2.txt to the latest modification done to the test-2.txt file.
Scenario-3: Use diff to track the difference between the staging area and the last commit
You can track the difference between the last commit and the staging area as follows:
In this example, we shall stage file test-3.txt that we had earlier created and modified. So how do we track the differences between the last commit and the staging area?
Here I have test-4.txt in the staging area while test-2.txt is waiting for the commit:
![git diff usage explained [Multiple Scenarios] git diff usage explained [Multiple Scenarios]](https://www.golinuxcloud.com/wp-content/uploads/gitlab-73.jpg)
To track the differences between the last commit and staging area, run the git diff --staged HEAD command as demonstrated below:
$ git diff --staged HEAD
diff --git a/test-4.txt b/test-4.txt
new file mode 100644
index 0000000..e69de29
According to the output, test-4.txt is a staged commit, and it is yet to be committed. You can compare the output with git diff HEAD:
![git diff usage explained [Multiple Scenarios] git diff usage explained [Multiple Scenarios]](https://www.golinuxcloud.com/wp-content/uploads/gitlab-74.jpg)
So we learned that:
git diff --stagedwill only show changes to files in the "staged" area.git diff HEADwill show all changes to tracked files. If you have all changes staged for commit, then both commands will output the same.
Scenario-4: Track the distinction between git commits using the diff operator
You can track the differences between two commits as shown below:
While on mybranch we shall run the git log --oneline command to see all the commits.
$ git log --oneline
2ae9f25 (HEAD -> mybranch) edited file test-2.txt
9ec46d0 (origin/master, origin/HEAD, master) Initial commit
Next, we shall run the diff between commit 2ae9f25 and 9ec46d0.
$ git diff 2ae9f25 9ec46d0 diff --git a/test-1.txt b/test-1.txt deleted file mode 100644 index e69de29..0000000 diff --git a/test-2.txt b/test-2.txt deleted file mode 100644 index e69de29..0000000
The above results display the difference between commit 9ec46d0 and the 9ec46d0initial commit on the active branch mybranch.
Scenario-5: Use diff command to track the difference between git branches
To track the difference between git branches you shall run the git diff <branch A> <branch B> commanded as illustrated below:
$ git diff master mybranch diff --git a/test-1.txt b/test-1.txt new file mode 100644 index 0000000..e69de29 diff --git a/test-2.txt b/test-2.txt new file mode 100644 index 0000000..e69de29
The results display the commits differences between the master branch and mybranch in the remote repository git-diff-c. This diff information is vital, especially when working on a collaborated project to manage conflicts.
Summary
We have been able to cover the following topics about diff function:
- The meaning of git function
- The git diff operator workflow
- Git function working scenarios

