首页 > 解决方案 > Git中清理陈旧分支的正确方法是什么?

问题描述

如果我运行git fetch --all --prune这是否会在本地删除陈旧的分支,或者它是否首先从克隆中获取所有分支然后进行清理。
我注意到一个案例,我是从一台机器上做的,然后git push --delete origin some_branch在另一个完整的实例中做完之后分支仍然在那里。 我不明白这种行为,清理陈旧分支的正确方法是什么?git fetch --all --prune git pull

标签: gitgit-branchgit-pullgit-fetch

解决方案


首先,请注意--allingit fetch表示所有遥控器,而不是所有引用。也就是说,如果您有通常的单个远程命名origin--all则什么都不做。

接下来,请记住分支名称(例如 in 中的名称)和远程跟踪名称(有时称为远程跟踪分支名称)之间的区别refs/heads/后者是refs/heads/master一个引用后跟远程refs/remotes/名称。什么--prune是删除在特定遥控器上没有对应名称的远程跟踪名称。

git fetch通常做的是:

  1. 在与该遥控器一起存储的 URL 处调用 Git,例如,git config --get remote.origin.urlorigin.

  2. 让他们列出他们的参考名称(运行git ls-remote以查看这些名称)。

  3. 与该 Git 对话以获取 Git 对象——主要是提交对象,但步骤 2 中输出的任何对象都是候选对象——它们具有、我们没有、我们想要(基于给定的任何附加参数git fetch,或配置的环境)。

  4. 最后,在获取所有对象后,根据在该远程上看到的分支名称创建或更新本地名称,通常为 形式。但见下文,因为这一步有并发症。refs/remotes/remote/name

    如果您启用了修剪(通过或配置选项) ,则在此更新期间,您的 Git 可能会删除其中一些远程跟踪名称。--prune这一切都很好git pull,它运行git fetch后跟第二个 Git 命令,可以运行它的第二个 Git 命令。

最后,请注意,--prune要正常工作,您需要一个典型设置,例如,如果在 Git 存储库中没有a,则从您自己的存储库中读取,然后删除。如果你做了一个克隆,那一行会有不同的内容,会失效。remote.remote.fetchremote.origin.fetch+refs/heads*:refs/remotes/origin/*git fetch --prunerefs/remotes/origin/xyzzyrefs/heads/xyzzyremote.origin.url--single-branchremote.origin.fetch--prune

鉴于您观察到的情况,您似乎有一个非标准remote.origin.fetch设置,可能是由于将克隆创建为单分支克隆。


推荐阅读