我有一个"主"裸存储库和一个"个人"裸存储库.我想将更改从"主"更新为"个人",所以我运行:
$ git pull
fatal: /home/gimenero/applib/git/libexec/git-core/git-pull cannot be used without a working tree.
Run Code Online (Sandbox Code Playgroud)
如何将更改推送到"主"?
Ben*_*mes 48
A git pull
执行a fetch
后跟a merge
,如果没有工作树,则无法合并.(如果出现合并冲突,将无处可解决合并冲突.)
相反,你可以只是获取.假设您的主存储库在您的个人存储库中配置为远程调用源:
$ git fetch origin master:master
Run Code Online (Sandbox Code Playgroud)
请注意,只有当您的个人存储库的主分支镜像主存储库的主分支时,才会成功.否则,Git将拒绝非快进提取.
ant*_*tak 29
更新时间:
$ git fetch origin +refs/heads/*:refs/heads/* --prune
Run Code Online (Sandbox Code Playgroud)
首先是旁白:当我们谈到一个名为"xyz"的分支时,git实际上将其称为refs/heads/xyz
.但你可以xyz
简短地输入" ",否则就会疯了.(顺便说一句,标签是refs/tags/xyz
.)Plain 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)
Run Code Online (Sandbox Code Playgroud)
foo
,abc
,def
而我们有(有)一个额外的:bar
bar
的--prune
和强制更新的def
允许的+
前缀.这里是不是会发生什么,如果+
和--prune
都不放过:
* [new branch] foo -> foo
4812558a5f..a6aeec6517 abc -> abc
! [rejected] def -> def (non-fast-forward)
Run Code Online (Sandbox Code Playgroud)
将顶部的命令与以下命令进行比较:
$ git fetch origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* [--prune]
Run Code Online (Sandbox Code Playgroud)
这基本上是我们打字时发生的事情git fetch origin [--prune]
!
归档时间: |
|
查看次数: |
18628 次 |
最近记录: |