git fetch 是否会获取已删除的分支?及协作场景验证问询
能不能通过
git fetch --all看到已删除的分支B的内容? 这得分两种情况来看,核心取决于用户B删除分支B时,有没有把分支B的提交推送到远程仓库,以及远程仓库是否还保留着那些提交记录:
情况1:用户B已经把分支B的提交推送到远程仓库,之后删除了远程分支B
Git里的分支本质就是个指向特定提交的轻量级指针,删除分支只是删掉这个指针,提交本身不会立刻消失——只要远程仓库还没运行垃圾回收(GC)清理这些“无主”提交,它们就还躺在远程的对象数据库里。
但这里有个关键点:git fetch --all默认只会拉取远程仓库里有分支/标签等引用指向的内容。如果远程的origin/B分支已经被删除,fetch不会自动帮你把那些无主提交拉到本地,所以你现在看不到分支B的内容是正常的。
不过你还是有办法拿到这些内容:
- 让用户B提供分支B最后一次提交的哈希值(他可以通过
git reflog在本地找回,因为本地的reflog会记录最近的操作记录)。拿到哈希后,你可以执行:
这样就能查看分支B的内容了,要是想把它恢复成本地分支,就用git fetch origin <提交哈希> git checkout <提交哈希>git checkout -b branch-B <提交哈希>。 - 如果用户B方便的话,他可以自己在本地恢复分支B(用上面提到的
git reflog找回提交后创建分支),然后重新推送到远程仓库。这时候你执行git fetch origin就能看到origin/B,再checkout到本地即可。
情况2:用户B只在本地创建并提交了分支B,从未推送到远程仓库
这种情况下,分支B的所有提交只存在于用户B的本地仓库里,远程仓库根本没有这些数据。不管你怎么执行git fetch --all,都不可能拿到分支B的内容——因为远程仓库里压根就没这个东西。
这时候只能让用户B在本地恢复分支B(同样用git reflog),然后推送到远程仓库,你才能通过git fetch拉取到。
总结一下:如果分支B的提交曾经推送到远程过,你还有机会通过提交哈希找回;如果从来没推过,那只能让用户B把内容推上来才行。
内容的提问来源于stack exchange,提问作者Sebi
相关产品推荐
相关产品推荐

