首页 > 解决方案 > 我看到不存在的远程分支,在这种情况下 git remote prune origin 会做什么?

问题描述

我愿意:

$ git branch -a
  feature/XXX-5793
  feature/XXX-6864
  feature/XXX-7534
  feature/XXX-9067
  feature/XXX-9204
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/feature/BIOVK-13
  remotes/origin/feature/XXX-11313
  remotes/origin/feature/XXX-11481
  remotes/origin/feature/XXX-3311
  remotes/origin/feature/XXX-5793
  remotes/origin/feature/XXX-6448
  remotes/origin/feature/XXX-7237
  remotes/origin/feature/XXX-7534
  remotes/origin/feature/XXX-9067
  remotes/origin/feature/XXX-9204
  remotes/origin/master

我的第一个问题是:在 remotes/origin 列表中有一些分支不再在我们的 bitbucket 服务器上。这个怎么可能?

在此之后我做了:

$ git remote prune origin
Pruning origin
URL: ...
 * [pruned] origin/feature/XXX-11481
 * [pruned] origin/feature/XXX-3311
 * [pruned] origin/feature/XXX-5793
 * [pruned] origin/feature/XXX-6448
 * [pruned] origin/feature/XXX-7237
 * [pruned] origin/feature/XXX-9067
 * [pruned] origin/feature/XXX-9204

我的第二个问题是:我想: git remote prune origin 删除了不再存在的远程本地分支。但是在这里我的远程分支列表被清除了。

后来我用 git branch -d 去掉了本地分支,结果变成了:

$ git branch -a
  feature/XXX-7534
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/feature/XXX-11313
  remotes/origin/feature/XXX-7534
  remotes/origin/master

标签: gitgithubbitbucket

解决方案


git 被设计成完全去中心化的,并且可以在没有始终在线的互联网连接的情况下使用,因此实际上很少有命令与远程服务器联系。

在不联系 Bitbucket 服务器的情况下,git 无法知道哪些分支实际上仍然存在。那么您看到的分支名称是什么,当您询问时哪些分支名称被“修剪”了?

如果您查看手册中的描述git remote prune,您会看到:

默认情况下,<name> 下过时的远程跟踪分支被删除

这里的基本情况是,当您远程服务器获取数据时,git 会以“远程跟踪分支”的形式缓存这些数据。这些行为有点像普通分支,但实际上只是一个标记,表示“上次我们与远程服务器交谈时,有一个具有此名称和此提示提交的分支”。

这些指针与您可能使用相同名称创建的本地分支完全分开:您可能有一个本地“master”,一个“origin/master”指的是一个远程服务器,一个“joebloggs/master”指的是不同的远程服务器服务器。同时,实际的远程服务器可能在 master 上有新的提交,或者已经完全删除了它,但是你的互联网没有插上电源,所以你无法知道。

这使您可以运行命令,例如根据您拥有的远程分支的最新缓存git diff master origin/master将名为“master”的本地分支与远程分支“master”进行比较。

默认情况下(没有--prune选项),运行git fetch将创建和更新这些指针,但永远不会删除它们 - 如果远程服务器上没有该名称的分支,则本地指针将留在最后一次看到的地方。这些是手册正在谈论的“陈旧的远程跟踪分支”:曾经存在于远程服务器上但不再存在的东西的缓存。


推荐阅读