Git只能用于裸仓库的推送吗?

19

当我尝试将“git push origin master”推送到我的外部磁盘上的远程仓库时,出现了Git警告,指出下一个Git版本将默认拒绝推送到检查仓库。在我的外部磁盘上,我已经检出了项目,并且我想将我在计算机上所做的更改发送到这些仓库中。难道“git push origin master”不是正确的方法吗?我必须在我的外部磁盘上的仓库上执行“git pull ...”吗?所以我不能推送更改,只能拉取它们吗?只有使用“裸”仓库才有所不同吗?因此,如果我在外部磁盘上的仓库是一个裸仓库,那么我就可以向其推送更改了吗?我的理解正确吗?

2个回答

23

仔细阅读警告。新的默认禁止仅限于在非裸库中推送到当前检出分支。在非裸库中,将任何其他分支推送都是完全可以的。

原因是推送过程无法直接访问工作树,因此索引和分支头在工作树下被更改。随后进入工作树时,看起来像工作树已经撤消了混杂在其中的推送的更改和任何真正开发中的更改。这使得非常难以区分这两组更改。

推送到其他分支没有这样的缺点。然后您可以转到该存储库并将这些更改合并到检出分支中(如果需要)。


4
直到我阅读了 git ready » push to only bare repositoriesall about "bare" repos -- what, why, and how to fix a non-bare push(尤其是“是的,但为什么我需要一个裸库?”部分),我才理解这个答案。现在我明白了! - Alexander Wallin
我们是否有能力在未签出的分支中进行推送,然后使用 post-receive 钩子将 origin 分支与已更新的分支合并? - Nikita U.

6

你不应该向非裸库进行推送,因为推送只会更新仓库的内部状态,而不会影响已检出的、在磁盘上的文件副本。因此,如果你在没有首先更新(通过 git checkout)仓库中文件状态的磁盘副本的情况下开始在该仓库中工作,可能会遇到问题。


那么,将代码推送到仓库并不完全等同于从仓库拉取代码? - lprsd
3
成为Guru:正确;推送(push)实际上是与获取(fetch)相反的操作。拉取(pull)= 获取(fetch)+ 合并到当前分支。 - ebneter
2
关键在于拉取操作还会更新工作树中的文件(即“磁盘上”的文件),而推送和获取操作则不会。 - mipadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接