git - Git中清理陈旧分支的正确方法是什么?
问题描述
如果我运行git fetch --all --prune
这是否会在本地删除陈旧的分支,或者它是否首先从克隆中获取所有分支然后进行清理。
我注意到一个案例,我是从一台机器上做的,然后git push --delete origin some_branch
在另一个完整的实例中做完之后分支仍然在那里。
我不明白这种行为,清理陈旧分支的正确方法是什么?git fetch --all --prune
git pull
解决方案
首先,请注意--all
ingit fetch
表示所有遥控器,而不是所有引用。也就是说,如果您有通常的单个远程命名origin
,--all
则什么都不做。
接下来,请记住分支名称(例如 in 中的名称)和远程跟踪名称(有时称为远程跟踪分支名称)之间的区别,refs/heads/
后者是refs/heads/master
一个引用,后跟远程refs/remotes/
名称。什么--prune
是删除在特定遥控器上没有对应名称的远程跟踪名称。
git fetch
通常做的是:
在与该遥控器一起存储的 URL 处调用 Git,例如,
git config --get remote.origin.url
从origin
.让他们列出他们的参考名称(运行
git ls-remote
以查看这些名称)。与该 Git 对话以获取 Git 对象——主要是提交对象,但步骤 2 中输出的任何对象都是候选对象——它们具有、我们没有、我们想要(基于给定的任何附加参数
git fetch
,或配置的环境)。最后,在获取所有对象后,根据在该远程上看到的分支名称创建或更新本地名称,通常为 形式。但见下文,因为这一步有并发症。
refs/remotes/remote/name
如果您启用了修剪(通过或配置选项) ,则在此更新期间,您的 Git 可能会删除其中一些远程跟踪名称。
--prune
这一切都很好git pull
,它运行git fetch
后跟第二个 Git 命令,可以运行它的第二个 Git 命令。
最后,请注意,--prune
要正常工作,您需要一个典型设置,例如,如果在 Git 存储库中没有a,则从您自己的存储库中读取,然后删除。如果你做了一个克隆,那一行会有不同的内容,会失效。remote.remote.fetch
remote.origin.fetch
+refs/heads*:refs/remotes/origin/*
git fetch --prune
refs/remotes/origin/xyzzy
refs/heads/xyzzy
remote.origin.url
--single-branch
remote.origin.fetch
--prune
鉴于您观察到的情况,您似乎有一个非标准remote.origin.fetch
设置,可能是由于将克隆创建为单分支克隆。
推荐阅读
- javascript - 有没有办法在 Mojs 中只将左上边框半径添加到形状(不是 Html)模块
- java - Android Studio 显示错误错误和奇怪的代码,但应用程序运行正常
- c# - 在现有 Excel 文件中添加一行并保存
- python - 如何使用 ruamel.yaml 正确输出字符串
- node.js - 如何用 typescript 续集 findAll 和 include
- python - 是否有熊猫功能可以每天从日期时间列中获取特定时间戳?
- javascript - 使用 useState 更新深层嵌套状态无法正常工作
- php - 在处理 MySql 数据库事务时使用 PHP Throwable 是最佳实践吗?
- visual-studio - 为什么在使用 Docker 时出现错误消息“无效的参考格式”?
- javascript - 如何在 ReactJs 中用矩形框扭曲某些组件?