检查本地git仓库是否在远程前/后
我正在开发一个git插件,并且我需要使用命令行知道本地repo何时发生更改(可以提交更改),提前(可以推送到远程)还是后面(可以从远程提取)。
这是我迄今为止所做的:
可以提交?
  如果git diff-index --name-only --ignore-submodules HEAD --返回某些内容,那么是的,这些更改会提交。 
可以推?
  如果git status -sb在输出中包含前面的单词,那么是的,有提交推送。 
可以拉?
还没有实施。
可以提交? 部分似乎正常工作。 可以推? 只适用于主分支,这是一个巨大的问题。
  我该如何安全地检查每个分支上的git repo是否有更改提交,提交或需要git pull ? 
  你可以使用git merge-base和git rev-parse来实现这一点。  如果git merge-base <branch> <remote branch>返回与git rev-parse <remote branch> ,那么你的本地分支就在前面。  如果它返回与git rev-parse <branch> ,那么你的本地分支在后面。  如果merge-base返回的是不同于rev-parse答案,那么分支已经发生分歧,您需要进行合并。 
  尽管如此,在检查分支之前最好先做一次git fetch ,否则,您是否需要拉动的决心将会过时。  您还需要验证您检查的每个分支都有远程跟踪分支。  你可以使用git for-each-ref --format='%(upstream:short)' refs/heads/<branch>来做到这一点。  该命令将返回<branch>的远程跟踪分支或空字符串(如果它没有)。  在SO的某个地方有一个不同的版本,如果分支没有远程追踪分支,它将返回一个错误,这可能对你的目的更有用。 
最后,我在我的C ++ 11 git-ws插件中实现了这一点。
string currentBranch = run("git rev-parse --abbrev-ref HEAD"); 
bool canCommit = run("git diff-index --name-only --ignore-submodules HEAD --").empty();
bool canPush = stoi(run("git rev-list HEAD...origin/" + currentBranch + " --ignore-submodules --count")[0]) > 0;
  似乎工作到目前为止。  canPull仍然需要测试和实施。 
说明:
currentBranch获取控制台输出,它是当前分支名称的一个字符串 canCommit获取控制台是否输出某些内容(当前更改和HEAD之间的区别,忽略子模块) canPush获取origin / currentBranch和本地回购之间的变化计数 - 如果> 0 ,则可以推送本地回购 感谢@Trebor我只是为了这个目的扔了一个简单的鱼类功能:
#! /usr/bin/fish
#
# Echos (to stdout) whether your branch is up-to-date, behind, ahead or diverged from another branch.
# Don't forget to fetch before calling.
#
# @param branch
# @param otherbranch
#
# @echo string up-to-date/behind/ahead/diverged
#
# @example
#
#   # if master is ahead of origin/master you can find out like this:
#   #
#   if test ( branch-status master origin/master ) = ahead
#
#      echo "We should push"
#
#   end
#
function branch-status
    set -l a $argv[ 1 ]
    set -l b $argv[ 2 ]
    set -l base ( git merge-base $a $b )
    set -l aref ( git rev-parse  $a    )
    set -l bref ( git rev-parse  $b    )
         if [ $aref = $bref ]; echo up-to-date
    else if [ $aref = $base ]; echo behind
    else if [ $bref = $base ]; echo ahead
    else                     ; echo diverged
    end
end
