Viewing unpushed Git commits

GitGit DiffGit Log

Git Problem Overview


How can I view any local commits I've made, that haven't yet been pushed to the remote repository? Occasionally, git status will print out that my branch is X commits ahead of origin/master, but not always.

Is this a bug with my install of Git, or am I missing something?

Git Solutions


Solution 1 - Git

git log origin/master..HEAD

You can also view the diff using the same syntax

git diff origin/master..HEAD

Solution 2 - Git

If you want to see all commits on all branches that aren't pushed yet, you might be looking for something like this:

git log --branches --not --remotes

And if you only want to see the most recent commit on each branch, and the branch names, this:

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline

Solution 3 - Git

You can show all commits that you have locally but not upstream with

git log @{u}..

@{u} or @{upstream} means the upstream branch of the current branch (see git rev-parse --help or git help revisions for details).

Solution 4 - Git

This worked for me:

git cherry -v 

As indicated at Git: See all unpushed commits or commits that are not in another branch.

Solution 5 - Git

You can do this with git log:

git log origin/master..

This assumes that origin is the name of your upstream remote and master is the name of your upstream branch. Leaving off any revision name after .. implies HEAD, which lists the new commits that haven't been pushed.

Solution 6 - Git

All the other answers talk about "upstream" (the branch you pull from).
But a local branch can push to a different branch than the one it pulls from.

A master might not push to the remote-tracking branch "origin/master".
The upstream branch for master might be origin/master, but it could push to the remote tracking branch origin/xxx or even anotherUpstreamRepo/yyy.
Those are set by branch.*.pushremote for the current branch along with the global remote.pushDefault value.

It is that remote-tracking branch that counts when seeking unpushed commits: the one that tracks the branch at the remote where the local branch would be pushed to.
The branch at the remote can be, again, origin/xxx or even anotherUpstreamRepo/yyy.

Git 2.5+ (Q2 2015) introduces a new shortcut for that: <branch>@{push}

See commit 29bc885, commit 3dbe9db, commit adfe5d0, commit 48c5847, commit a1ad0eb, commit e291c75, commit 979cb24, commit 1ca41a1, commit 3a429d0, commit a9f9f8c, commit 8770e6f, commit da66b27, commit f052154, commit 9e3751d, commit ee2499f [all from 21 May 2015], and commit e41bf35 [01 May 2015] by Jeff King (peff).
(Merged by Junio C Hamano -- gitster -- in commit c4a8354, 05 Jun 2015)

Commit adfe5d0 explains:

> ## sha1_name: implement @{push} shorthand

> In a triangular workflow, each branch may have two distinct points of interest: the @{upstream} that you normally pull from, and the destination that you normally push to. There isn't a shorthand for the latter, but it's useful to have. > > For instance, you may want to know which commits you haven't pushed yet: > > git log @{push}.. > > Or as a more complicated example, imagine that you normally pull changes from origin/master (which you set as your @{upstream}), and push changes to your fork (e.g., as myfork/topic).
You may push to your fork from multiple machines, requiring you to integrate the changes from the push destination, rather than upstream.
With this patch, you can just do: > > git rebase @{push} > > rather than typing out the full name.

Commit 29bc885 adds:

> ## for-each-ref: accept "%(push)" format

> Just as we have "%(upstream)" to report the "@{upstream}" for each ref, this patch adds "%(push)" to match "@{push}".
It supports the same tracking format modifiers as upstream (because you may want to know, for example, which branches have commits to push).

If you want to see how many commit your local branches are ahead/behind compared to the branch you are pushing to:

git for-each-ref --format="%(refname:short) %(push:track)" refs/heads

Solution 7 - Git

I had a commit done previously, not pushed to any branch, nor remote nor local. Just the commit. Nothing from other answers worked for me, but with:

git reflog

There I found my commit.

Solution 8 - Git

Handy git alias for looking for unpushed commits in current branch:

alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

What this basically does:

git log origin/branch..branch

