首次使用git remote update https://git-scm.com/docs/git-remote,使您的远程参考保持最新。然后您可以执行以下操作之一,例如:
-
git status -uno
会告诉您正在跟踪的分支是否领先、落后或已经偏离。如果什么也没说,本地和远程是一样的。
-
git show-branch *master
将向您显示名称以“master”结尾的所有分支中的提交(例如master and 起源/主人).
如果你使用-v
with git remote update
(git remote -v update
)您可以看到哪些分支已更新,因此您实际上不需要任何进一步的命令。
但是,您似乎想在脚本或程序中执行此操作并最终得到 true/false 值。如果是这样,有一些方法可以检查您当前的关系HEAD提交和您正在跟踪的分支的负责人,尽管由于有四种可能的结果,您不能将其简化为是/否答案。但是,如果您准备做pull --rebase
那么你可以将“本地落后”和“本地已发散”视为“需要拉动”,将另外两个(“本地领先”和“相同”)视为“不需要拉动”。
您可以使用以下命令获取任何引用的提交 IDgit rev-parse <ref>
,所以你可以这样做master and 起源/主人并比较它们。如果它们相等,则分支是相同的。如果它们不相等,您想知道哪个领先于另一个。使用git merge-base master origin/master
会告诉你两个分支的共同祖先,如果它们没有分歧,那么这将与其中一个分支相同。如果你得到三个不同的 id,则分支已经分叉。
为了正确地执行此操作,例如在脚本中,您需要能够引用当前分支及其正在跟踪的远程分支。 bash提示符设置功能在/etc/bash_completion.d
有一些用于获取分支名称的有用代码。但是,您实际上可能不需要获取名称。 Git 有一些简洁的简写来引用分支和提交(如git rev-parse --help
)。特别是,您可以使用@
对于当前分支(假设您不处于分离头状态)并且@{u}
为其上游分支(例如origin/master
). So git merge-base @ @{u}
将返回当前分支及其上游分歧的提交(哈希值)git rev-parse @
and git rev-parse @{u}
会给你两个提示的哈希值。这可以总结为以下脚本:
#!/bin/sh
UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")
if [ $LOCAL = $REMOTE ]; then
echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
echo "Need to push"
else
echo "Diverged"
fi
Note:旧版本的 git 不允许@
单独使用,所以你可能需要使用@{0}
反而。
线路UPSTREAM=${1:-'@{u}'}
允许您选择显式传递上游分支,以防您想要检查与当前分支配置的远程分支不同的远程分支。这通常是以下形式远程名称/分支名称。如果没有给出参数,则该值默认为@{u}
.
该脚本假设您已经完成了git fetch
or git remote update
首先,使跟踪分支保持最新状态。我没有将其构建到脚本中,因为能够将获取和比较作为单独的操作进行更加灵活,例如,如果您想在不获取的情况下进行比较,因为您最近已经获取了。