git status输出中branch.upstream与branch.ab的区别及单独触发条件
可复现场景说明
只要满足「本地分支已配置上游分支,但本地不存在上游分支对应的提交对象」的条件,就会出现只显示branch.upstream、不显示branch.ab的情况,以下是具体复现步骤:
- 先准备测试环境:
- 本地新建裸仓库模拟远程端:
mkdir test-remote && cd test-remote && git init --bare && cd ..- 克隆远程仓库到本地:
git clone test-remote test-local && cd test-local- 本地完成首次提交并推送到远程main分支:
echo "test content" > a.txt && git add . && git commit -m "init commit" git push -u origin main - 触发目标场景的操作:
- 本地新建dev分支,无需提交任何内容
git checkout -b dev- 手动给dev分支配置上游为远程的
origin/dev分支(此时远程还不存在dev分支,本地也没有对应的远程跟踪提交记录)
git branch --set-upstream-to=origin/dev- 执行
git status查看输出,即可看到仅展示branch.upstream origin/dev,没有branch.ab相关行。
另外还有一种常见触发场景:你之前配置过上游、也正常拉取过提交,但后续手动删除了本地对应的远程跟踪引用(比如执行git update-ref -d refs/remotes/origin/dev),此时git status也只会显示上游配置,不会显示前后差统计。
原理说明
branch.ab的ahead/behind数值需要对比本地分支HEAD和上游分支对应提交的祖先关系计算得出,如果本地不存在上游分支对应的提交对象,Git无法完成差值计算,自然不会展示该行;而branch.upstream仅读取本地的分支配置,只要你配置了上游地址就会展示,和上游提交是否存在于本地无关。
内容的提问来源于stack exchange,提问作者ZP-ZPanda
相关产品推荐
相关产品推荐

