[英]git checkout <branch> or <commit>
有没有办法获取和检查提供的参数,而不关心它是一个分支名称或提交哈希?
git fetch
git checkout origin/<branch> or origin/<commit>
怎么样? git checkout origin/<commit>
表示没有这样的分支。 一个简单的git checkout <argument>
是不可能的,因为它不会像git checkout origin/<argument>
那样签出远程分支。
您可以先将所有远程分支(自动包括具有所需提交的分支)提取到本地:
git fetch -a
然后只需通过哈希检查提交:
git checkout <commit-hash>
首先需要fetch
,否则您的本地可能会或可能不会知道远程上的commit-hash。 如果没有fetch
,如果你直接执行checkout
它会抱怨commit-hash无效。
你的问题的前提是错误的:
一个简单的
git checkout <argument>
是不可能的,因为它不会像git checkout origin/<argument>
那样签出远程分支。
关于Git,在这里实现几个相互关联的事情非常重要:
HEAD
一词来查找。 refs/heads/ name
形式的refs/heads/ name
。 所有大写字母中的相同单词HEAD
都会找到分支名称。 如果没有当前分支名称,Git将其称为分离的HEAD 。 origin/master
)不是分支名称 。 它的完整形式以refs/remotes/
而不是refs/heads/
开头。 git checkout
签出提交,但是通过分支名称之外的其他东西识别它,Git会 - 如果签出成功,那就是 - 产生第2点中描述的分离的HEAD状态。(你也可以生成这个使用分支名称的状态,使用git checkout --detach
。) 上面第4点的结果是git checkout origin/ name
导致分离的HEAD,与git checkout hash-ID
方式相同。
这意味着你的脚本只能使用git checkout <argument>
,因为它会做同样的事情 - 产生一个分离的HEAD - 如果参数是一个哈希ID,或者它是一个远程跟踪名称,如origin/develop
。
但请注意,如果我们将此语句更改为:
一个简单的
git checkout <argument>
是不合适的,因为它不会首先创建,然后签出一个基于现有远程跟踪名称的本地分支,git checkout <argument minus the leading origin/ part>
方式。
我们得到一个真实的陈述: git checkout develop
将使用名称origin/develop
创建一个名为develop
的新(本地)分支(当然,提供的本地develop
尚不存在)。 但是,在这里只允许<argument>
并让用户提供develop
作为名称没有明显的问题:
#! /bin/sh
git fetch && git checkout "$@"
例如。
这里的第1点和第2点有一个有趣的结果,那就是询问HEAD
目前的价值,实际上是在问两个不同的问题之一:
HEAD
是否附属于分支? 如果是这样,哪个分支? git symbolic-ref HEAD
命令只回答第一个问题; git rev-parse HEAD
主要回答第二个问题,但也可以告诉你回答第一个问题。
在上面的第1点中, 几乎是出于特殊原因。 想象一下,您刚刚创建了一个新的,完全空的存储库。 此存储库中没有提交 ,因此哪个提交是当前提交?
这种情况对Git来说是个问题。 你在一个不存在的分支上,即master
。 Git称这是一个孤立的分支或一个尚未创建的分支 (取决于Git的哪个部分正在进行调用)。 Git处理这个问题的方法是将分支的名称存储到.git/HEAD
,而不是在参考数据库中实际创建分支 。 当你进行新的提交时, 它会创建分支本身,现在问题就解决了:你在分支上,它识别刚刚进行的一个新提交,即当前提交,因此HEAD
命名当前提交和目前的分支。
(Git可以根据需要重新创建这种稍微有点痛苦的情况,使用git checkout --orphan
,它将新分支的名称写入HEAD
而不实际创建新分支。)
这个巧妙的技巧似乎正是我想要的:
git show-ref --head --sha | grep -q ^argument
如果参数是提交哈希,则其退出代码为0,否则为1。 取自这里https://stackoverflow.com/a/29707340/3116571
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.