Git四类分支关联总结脚本编写的技术疑问
Git分支配置与追踪相关问题解答
问题1:执行$TRACKING_BRANCH = git config branch.$LOCAL_BRANCH.merge获取的是$LOCAL_BRANCH的本地追踪分支,还是它所追踪的远程追踪分支?
这个命令返回的是本地分支关联的上游分支的引用路径,格式通常为refs/heads/<分支名>,指向的是远程仓库中的对应分支(比如refs/heads/main对应远程的main分支),并非本地的远程追踪分支(本地远程追踪分支的格式是refs/remotes/<远程名>/<分支名>,比如refs/remotes/origin/main)。
问题2:若上述变量值为null,是否可确认$LOCAL_BRANCH为本地非追踪分支?
是的。当本地分支未配置上游追踪关系时,git config branch.$LOCAL_BRANCH.merge不会返回任何值,此时可以确定该分支是未设置追踪的本地分支。
问题3:如何获取远程追踪分支的名称?是否为refs/heads/$LOCAL_BRANCH?本地分支与远程追踪分支的名称后缀能否不同?
- 获取远程追踪分支的完整引用路径,需要结合两个配置项:先用
git config branch.$LOCAL_BRANCH.remote拿到远程仓库名(比如origin),再用git config branch.$LOCAL_BRANCH.merge拿到上游分支的短路径(比如refs/heads/feature-v1),将后者的refs/heads/替换为refs/remotes/<远程名>/,就能得到远程追踪分支的完整路径,比如refs/remotes/origin/feature-v1。 refs/heads/$LOCAL_BRANCH是远程仓库中分支的引用路径,不是本地的远程追踪分支。- 本地分支和远程追踪分支的名称后缀可以完全不同。比如你可以创建本地分支
dev-feature,通过git checkout -b dev-feature origin/feature-v1命令让它追踪远程的origin/feature-v1,后续也能通过git branch -u origin/feature-v1 dev-feature修改追踪关系。
问题4:如何获取远程分支的名称?是否为refs/heads/$REMOTE_NAME/$LOCAL_BRANCH?本地、远程追踪、远程分支的名称后缀是否可能不一致?
- 远程分支在远程仓库中的完整引用路径是
refs/heads/<分支名>,本地仓库中对应的远程追踪分支路径是refs/remotes/<远程名>/<分支名>。如果要获取远程分支的短名称,可以从git config branch.$LOCAL_BRANCH.merge的结果中提取最后一段,比如从refs/heads/remote-fix中提取出remote-fix。 refs/heads/$REMOTE_NAME/$LOCAL_BRANCH这个格式是错误的,远程仓库的分支路径不会包含远程名作为前缀。- 三者的名称后缀完全可以不一致。比如本地分支叫
local-fix,远程追踪分支是origin/remote-fix,对应的远程分支实际是remote-fix,只需通过git branch -u origin/remote-fix local-fix配置追踪关系即可。
问题5:是否存在远程追踪分支所追踪的远程分支已不存在的情况?比如远程分支被删除后形成的陈旧分支?
存在这种情况。当远程仓库的分支被删除后,本地的远程追踪分支(比如origin/old-branch)不会自动删除,会成为失效的陈旧分支。你可以用git remote prune <远程名>命令手动清理本地所有失效的远程追踪分支,或者用git fetch --prune在拉取远程代码时同步清理这些陈旧分支。
内容的提问来源于stack exchange,提问作者joseville
相关产品推荐
相关产品推荐

