将远程存储库和远程分支作为签出的参数是什么意思?

时间:2019-01-20 17:39:58

标签: git

我从unable to create file ... Permission denied看到了一个git命令

git checkout origin develop

我只知道签出本地分支机构。将远程存储库和远程分支作为签出的参数是什么意思?我在https://git-scm.com/docs/git-checkout

中找不到

3 个答案:

答案 0 :(得分:3)

命令insertNAcol <- function(DF, every = 2, na.cols = 4){ n <- ncol(DF) tmp <- DF[1] tmp[2:(1 + na.cols)] <- NA tmp <- tmp[-1] m <- n %/% na.cols res <- DF[1:every] for(i in seq_len(m)[-1]){ DF2 <- DF[(every*(i - 1) + 1):(every*i)] res <- cbind.data.frame(res, tmp, DF2) } res <- cbind(res, tmp, DF[(n - every + 1):n]) res } insertNAcol(dataset) insertNAcol(dataset, 3, 3) 的意思是“从分支(分支,而非远程)中检出名为git checkout origin develop的文件(文件,而不是分支!”) !)名为develop”。如果您有分支origin,并且该分支指向包含文件origin的提交,则命令成功。

但是您可能都没有,所以该命令实际上没有任何意义。 StackOverflow充满了错误的问题和错误的答案;不要相信您看到的一切。

此处的一个有意义的命令可能是develop,这意味着“检出名为git checkout origin/develop的远程跟踪参考所指向的提交”。

此处另一个有意义的命令可能是origin/develop,这意味着“创建一个名为git checkout develop的新本地分支,该分支从名为develop的远程跟踪引用中分支;请设置跟踪,以便远程跟踪引用名为origin/develop的文件将成为名为origin/develop的本地分支的上游分支。

请参阅https://git-scm.com/docs/git-checkoutdevelop文档

答案 1 :(得分:2)

命令git checkout origin develop没有多大意义,因为在Git中仅签出本地分支。使用origin develop是指遥控器上的develop分支。您可能打算这样做:

git checkout develop

假设存在一个远程跟踪分支origin/develop(实际上是一个本地分支),则上面的内容将告诉Git创建一个名为develop的新本地分支,该分支将通过跟踪分支origin/develop

答案 2 :(得分:2)

TL; DR

没有在这里既有存储库又有分支。相反,您有一个 tree-ish 和一个 pathspec tree-ish 是一个提交说明符origin,它是origin/HEAD的缩写,而develop则是...的简称,请参见下文。 pathspec develop,仅表示名为git checkout [-q] [-f] [-m] [<branch>] 的文件。如果没有这样的文件,此命令将仅失败。

长:如何阅读Git文档

syntax for git checkout is

  1. git checkout [-q] [-f] [-m] --detach [<branch>]
  2. git checkout [-q] [-f] [-m] [--detach] <commit>
  3. git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
  4. git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...
  5. git checkout [<tree-ish>] [--] <pathspec>...
  6. git checkout (-p|--patch) [<tree-ish>] [--] [<paths>...]
  7. git checkout origin develop

这些都不允许您指定分支名称​​两次

尝试匹配:

<branch>

以上七个可能的语法行。它与#1不匹配,后者仅允许一个--detach自变量,而没有其他自变量。它与#2不匹配,后者需要文字<commit>。它与#3不匹配,后者仅允许一个<start-point>参数,而没有常规参数。它与#4不匹配,后者仅允许一个可选的-p参数,而与#7不匹配,后者需要一个文字--patchgit checkout [<tree-ish>] -- [<pathspec> ...]

它确实匹配#5和#6。这些可能不应该是两个单独的语法行,而在随后的description section中,它们不是—只是其中的一部分:

-f

的缺点是在简短的摘要中没有提及所有可选标志,但随后在正文中提到了这些标志:

  

通过替换内容覆盖工作树中的路径    在索引或中(通常是一次提交)。当一个    给出,与匹配的路径是    在索引和工作树中都进行了更新。

     

由于先前失败,索引可能包含未合并的条目    合并。默认情况下 ...    [片段-这是--oursorigin等标记被提及的地方]

现在,此文本充满了Git术语,尤其是 tree-ish pathspec 。 (附带说明: tree-ish 是在Gitglossary中定义的,但是我将在此处使用更明确的定义。)

术语 tree-ish 的意思是:我,Git,如果您命名特定的提交,在这里很好。我要做的只是查找其内部树对象,因此,如果出于某些奇怪的原因,您真的可以直接给我。但是实际上,只要给我一些东西,我就可以将其转换为提交或树,然后我将使用该树,或者使用提交来查找树。

您在此处提供了master,现在是时候看看另一篇Git文档了。 (什么,另一个一个?已经?The gitrevisions documentation描述了一个六步的过程来转换一个名字,例如develop或{{1} }或v2.1转换为Git对象哈希ID。

第一步是检查.git中是否有一个具有该名称的文件,该步骤使您可以在CHERRY_PICK_HEAD处于冲突{ {1}}。在这种情况下,它不适用。

第二步是尝试将名称命名为git cherry-pick。第二步使您可以在使用refs/name时使用stashstash@{number}。在这种情况下,它也不适用。

第三步是尝试使用git stash作为名称。第三步使您可以使用refs/tags/name之类的名称来引用 tag v2.1。由于v2.1可能不是一个有效的标记名-您没有标记任何提交origin,对吗?-此步骤将失败,因此Git将继续执行步骤#4。

第四步是尝试使用origin作为名称。此步骤允许您使用分支名称来指定提交。例如,这就是让您refs/heads/name的原因。由于git checkout master -- somefile 是有效的分支名称,因此master将找到git checkout命名的特定提交(即master分支的尖端)并使用该提交的树-请记住,我们正在执行master语法,并在此处处理git checkout <tree-ish> [--] <pathspec>...部分。

但是您没有名为<tree-ish>分支,对吗?如果您创建了一个,那么您可能会!我建议不要创建一个,但是,如果这样做了,那么这六个步骤的过程就会停止。不过,假设您没有,则过程继续进行到第五步。

第五步将名称尝试为origin。您 将有一个名为refs/remotes/name目录,但这不是有效的引用,因此第五步将失败,该过程将移至最后一步。如果最后一步失败了,那么整个事情都会失败,但是...

第六步,最后一步,尝试将名称命名为refs/remotes/origin/。由于refs/remotes/name/HEAD是有效的遥控器,因此该存在(嗯,除非您专门删除了它,否则在其他情况下将不会发生),并且将会 >成为有效的提交说明符。这样,第六步成功了:它发现origin存在,并且(可能)还命名了refs/remotes/origin/HEAD,并且 命名了一个提交。

因此,这时满足了整个过程的refs/remotes/origin/master部分:Git已将<tree-ish>转换为origin或简称为refs/remotes/origin/HEAD; (可能)与origin/HEAD相同,或简称为refs/remotes/origin/master;这是有效的提交,可用于origin/master语法规则#3或git checkout语法规则#5&#6。

由于我们正在处理#5 /#6规则,因此我们可以继续将 last 参数git checkout视为develop。现在,我们必须看看另一份Git文档,即the Gitglossary。我们可以直接跳到the definition of a pathspec,不幸的是,这很长,我在这里不做所有介绍。

总而言之,可以指定一个路径规范 ,在这种情况下,,只是一个文件名。因此<pathspec>成为一个文件名,我们已经完成了对语法规则#5 /#6的所有要求。 Git将执行上面黄色引号中所述的操作,替换索引和工作树中的文件develop,或者如果文件develop中不存在该名称的文件develop,则直接出错。我们选择的名称为<tree-ish>的commit / origin