为什么 `git push` 到非裸远程不是来自远程的 `git fetch` 的对偶

Why is `git push` to non-bare remote not the dual of `git fetch` from the remote

首先,我了解 如何 推送到非裸机 git 远程,包括 git 配置选项的使用 receive.denyCurrentBranch 和其他解决方法,所以我 不是 寻找答案,例如此处的答案:

这更像是一个 git implementation/representation/philosophical 问题。

为什么非裸遥控器的 git push <remote> 不能与遥控器的 git fetch <source> 双重或基本相同?这样,我在遥控器上的本地工作目录可能已经过时(落后于)新内容,我什至可能有本地更改(提前提交,甚至 staged/unstaged/stashed/whatever),但该工作目录完全没有被推送操作?如果是这样,那么一旦在远程,我就可以合并或变基或任何必要的。事实上,这正是 this kernel.org git faq entry 所声称的。

这样做的动机真的和大家问how的问题是一样的:我没有任何办法可以轻松访问推送的"source"由于{防火墙、nat、安全}原因来自远程。

可能我缺少一些关于 git 如何真正跟踪事物的基础知识,“如果我只理解 XXXX”,我就会知道答案;请赐教。

问题是推送会重写引用。 HEAD 是 latest checkout 的同义词,重写 ref 会默默地使工作树和索引无效——该 repo 中的提交将丢失推送的更改,没有迹象表明发生了这种情况。拒绝推送是最简单的解决方案。如果在目的地做 git pull 不是一个选项,那么推到一次性并修复参考:

git push origin master:fakemaster
cd $origindir
git checkout -B master fakemaster
git branch -D fakemaster