Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自标记的Git分支-内部_Git - Fatal编程技术网

来自标记的Git分支-内部

来自标记的Git分支-内部,git,Git,在git中,假设我有一个分支主节点和一个标记0.0.1,如果我执行以下操作: git checkout 0.0.1 git branch -b random-fix # some changes... git checkout master git merge random-fix 标记的分支在内部创建对分支主控中标记所标记的提交的引用,或者分支来自“标记本身”,就好像标记是某种分支一样 我问这个是因为当我向一个标签结账时,我会处于一个“分离的头”或类似的状态,对吗?知道这一点让我想到了来自标

在git中,假设我有一个分支主节点和一个标记0.0.1,如果我执行以下操作:

git checkout 0.0.1
git branch -b random-fix
# some changes...
git checkout master
git merge random-fix
标记的分支在内部创建对分支主控中标记所标记的提交的引用,或者分支来自“标记本身”,就好像标记是某种分支一样

我问这个是因为当我向一个标签结账时,我会处于一个“分离的头”或类似的状态,对吗?知道这一点让我想到了来自标记的分支。

标记引用提交 标记是对提交的引用。具体来说,轻量级标记只是使用用户定义的名称指向给定提交的引用。例如:

$ git log
commit e0e92bc337b246696aec5c214507321c7526c1e9
Author: John Doe <john.doe@example.com>
Date:   Thu Sep 26 14:38:36 2013 -0400

    Empty initial commit.

$ git tag v0.0.1

$ cat .git/refs/tags/v0.0.1 
e0e92bc337b246696aec5c214507321c7526c1e9
$git日志
提交E0E92BC337B24696AEC5C214507321C7526C1E9
作者:John Doe
日期:2013年9月26日星期四14:38:36-0400
空初始提交。
$git标签v0.0.1
$cat.git/refs/tags/v0.0.1
E0E92BC337B24696AEC5C214507321C7526C1E9
两种情况下的实际SHA-1相同。换句话说,标记只是一个指向提交的指针

将标记用作提交标识符 可以使用与从提交标识符进行分支完全相同的方式从标记进行分支。例如,以下两个命令实际上是相同的:

  • git签出-b新分支v0.0.1
  • git checkout-b新_分行E0E92BC337B24696AEC5C214507321C7526C1E9
对于Git来说,新分支的起始点是作为标记、SHA-1还是其他形式的

(这也许应该是一条注释,但它太大了,需要很好的格式:-)。。。另外,如果你关注一些链接,我似乎有一种奇怪的心情……)

理解这一点的关键是——我认为你已经做到了,但让我们在SO文章中阐明这一点,以便让下一位读者明白:

所有git引用最后都命名(指向)一个提交。

对于标记(无论是轻量级的还是带注释的)、分支、“远程分支”、git“notes”引用、“stash”等等,都是如此。他们都说出了一个承诺,就是这样。(好的,好的,不完全是这样:从技术上讲,标签可以命名repo中的任何对象。事实上,这就是带注释的标签的工作原理:有一个轻量级的标签命名一个存储库对象,即带注释的标签,然后带注释的标签命名一个提交对象。这也是
HEAD
的工作原理:它通常命名另一个ref,然后命名提交。因此,有时你必须剥掉洋葱的几层才能完成提交。命名一个blob或tree对象是可能的,但通常情况下,实际上没有什么能做到这一点。)

(提交的“真实名称”当然是SHA-1值。)

分支引用名称“特殊”的原因同样简单:

分支引用是在添加新提交时自动移动到新分支提示的名称。

具体来说,
refs/heads/branchname
形式的ref指向某些提交(根据定义,因为名称指向提交)。当您“在”该分支1上并执行一些git操作以添加新提交时,如
git commit
git merge
git cherry pick
,git将新提交粘贴到repo中,然后将名称重新指向新提交。这就是它要做的一切

我们所认为的“分支”是通过从名称所指向的提交的顶端开始并使用每个提交的父级或父级向后工作而形成的。如果提交有一个父级,则它是“在分支上”的普通提交。如果它有两个或两个以上,它就是一个“合并”,您可以跟随它的所有父级查找合并的内容。如果它根本没有父级,那么它就是根提交(就像新repo中的初始提交一样,实际上可以有多个根;例如,git“notes”就是这样做的)

如果在一次提交中放置七个分支标签,那么“分支”现在有七个名称。如果你把这个问题归结为一个问题,那当然是一个问题,但git不会在意任何一个问题。(Git只在乎你把它降到零个名字。现在这个分支仍然存在,但是很难找到,而且它有资格使用。)

既然我们谈到了这个话题,那么让我们也来记录一下“分支”。(我对“remote branch”(远程分支)的名称一直不太满意,但我没有更好的名称,所以让我们来定义它。)“remote branch”(远程分支)是形式为
refs/remotes/rname/bname
的本地引用,其中rname是远程分支的名称(例如
origin
),bname是远程分支的名称,即。,如果您登录到遥控器并查看那边的分支,则位于
refs/heads/
之后的部分。如果您
git checkout origin/master
,您就无法“进入”远程分支,git会给您一个-但是这些分支名称会自动更新:当您使用
git fetch
从远程获取新提交时,您也会获得新的分支提示。换言之,您不需要将名称移动到新的分支提示,而是让其他人(在远程)这样做,然后当您从他们那里获取时,您可以一次获取他们的最新版本


1若要“在分支上”,则
HEAD
ref必须是“间接”引用,类似于
ref:refs/heads/master
。当
HEAD
被“分离”时,它包含一个原始SHA-1值。您仍然可以添加提交;它们被添加到未标记的分支。
HEAD
中的引用使它们不会被垃圾收集

2或更多,如果有标签。让我们假设有


3没有脚注三。

不喜欢链接,但这说明标签都只是指向提交的指针。从标记进行分支时,它从标记所指向的提交进行分支。分支也只是指向提交的指针。Git并不真正跟踪分支,例如,试图确定提交源于哪个分支可能很困难,并且取决于时间的流逝,这是不可能的