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

标签 git git-push git-fetch git-non-bare-repository

首先,我了解与推送到非裸 git 远程服务器相关的如何,包括使用 git 配置选项 receive.denyCurrentBranch和其他变通方法,所以我在此处寻找答案:

这更像是一个 git 实现/表示/哲学问题。

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

这样做的动机实际上与其他提出如何问题的人相同:由于{firewall,我没有任何方法可以轻松地从远程访问推送的“源” , nat, security} 原因。

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

最佳答案

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

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

关于git - 为什么非裸远程的 `git push` 不是远程的 `git fetch` 的对偶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31233581/

相关文章:

git - 如何将 fetch 的结果 merge 到 master 中?

git - 如何更新 git clone --mirror?

Windows (Cygwin) 上的 Git 提交已损坏。

Git Push 说明 - 推送什么?

Git 传输协议(protocol)规范

GIT:致命: 'master' 似乎不是 git 存储库

git - 推送的 git 存储库在 gitk 上缺少分支和标签名称

GIT:如何正确地将远程分支下载到本地?

node.js - 在git中 merge package.json(解决版本冲突)

git - 对 Git 项目进行更改,但未经批准不得点或覆盖项目上的文件