假设我处于分离的HEAD状态,并运行以下命令:
git push origin HEAD:foo
git将输出以下错误:
error: The destination you provided is not a full refname (i.e.,
starting with "refs/"). We tried to guess what you meant by:
- Looking for a ref that matches 'foo' on the remote side.
- Checking if the <src> being pushed ('HEAD')
is a ref in "refs/{heads,tags}/". If so we add a corresponding
refs/{heads,tags}/ prefix on the remote side.
Neither worked, so we gave up. You must fully qualify the ref.
hint: The <src> part of the refspec is a commit object.
hint: Did you mean to create a new branch by pushing to
hint: 'HEAD:refs/heads/foo'?
error: failed to push some refs to 'https://server/DefaultCollection/Project/_git/Repo'
所以我的问题是:在这里使用什么关键词而不是";"头";引用我正在执行的当前提交?我可以复制粘贴提交id,但这显然很愚蠢。我要求一个我可以键入的常量名称,比如head,来表示我正在进行的当前提交
正如jthill所指出的,当HEAD
分离时,Git不知道是否:
git push origin HEAD:foo
是指在origin
上创建refs/heads/foo
(名为foo
的分支),或在origin
上创建refs/tags/foo
(名为foo
的标签),或可能创建某种其他类型的ref(例如Gerrit的魔术refs/for/foo
1)。
因为您在当前的工作树中处于分离的HEAD模式,所以您必须在这里协助Git。您可以:
git push origin @:refs/heads/foo
告诉Git:使用HEAD
,在所有大写字母中,2在我的存储库中查找提交。将该提交和任何必要的父级推送到origin
,然后要求origin
创建一个名为foo
的分支
不过,继续创建一个名为foo
:的本地分支可能更容易
git switch -c foo
之后CCD_ 15就足够了。您甚至可能希望用以下代码创建一个别名(shell别名或Git别名)或shell函数:
push-new-as foo
其中CCD_ 16扩展为例如CCD_。(如果你愿意,可以添加额外的保护措施,比如先确保没有origin/foo
:这可能实际上是个好主意。让别名或shell函数先运行git fetch origin
。)
1Gerrit是用JGit编写的,实现的Git与C Git不太一样。推到refs/for/
名称空间名称会创建一个Gerrit变更集,Gerrit偷偷地将其重命名为另一个名称。你自己的(可能是基于C-Git的)Git认为Gerrit成功地创建了refs/for/foo
,因为他们的JGit实现在这一点上返回了成功的指示,但事实并非如此。这个小小的谎言促进了有用的工作,不会造成实际问题,但它绝对是相当神奇的。
2请参阅HEAD与HEAD与分离的HEAD,了解为什么区分大小写很重要。
HEAD
是您当前的结账。如果你没有明确地说出目的地类型(通过提供refs/<type>/
前缀,例如refs/heads/
表示分支提示),Git会试图弄清楚你从源复制类型的意思。但是,如果您没有签出分支,并且您提供了HEAD
,则没有可复制的类型。这只是你正在做的一些随机承诺。这就是。。。是的,你发布了一张照片的错误消息。。。是在说:你没有说你想创造什么样的裁判。