Git push --all与--mirror的区别是什么?我的认知是否正确?还有其他差异吗?
Git Push --all vs --mirror:核心差异拆解
首先要给你点个赞,你的认知完全正确:当本地删除分支后,git push --all不会把这个删除操作同步到远程仓库,而git push --mirror会精准推送这个删除动作,让远程分支和本地保持一致。
除了这个关键区别,二者还有这些核心差异:
1. 推送的对象范围不同
git push --all只负责推送本地已与远程建立追踪关系的分支。简单说就是那些你之前推过、或者通过git checkout -b <分支名> origin/<分支名>关联过的分支,本地新建的未设置上游的分支,--all根本不会管它。git push --mirror则是同步所有本地引用,包括所有分支、所有标签(tags),甚至是一些Git内部的特殊引用(比如refs/remotes下的内容),相当于把本地仓库的完整状态原封不动镜像到远程,是1:1的完全同步。
2. 标签的处理逻辑不同
git push --all完全忽略标签,哪怕你本地新建了一堆标签,用--all推送时也不会把标签推送到远程,要同步标签得单独用git push --tags。git push --mirror会自动同步所有标签:本地新建的标签会被推到远程,本地删除的标签也会同步删除远程对应的标签,不用额外操作。
3. 对远程冗余引用的清理不同
除了你说的分支删除,git push --mirror还会清理所有本地不存在的远程引用:比如远程有个旧标签你本地已经删了,或者远程有个分支你本地早就移除了,--mirror都会把这些远程的冗余内容删掉;而git push --all只会推送本地分支的更新,完全不会去碰远程的冗余分支或标签。
4. 适用场景天差地别
git push --all是日常开发的好帮手:比如你本地有几个工作分支,想把所有已关联分支的最新代码推到远程,又不想同步删除操作或者标签,用它就够了。git push --mirror则是仓库备份/迁移的首选:比如你要把一个仓库完整复制到新的远程平台,需要完全同步所有分支、标签,甚至要把本地已经删除的内容从远程也清掉,这时候--mirror能帮你一步到位,保证远程和本地仓库状态完全一致。
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

