为什么 `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 push error '[remote rejected] master -> master (branch is currently checked out)'
- Push to a non-bare Git repository
- Git pushing to non-bare repo, save current worktree
- Git: making pushes to non-bare repositories safe
这更像是一个 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
首先,我了解 如何 推送到非裸机 git 远程,包括 git 配置选项的使用 receive.denyCurrentBranch
和其他解决方法,所以我 不是 寻找答案,例如此处的答案:
- Git push error '[remote rejected] master -> master (branch is currently checked out)'
- Push to a non-bare Git repository
- Git pushing to non-bare repo, save current worktree
- Git: making pushes to non-bare repositories safe
这更像是一个 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