but also determines current branch name.

Solution 9 - Git

You could try....

gitk

I know it is not a pure command line option but if you have it installed and are on a GUI system it's a great way to see exactly what you are looking for plus a whole lot more.

(I'm actually kind of surprised no one mentioned it so far.)

Solution 10 - Git

git branch -v will show, for each local branch, whether it's "ahead" or not.

Solution 11 - Git

I use the following alias to get just the list of files (and the status) that have been committed but haven't been pushed (for the current branch)

git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"

then just do:

git unpushed

Solution 12 - Git

I believe the most typical way of doing this is to run something like:

git cherry --abbrev=7 -v @{upstream}

However, I personally prefer running:

git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..

which shows the commits from all branches which are not merged upstream, plus the last commit in upstream (which shows up as a root node for all the other commits). I use it so often that I have created alias noup for it.

git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'

Solution 13 - Git

git cherry -v

This will list out your local comment history (not yet pushed) with corresponding message

Solution 14 - Git

I suggest you go see the script https://github.com/badele/gitcheck, i have coded this script for check in one pass all your git repositories, and it show who has not commited and who has not pushed/pulled.

Here a sample result enter image description here

Solution 15 - Git

It is not a bug. What you probably seeing is git status after a failed auto-merge where the changes from the remote are fetched but not yet merged.

To see the commits between local repo and remote do this:

git fetch

This is 100% safe and will not mock up your working copy. If there were changes git status wil show X commits ahead of origin/master.

You can now show log of commits that are in the remote but not in the local:

git log HEAD..origin

Solution 16 - Git

This worked better for me:

git log --oneline @{upstream}..

or:

git log --oneline origin/(remotebranch)..

Solution 17 - Git

There is tool named unpushed that scans all Git, Mercurial and Subversion repos in specified working directory and shows list of ucommited files and unpushed commits. Installation is simple under Linux:

$ easy_install --user unpushed

or

$ sudo easy_install unpushed

to install system-wide.

Usage is simple too:

$ unpushed ~/workspace
* /home/nailgun/workspace/unpushed uncommitted (Git)
* /home/nailgun/workspace/unpushed:master unpushed (Git)
* /home/nailgun/workspace/python:new-syntax unpushed (Git)

See unpushed --help or official description for more information. It also has a cronjob script unpushed-notify for on-screen notification of uncommited and unpushed changes.

Solution 18 - Git

To list all unpushed commit in all branches easily you can use this command:

 git log --branches  @{u}..

Solution 19 - Git

I'm really late to the party, and I'm not sure when it was implemented, but to see what a git push would do, just use the --dry-run option:

$ git push --dry-run
To ssh://bitbucket.local.lan:7999/qarepo/controller.git
   540152d1..21bd921c  imaging -> imaging

Solution 20 - Git

If the number of commits that have not been pushed out is a single-digit number, which it often is, the easiest way is:

$ git checkout

git responds by telling you that you are "ahead N commits" relative your origin. So now just keep that number in mind when viewing logs. If you're "ahead by 3 commits", the top 3 commits in the history are still private.

Solution 21 - Git

Similar: To view unmerged branches:

git branch --all --no-merged

Those can be suspect but I recommend the answer by cxreg

Solution 22 - Git

one way of doing things is to list commits that are available on one branch but not another.

git log ^origin/master master

Solution 23 - Git

As said above:

git diff origin/master..HEAD

But if you are using git gui

After opening gui interface, Select "Repository"->Under that "Visualize History"

Note: Some people like to use CMD Prompt/Terminal while some like to use Git GUI (for simplicity)

Solution 24 - Git

If you have git submodules...

Whether you do git cherry -v or git logs @{u}.. -p, don't forget to include your submodules via git submodule foreach --recursive 'git logs @{u}..'.

I am using the following bash script to check all of that:

	unpushedCommitsCmd="git log @{u}.."; # Source: https://stackoverflow.com/a/8182309

	# check if there are unpushed changes
	if [ -n "$($getGitUnpushedCommits)" ]; then # Check Source: https://stackoverflow.com/a/12137501
		echo "You have unpushed changes.  Push them first!"
		$getGitUnpushedCommits;
		exit 2
	fi

	unpushedInSubmodules="git submodule foreach --recursive --quiet ${unpushedCommitsCmd}"; # Source: https://stackoverflow.com/a/24548122
	# check if there are unpushed changes in submodules
	if [ -n "$($unpushedInSubmodules)" ]; then
		echo "You have unpushed changes in submodules.  Push them first!"
		git submodule foreach --recursive ${unpushedCommitsCmd} # not "--quiet" this time, to display details
		exit 2
	fi

Solution 25 - Git

Here's my portable solution (shell script which works on Windows too without additional install) which shows the differences from origin for all branches: git-fetch-log

An example output:

==== branch [behind 1]

> commit 652b883 (origin/branch)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-10 09:11:11 +0100
|
|     Commit on remote
|
o commit 2304667 (branch)
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2015-08-28 13:21:13 +0200

      Commit on local

==== master [ahead 1]

< commit 280ccf8 (master)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-25 21:42:55 +0100
|
|     Commit on local
|
o commit 2369465 (origin/master, origin/HEAD)
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2016-03-10 09:02:52 +0100

      Commit on remote

==== test [ahead 1, behind 1]

< commit 83a3161 (test)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-25 22:50:00 +0100
|
|     Diverged from remote
|
| > commit 4aafec7 (origin/test)
|/  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
|   Date:   2016-03-14 10:34:28 +0100
|
|       Pushed remote
|
o commit 0fccef3
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2015-09-03 10:33:39 +0200

      Last common commit

Parameters passed for log, e.g. --oneline or --patch can be used.

Solution 26 - Git

git show

will show all the diffs in your local commits.

git show --name-only

will show the local commit id and the name of commit.

Solution 27 - Git

git diff origin

Assuming your branch is set up to track the origin, then that should show you the differences.

git log origin

Will give you a summary of the commits.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJosh BuhlerView Question on Stackoverflow
Solution 1 - GitPeter BView Answer on Stackoverflow
Solution 2 - GitcxregView Answer on Stackoverflow
Solution 3 - GitBen LingsView Answer on Stackoverflow
Solution 4 - GitChristian VielmaView Answer on Stackoverflow
Solution 5 - GitGreg HewgillView Answer on Stackoverflow
Solution 6 - GitVonCView Answer on Stackoverflow
Solution 7 - GitOlaiaView Answer on Stackoverflow
Solution 8 - GittakeshinView Answer on Stackoverflow
Solution 9 - GitJustin OhmsView Answer on Stackoverflow
Solution 10 - GitAurelienView Answer on Stackoverflow
Solution 11 - GitCCCView Answer on Stackoverflow
Solution 12 - GitGiorgos KylafasView Answer on Stackoverflow
Solution 13 - GitadswebworkView Answer on Stackoverflow
Solution 14 - GitBruno AdeléView Answer on Stackoverflow
Solution 15 - GitIgor ZevakaView Answer on Stackoverflow
Solution 16 - GitVaToView Answer on Stackoverflow
Solution 17 - GitnailgunView Answer on Stackoverflow
Solution 18 - GitMohsen KashiView Answer on Stackoverflow
Solution 19 - GitDaniel BView Answer on Stackoverflow
Solution 20 - GitKazView Answer on Stackoverflow
Solution 21 - GitChristophe RoussyView Answer on Stackoverflow
Solution 22 - GitAlexander OhView Answer on Stackoverflow
Solution 23 - Gitvrnair24View Answer on Stackoverflow
Solution 24 - GitAidinView Answer on Stackoverflow
Solution 25 - GitbimlasView Answer on Stackoverflow
Solution 26 - Gituser2387567View Answer on Stackoverflow
Solution 27 - GitmopokeView Answer on Stackoverflow