Home Software Engineering How To Compare Two Git Branches

How To Compare Two Git Branches

by schkn

When working with Git, it is quite common to use different branches in order to have work clearly separated from the main codebase.

However, when working on those branches, you might want to merge branches in order to have the resulting work in your main branch.

Before merging, you already know that you have to compare the differences between the two branches.

Comparing two branches is very beneficial : it can be used as a quick way to see if you will have merging conflicts.

It can also be commonly used in order to see the work that has been done : by comparing a feature branch with an integration branch for example.

In this tutorial, we are going to see how you can compare two Git branches easily.

Compare two branches using git diff

In order to compare two branches easily, you have to use the “git diff” command and provide the branch names separated by dots.

$ git diff branch1..branch2

Using this command, Git will compare the tip of both branches (also called the HEAD) and display a “diff” recap that you can use to see modifications.

Compare two branches using git diff

In short, it will show you all the commits that “branch2” has that are not in “branch1”.

Let’s say for example that you are looking to see the differences between a feature branch (being one commit ahead of master) and the master branch.

In order to see what has been modified between master and feature, you would run the following command.

$ git diff master..feature

diff --git a/file-feature b/file-feature
new file mode 100644
index 0000000..add9a1c
--- /dev/null
+++ b/file-feature
@@ -0,0 +1 @@
+this is a feature file

As you can see, one file has been added to the branch.

Git is using a color code in order to display differences done between two branches : lines in green are lines added to the files and lines in red are the ones that are deleted from the files.

Comparing two branches using triple dot syntax

In order to compare two branches, you can also use the “git diff” command and provide the branch names separated by three dots.

$ git diff branch1...branch2

So what’s the difference with the previous command?

Using “git diff” with three dots compares the top of the right branch (the HEAD) with the common ancestor of the two branches.

As always, a diagram speaks a hundred words, so here is the description of the diff command with three dots.

Compare two branches using triple dot syntax

So which method should you use in order to compare two branches?

Most of the time, you want to stick with the first method, meaning using only two dots in order to compare two branches.

Why?

When you are developing a new feature, you are most of the time doing it on your own branch. However, developing on your own branch does not prevent the branch you checked out from to have other commits.

This is particularly true whenever you are checking out a new branch from the master branch : other commits might be integrated to master while you are working on your feature.

As a consequence, in order to compare two branches, you almost always want to stick with the first method we described.

$ git diff branch1..branch2

Compare commits between two branches

In some cases, you may be interested in knowing the commit differences between two branches.

In order to see the commit differences between two branches, use the “git log” command and specify the branches that you want to compare.

$ git log branch1..branch2

Note that this command won’t show you the actual file differences between the two branches but only the commits.

Back to the example we provided before, comparing the commit differences between the master and the feature branch would be written

$ git log master..feature

commit 802a2abed7f88d67e0ab9a0e780b858651c5813b (HEAD -> feature, origin/feature)
Author: SCHKN <[email protected]>
Date:   Wed Dec 4 13:10:01 2019 -0500

    feature commit

If you are not interested in all the information provided by this command, there is a way to get shorter commit lines.

In order to compare two branches using commit abbreviations, use the “git log” command with the following options.

$ git log --oneline --graph --decorate --abbrev-commit branch1..branch2

Using the example we provided before, this command would give us the following output

$ git log --oneline --graph --decorate --abbrev-commit master..feature
* 802a2ab (HEAD -> feature, origin/feature) feature commit

Compare specific file between two branches

In some cases, you may want to see all changes done to a specific file on the current branch you are working on.

In order to see the differences done to a file between two branches, use the “git diff” command, specify the two branches and the filename.

$ git diff master..feature -- <file>

Let’s say for example that the file that you modified between those two branches is called “README”.

In order to see the differences done to this file, you would run the following command

$ git diff master..feature -- README

diff --git a/README b/README
new file mode 100644
index 0000000..add9a1c
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+this is the README file

Note that you can use the triple dot syntax we saw earlier in order to compare those files.

$ git diff master...feature -- <file>

Compare two branches using Sourcetree

In some cases, you might be interested in viewing differences in a Git graphical client.

For this example, I am going to use the popular Sourcetree Git GUI in order to display differences between two branches.

Given the repository view, you have access to all your branches in the left side menu.

In order to see the differences between two branches, on the Sourcetree left menu, click on the branch that you want to compare and click “Diff Against Current”

Diff against current in sourcetree

After clicking on “Diff Against Current”, you will be presented with the list of differences between your files, whether they are in your working tree or if they are in your index already.

File differences using sourcetree

Conclusion

In this tutorial, you learnt how you can compare two branches easily using Git commands (specifically the git diff and git log commands).

You also learnt that it is possible to use graphical tools such as Sourcetree in order to compare your branches and commits easily.

If you are interested in Git and in software engineering, we have a complete section dedicated to it on the website, so make sure to have a look!

You may also like

7 comments

Links 1/12/2019: Genode OS 19.11 Release, Sam Hartman (DPL) Speaks Out on SystemD | Techrights December 1, 2019 - 8:53 am

[…] How To Compare Two Git Branches […]

Reply
Anand July 22, 2020 - 1:52 am

Good concise commands for quick help, Please can you add how to compare two directories of pointing to two different masters. Git remote -v of both the directories are different but git branch is master in both.

Reply
skepto October 15, 2020 - 2:30 pm

This is what I love about git, a simple straight forward answer that when I try it completely fails. git diff master..mybranch yields
fatal: ambiguous argument ‘master..mybranch’: unknown revision or path not in the working tree.
I am sure it is because it is comparing local versions, and I don’t have a local copy of the branch despite having just pulled, or some other exoteric problem that will take me the better part of an hour to figure out. Perhaps the command syntax is completely different or there is a different command entirely when using remote branches, or I should have passed some magic flag when cloning if I wanted to pull the entire archive including branches.

Reply
FulgaB January 5, 2023 - 3:37 pm

Did you ever solve this issue? I have exactly the same one.

Reply
Devansh June 3, 2021 - 6:22 am

git diff branch1..branch2 returns nothing in my case

Reply
PraveenSM July 27, 2021 - 5:59 pm

You have to checkout to both branches
$ git checkout branch1
$ git checkout branch 2
$ git diff branch2..branch1

Reply
Olufemi David February 20, 2022 - 6:41 am

You don’t have to checkout to either of the branches, you can be in a different branch

Reply

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.