繁体   English   中英

git checkout <branch> 要么 <commit>

[英]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,在这里实现几个相互关联的事情非常重要:

  1. 总是很好, 几乎总是 - 当前提交,您可以使用HEAD一词来查找。
  2. 并不总是有一个当前分支,但如果有,它是一个分支名称 ,即一个全名具有refs/heads/ name形式的refs/heads/ name 所有大写字母中的相同单词HEAD都会找到分支名称。 如果没有当前分支名称,Git将其称为分离的HEAD
  3. 远程跟踪名称 (例如origin/master )不是分支名称 它的完整形式以refs/remotes/而不是refs/heads/开头。
  4. 如果告诉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是否附属于分支? 如果是这样,哪个分支?
  • 当前提交的哈希ID是什么?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM