"HEAD"分离的 HEAD 状态中的等效项



假设我处于分离的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/foo1)。

因为您在当前的工作树中处于分离的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,则没有可复制的类型。这只是你正在做的一些随机承诺。这就是。。。是的,你发布了一张照片的错误消息。。。是在说:你没有说你想创造什么样的裁判。

相关内容

  • 没有找到相关文章

最新更新