检查本地git仓库是否在远程前/后

我正在开发一个git插件,并且我需要使用命令行知道本地repo何时发生更改(可以提交更改),提前(可以推送到远程)还是后面(可以从远程提取)。

这是我迄今为止所做的:

  • 可以提交?

    如果git diff-index --name-only --ignore-submodules HEAD --返回某些内容,那么是的,这些更改会提交。

  • 可以推?

    如果git status -sb在输出中包含前面的单词,那么是的,有提交推送。

  • 可以拉?

    还没有实施。

  • 可以提交? 部分似乎正常工作。 可以推? 只适用于主分支,这是一个巨大的问题。

    我该如何安全地检查每个分支上的git repo是否有更改提交,提交或需要git pull


    你可以使用git merge-basegit 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
    
    链接地址: http://www.djcxy.com/p/31761.html

    上一篇: Check if local git repo is ahead/behind remote

    下一篇: git create patch from unpushed commits