检查本地git repo是否位于远程前后

Vit*_*meo 8 linux git bash shell github

我正在开发一个Git插件,我需要知道,当一个本地回购被改变(可提交更改),未来(可推送到远程)或后面(可以从远程拉)使用命令行.

这就是我到目前为止所做的事情:

  • 可以提交?

    如果git diff-index --name-only --ignore-submodules HEAD --返回一些东西,那么是的,有提交的更改.

  • 可以推吗?

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

  • 能拉吗?

    还没有实现.

可以提交?部分似乎工作正常.可以推吗?仅适用于主分支,这是一个很大的问题.

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

小智 17

备查。从 Git v2.17.0 开始

git status -sb
Run Code Online (Sandbox Code Playgroud)

包含后面的词。这样就可以直接使用它来检查拉动。

注意:运行git fetch前记得运行git status -sb


Tre*_*ude 6

你可以结合使用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的某个地方有一个不同的版本,如果分支没有远程跟踪分支,它将返回错误,这可能对您的目的更有用.


Vit*_*meo 6

最后,我在我的 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;
Run Code Online (Sandbox Code Playgroud)

到目前为止似乎工作。canPull仍然需要测试和实施。

解释:

  • currentBranch 获取控制台输出,这是当前分支名称的字符串
  • canCommit 获取控制台是否输出某些内容(当前更改和 HEAD 之间的差异,忽略子模块)
  • canPush获取 origin/currentBranch和本地仓库之间变化的计数- 如果> 0,则可以推送本地仓库


kin*_*nai 5

这个答案

  1. 做一个获取:git fetch
  2. 获取当前分支后面有多少提交:behind_count = $(git rev-list --count HEAD..@{u}).
  3. 获取当前分支前面有多少提交:ahead_count = $(git rev-list --count @{u}..HEAD). (它假设您从哪里获取就是您推送到的位置,请参阅push.default配置选项)。
  4. 如果behind_countahead_count都为 0,则当前分支是最新的。
  5. 如果behind_count为 0 且ahead_count大于 0,则当前分支在前面。
  6. 如果behind_count大于0且ahead_count为0,则当前分支落后。
  7. 如果behind_countahead_count都大于 0,则当前分支发散。

解释:

  • git rev-list列出所有提交范围的提交。--count选项输出将列出多少提交,并禁止所有其他输出。
  • HEAD 命名当前分支。
  • @{u}指当前分支的本地上游(用branch.<name>.remote和配置branch.<name>.merge)。还有@{push},它通常是指向一样的@{u}
  • <rev1>..<rev2>指定提交范围,包括可从 访问的提交,但不包括可从 访问的提交。当省略 or 时,默认为 HEAD。