git status --short:缺少“你的分支超过'origin / master'提交1次”

时间:2016-02-11 09:45:55

标签: git

我喜欢在一个简单的脚本中使用git status --short来检查是否 所有回购都没有变化。

我想知道是否有尚未推送的提交。

我查看了git status的帮助,发现无法输出此消息:

Your branch is ahead of origin/master by 1 commit

如果没有推送,没有如果一切正常。

我可以使用git status并使用grep忽略行,但这不是一个好方法。

目标:

  • 如果未进行任何更改且没有缺少推送,则不输出任何内容
  • 如果存在更改且缺少推送,则简要输出

2 个答案:

答案 0 :(得分:6)

“git status”的帮助实际上显示了您可以使用的选项:

  

<强> -b
  的 - 分支
  即使是短格式也能显示分支和跟踪信息。

--short模式下的格式不同,但它就在那里:

$ git status --short --branch
## master...origin/heads/master [ahead 2]
[...]                           ^^^^^^^^^

如果您不关心输出格式,git status --short --branch在内部运行等效的git rev-list --left-right @...@^{upstream}并解释其结果。您可以直接运行git rev-list。当且仅当您的当前分支和远程分支不同时,它将提供输出,通过提供当前分支但不在远程分支(前面)中的提交,以及远程分支中的提交但是不是在你当前的分支(后面),以diff - 样式格式。

前进:

$ git rev-list --left-right @...@{upstream}
<baa782ec4590a91d9835c36ad33f7681e4a859d5
<8b6255249bc08e2f14d8b6f31bab83b9c48cb698

背后:

$ git rev-list --left-right @...@{upstream}
>0e0140fbf6f903aa7205063eac5b8cf6e268ab3b

这两种:

$ git rev-list --left-right @...@{upstream}
<a7992ac7127b37d24b00fbecf67156688285be15
>0e0140fbf6f903aa7205063eac5b8cf6e268ab3b

您可以选择使用git log代替git rev-list,并使用其常规格式选项(例如--oneline)来根据您的喜好定制输出格式。

或者,如果您不关心传入的更改,则可以将--left-right @...@{upstream}更改为仅@{upstream}..@

答案 1 :(得分:2)

那是因为您的本地分支机构未配置为跟踪&#34;匹配的远程分支。

这有点违反直觉(对于初学者),但背景是你可能有几个遥控器(你的&#34;起源&#34;那些东西)与你沟通,这些通信的模式可能是复杂。

您可以选择明确标记您的本地分支为&#34;跟踪&#34;单个远程分支,一旦你完成了某些Git命令就会开始提示你这两个&#34;链接&#34;分支与历史有关。

设置本地分支&#34; foo&#34;跟踪远程分支&#34; origin / foo&#34;使用

git checkout foo
git branch --set-upstream-to origin/foo

(您可以使用-u代替--set-upstream-to)。

还有一个较旧的(并且更难使用)--track命令行选项:

git branch --track foo origin/foo

(请注意,在这种情况下,该命令需要明确拼写本地分支的名称。)

还有其他方法可以将分支轨道设置为远程分支:

  1. 推送:

    git push -u foo origin
    

    会推动&#34; foo&#34;来源&#34;起源&#34;并将其设置为跟踪&#34; origin / foo&#34;在同一时间。

  2. 使用快捷命令初始创建时:

    git checkout origin/foo
    

    会创建一个本地分支&#34; foo&#34;指向相同的提交&#34; origin / foo&#34;指着,并立即设置跟踪信息。

  3. 为了获得更好的效果,请在Git中熟悉remote branches的概念。