A branch can be both ahead and behind at the same time if you have made changes to your branch, and someone else have made changes on the default branch that you have not merged into your branch yet. I have a branch with 6 commits, and it shows 4 commits behind master in Bitbucket Cloud.
branch is X commits behind means that there are X new (unmerged) commits on the branch which is being tracked by your current branch. branch is X commits ahead analogously means that your branch has X new commits, which haven't been merged into the tracked branch yet.
Git defines themselves as “a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency”. They are not part of GitHub- they're a tool to be used with it.
As an answer on your question 1, here's a trick I found to compare two branches and show how many commits each branch is ahead of the other (a more general answer on your question 1):
For local branches:
git rev-list --left-right --count master...test-branch
For remote branches:
git rev-list --left-right --count origin/master...origin/test-branch
This gives output like the following:
2 1
This output means: "Compared to master
, test-branch
is 1 commit ahead and 2 commits behind."
You can also compare local branches with remote branches, e.g. origin/master...master
to find out how many commits a local branch (here master
) is ahead/behind its remote counterpart.
To answer the second part of your question, the solution depends on what exactly you want to achieve.
To view commits
In order to have git rev-list
return the exact list of commits unique on either side, replace the --count
argument with something like --pretty=oneline
, making the complete command to execute:
git rev-list --left-right --pretty=oneline master...test-branch
This will generate output like this:
<bba27b56ad7072e281d529d4845e4edf877eb7d7 unique commit 2 on master
<dad0b69ec50ea57b076bfecabf2cc7c8a652bb6f unique commit 1 on master
>4bfad52fbcf0e60d78d06661d5c06b59c98ac8fd unique commit 1 on test-branch
Here every commit sha is preceded by <
or >
to indicate which branch it can be found on (left or right, here master
or test-branch
respectively).
To view code
If you want to view a diff of all new commits only found on either branch, you'll need to do this in two steps:
$ git merge-base master test-branch
c22faff7468d6d5caef217ac6b82f3ed95e9d902
To show the diff of all commits only found on master
git diff c22faff7..master
To show the diff of all commits only found test-branch
git diff c22faff7..test-branch
First of all to see how many revisions you are behind locally, you should do a git fetch
to make sure you have the latest info from your remote.
The default output of git status
tells you how many revisions you are ahead or behind, but usually I find this too verbose:
$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)
I prefer git status -sb
:
$ git status -sb
## master...origin/master [ahead 2, behind 1]
In fact I alias this to simply git s
, and this is the main command I use for checking status.
To see the diff in the "ahead revisions" of master
, I can exclude the "behind revisions" from origin/master
:
git diff master..origin/master^
To see the diff in the "behind revisions" of origin/master
, I can exclude the "ahead revisions" from master
:
git diff origin/master..master^^
If there are 5 revisions ahead or behind it might be easier to write like this:
git diff master..origin/master~5
git diff origin/master..master~5
UPDATE
To see the ahead/behind revisions, the branch must be configured to track another branch. For me this is the default behavior when I clone a remote repository, and after I push a branch with git push -u remotename branchname
. My version is 1.8.4.3, but it's been working like this as long as I remember.
As of version 1.8, you can set the tracking branch like this:
git branch --track test-branch
As of version 1.7, the syntax was different:
git branch --set-upstream test-branch
With Git 2.5+, you now have another option to see ahead/behind for all branches which are configured to push to a branch.
git for-each-ref --format="%(push:track)" refs/heads
See more at "Viewing Unpushed Git Commits"
You can also use awk
to make it a little bit prettier:
git rev-list --left-right --count origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'
You can even make an alias that always fetches origin first and then compares the branches
commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"
After doing a git fetch, you can run git status to show how many commits the local branch is ahead or behind of the remote version of the branch.
This won't show you how many commits it is ahead or behind of a different branch though. Your options are the full diff, looking at github, or using a solution like Vimhsa linked above: Git status over all repo's
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With