我有一个“主”裸存储库和一个“个人”裸存储库。我想将更改从“主”更新为“个人”,所以我运行:
$ git pull
fatal: /home/gimenero/applib/git/libexec/git-core/git-pull cannot be used without a working tree.
如何将更改推送到“main”?
答案 0 :(得分:45)
git pull
执行fetch
后跟merge
,如果没有工作树,则无法合并。 (如果出现合并冲突,将无处可解决合并冲突。)
相反,你可以只是获取。假设您的主存储库在您的个人存储库中配置为远程调用源:
$ git fetch origin master:master
请注意,只有当您的个人存储库的主分支镜像主存储库的主分支时,才会成功。否则,Git将拒绝非快进提取。
答案 1 :(得分:23)
更新:
$ git fetch origin +refs/heads/*:refs/heads/* --prune
首先抛开一边:当我们谈到名为" xyz"的分支时,git实际上将其称为refs/heads/xyz
。但你可以输入" xyz
"总之,因为否则会是疯了。 (顺便提一下,标签是refs/tags/xyz
。)普通xyz
不明确,因为它可能是分支,标签或提交哈希的前N个字母。另一方面,refs/heads/xyz
明确表示一个分支。
因此,即使您可以键入git fetch origin foo:bar
来将您的foo
分支作为名称bar
存储在您的存储库中,您也可以更明确地键入git fetch origin refs/heads/foo:refs/heads/bar
来执行相同的操作。 (虽然如果foo
实际上是一个标签而不是分支,后者将失败,因为他们refs/heads/foo
不存在。明确性ftw。)
git fetch origin refs/heads/*:refs/heads/*
表示所有分支都属于我们。运行该命令,就好像*
部分替换为其每个分支的分支名称一样。即git fetch origin refs/heads/abc:refs/heads/abc refs/heads/def:refs/heads/def ...
(假设他们的分支名为abc
和def
)。
--prune
选项表示我们的存储库中与refs/heads/*
匹配但在其存储库中不存在的任何分支已删除。
最后,+
前缀允许非快进提取。没有它,对需要强制更新的分支的任何更新都将被拒绝。
总而言之,最终结果是您的存储库中的分支看起来与它们完全相同。
- [deleted] (none) -> bar
* [new branch] foo -> foo
4812558a5f..a6aeec6517 abc -> abc
+ a1b2c3d4e5...1a2b3c4d5e def -> def (forced update)
foo
,abc
,def
,而我们有一个额外的:bar
bar
删除--prune
并强制更新def
前缀所允许的+
。如果+
和--prune
被取消,会发生什么事情:
* [new branch] foo -> foo
4812558a5f..a6aeec6517 abc -> abc
! [rejected] def -> def (non-fast-forward)
将顶部的命令与以下命令进行比较:
$ git fetch origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* [--prune]
这实质上是我们输入git fetch origin [--prune]
时发生的事情!