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分支的Bash引用_Bash_Git_Github_Command Line_Script - Fatal编程技术网

从另一个分支创建分支时对“父”Git分支的Bash引用

从另一个分支创建分支时对“父”Git分支的Bash引用,bash,git,github,command-line,script,Bash,Git,Github,Command Line,Script,我有个简短的问题 假设我有一个分支叫做父分支,我通过 git checkout -b child-branch parent-branch 当然,这一切都很好,但我希望做的是,能够从bash脚本中以某种方式引用父分支。例如,git_current_branch和git_main_branch将分别打印我所在的当前本地分支和主分支 有没有一种方法可以让我像git_parent_branch一样,或者沿着这些行来访问bash中的父分支和命令行。无论是bash脚本函数,还是其他任何可能的功能 是否有

我有个简短的问题

假设我有一个分支叫做父分支,我通过

git checkout -b child-branch parent-branch
当然,这一切都很好,但我希望做的是,能够从bash脚本中以某种方式引用父分支。例如,git_current_branch和git_main_branch将分别打印我所在的当前本地分支和主分支

有没有一种方法可以让我像git_parent_branch一样,或者沿着这些行来访问bash中的父分支和命令行。无论是bash脚本函数,还是其他任何可能的功能

是否有可能涉及GitHub和/或任何相关API的内容。除了使用他们的web界面之外,我对连接GitHub不太熟悉,所以这方面的任何东西都很可能对我的问题有很大帮助


似乎找不到任何实质性的东西。如果有人能给我指出正确的方向,我将不胜感激

在Git的基础级别上,分支根本没有父级。好吧,我说的很简单,但它并没有那么简单,因为我们还没有定义分支,Git的用户使用这个词非常松散,常常意味着不同和矛盾,有时他们说这个词的时候会有不同的意思。因此,让我们首先定义分支名称,它至少有一个简单明确的含义:

分支名称是一个完整拼写以refs/heads/开头的名称,为了存在,它包含一些现有有效提交的哈希ID。 这里的最后一点是多余的:现有的提交是有效的,有效的提交——不管它意味着什么——必须存在——是对这样一个事实的让步,即我们可以有一个还不存在的分支名称,或者更多的分支名称:例如,xyzzy作为分支名称很好,但在创建它之前,它只是一种潜在的分支名称,就像漂浮在边缘一样

因为分支名称必须包含提交ID才能存在,所以没有提交的新空存储库也没有分支名称。而你却在最初的分支上。它处于边缘,还不存在。当您在这个空存储库中进行第一次提交时,分支名称实际上就存在了。如果愿意,可以使用git checkout-orphan或git switch-orphan在非空存储库中重新创建此特殊情况。它们在操作Git索引的方式上有细微的不同,但它们都让您处于一种不存在的分支上的怪异状态

撇开这种特殊情况不谈,因为分支名称必须包含一些提交散列ID,我们通常通过选取一些现有散列ID来创建分支,如您的示例所示:

但Git所做的是首先将名称parent branch解析为提交散列ID,然后在本例中创建一个新分支,名为child branch,其中包含该散列ID。这两个分支名称没有父/子关系;我们可以运行git checkout-b daddy kid或git checkout-b xyzy plugh,这里也没有父/子关系,尽管daddy kid版本中有误导性的名称,xyzy plugh案例中的中性名称

现在我们来谈谈你自己的问题:

有没有一种方法可以让我像git_parent_branch一样,或者沿着这些行来访问bash中的父分支和命令行

Git包含一个有用的工具,Git的一些部分以各种方式利用它——一个完全通用的基于字符串的配置系统,在这个系统中,我们运行Git config将一些任意字符串设置为一些任意值。按照惯例,这些字符串具有层次结构:user.name和user.email在用户空间中活动;push.default由push+default组成;等等Git甚至使用

这意味着,尽管Git本身没有父/子关系,但您可以自己构建。这样做有几个明显的缺点:

Git不会为你维护它。 您需要选择Git不会使用的名称,即使是在将来的Git版本3.14中。 没有人会明白你在干什么。 因此,如果您选择这样做,您可以自己做,但让我们注意到Git确实在branch.name命名空间中存储了一些每个分支的信息:

branch.xyzy.remote是名为xyzy的分支的远程设置; branch.xyzy.rebase是git pull设置,控制要使用的第二个命令是git merge还是git rebase,并且根据要使用的第二个命令,在使用branch xyzy并运行git pull时,要传递给第二个命令的标志(如果有); branch.xyzy.description是git格式补丁在为branch xyzy运行时将包含在求职信中的描述性文本; 等等。所以如果你要加麸皮 父字符串值,您可以将字符串存储在此处。然后,您只需要希望Git开发人员在将来不会从您那里窃取父级名称

由于这完全是自由形式的,您只需运行git symbolic ref或类似程序来查找当前的分支名称,然后git config-get branch.$branch.parent来获取其父设置(如果有)。如果没有,那么它必须是一个普通的日常无父Git分支,而不是您自己的一个特殊装饰的分支,它确实有一个名义上的父级。要设置某个分支的父级,您需要运行git config branch.$branch.parent$parent,其中$parent是您想要的设置。由您决定是否要求$parent作为分支名称,在这种情况下,像XYZY、main和plugh这样的字符串可以,或者它是否也可以作为远程跟踪名称,在这种情况下,您最好使用完全限定的字符串,如refs/heads/XYZY、refs/heads/main等等。这将允许您使用refs/remotes/origin/main(远程跟踪名称)作为父项

是否有可能涉及GitHub和/或任何相关API的内容

当然不是,这也指出了使用分支的另一个弱点。$name.parent:无法在GitHub上记录这些数据。这是一个纯粹的本地设置。此外,分支名称完全是本地的:需要注意的是,您需要将开发分支称为dev或develope,即使您克隆的某个GitHub存储库中的开发分支名称称为dev或develope

在结束之前,让我再添加几个分支的定义。我们还需要更多的定义:

分支提示是分支名称所指向的提交。也就是说,给定一些分支名称,如main,它指示某些特定的提交哈希ID,如a123456…,则分支main的提示提交是a123456。。。。使用git checkout或git switch按名称签出分支,然后添加提交自动将新提交的哈希ID存储在分支名称中,以便提示提交自动进行。新提交的父级将是旧的分支提示

分支的多种含义之一是一组提交,其中包括分支的提示提交,此处的分支表示包含提交哈希ID的名称。用户认为这组提交开始的位置,但如果未指定,Git通常包括从提示提交可到达的每个提交

要定义可到达,请参见

远程跟踪名称是存在于Git存储库中但由于Git在其他Git存储库中看到的分支名称而创建的名称。这些名称位于refs/remotes/名称空间中,该名称空间由远程对象(如origin)进一步限定。例如,refs/remotes/origin/main将是存储库中的一个远程跟踪名称,在这个名称中,Git会记住存储在origin的分支名称main中的hash ID,这是Git最后一次从其Git获得更新

对于某些用户,远程分支是指在tip提交时终止的一系列提交的分支,其中tip提交由远程跟踪名称给出。对于其他用户或在其他时间说话的同一用户,远程分支是存在于某个远程存储库(如origin)中的分支。这两者很容易混淆,因为您自己的origin/main跟踪另一个Git的main,因此术语remotetracking name。Git将其称为远程跟踪分支名称,但名词名称前面的形容词remotetracking似乎就足够了


正如您所看到的,branch这个词的定义非常松散,几乎毫无价值。我们通常可以根据上下文重建说话者或作者心目中的正确定义,但为了清楚起见,最好使用其他术语。

在Git的基本层面上,分支根本没有父级。好吧,我说的很简单,但它并没有那么简单,因为我们还没有定义分支,Git的用户使用这个词非常松散,常常意味着不同和矛盾,有时他们说这个词的时候会有不同的意思。因此,让我们首先定义分支名称,它至少有一个简单明确的含义:

分支名称是一个完整拼写以refs/heads/开头的名称,为了存在,它包含一些现有有效提交的哈希ID。 这里的最后一点是多余的:现有的提交是有效的,有效的提交——不管它意味着什么——必须存在——是对这样一个事实的让步,即我们可以有一个还不存在的分支名称,或者更多的分支名称:例如,xyzzy作为分支名称很好,但在创建它之前,它只是一种潜在的分支名称,就像漂浮在边缘一样

因为分支名称必须包含提交ID才能存在,所以没有提交的新空存储库也没有分支名称。而你却在最初的分支上。它处于边缘,还不存在。当你做冷杉的时候 如果不在这个空存储库中提交,则分支名称实际上存在。如果愿意,可以使用git checkout-orphan或git switch-orphan在非空存储库中重新创建此特殊情况。它们在操作Git索引的方式上有细微的不同,但它们都让您处于一种不存在的分支上的怪异状态

撇开这种特殊情况不谈,因为分支名称必须包含一些提交散列ID,我们通常通过选取一些现有散列ID来创建分支,如您的示例所示:

但Git所做的是首先将名称parent branch解析为提交散列ID,然后在本例中创建一个新分支,名为child branch,其中包含该散列ID。这两个分支名称没有父/子关系;我们可以运行git checkout-b daddy kid或git checkout-b xyzy plugh,这里也没有父/子关系,尽管daddy kid版本中有误导性的名称,xyzy plugh案例中的中性名称

现在我们来谈谈你自己的问题:

有没有一种方法可以让我像git_parent_branch一样,或者沿着这些行来访问bash中的父分支和命令行

Git包含一个有用的工具,Git的一些部分以各种方式利用它——一个完全通用的基于字符串的配置系统,在这个系统中,我们运行Git config将一些任意字符串设置为一些任意值。按照惯例,这些字符串具有层次结构:user.name和user.email在用户空间中活动;push.default由push+default组成;等等Git甚至使用

这意味着,尽管Git本身没有父/子关系,但您可以自己构建。这样做有几个明显的缺点:

Git不会为你维护它。 您需要选择Git不会使用的名称,即使是在将来的Git版本3.14中。 没有人会明白你在干什么。 因此,如果您选择这样做,您可以自己做,但让我们注意到Git确实在branch.name命名空间中存储了一些每个分支的信息:

branch.xyzy.remote是名为xyzy的分支的远程设置; branch.xyzy.rebase是git pull设置,控制要使用的第二个命令是git merge还是git rebase,并且根据要使用的第二个命令,在使用branch xyzy并运行git pull时,要传递给第二个命令的标志(如果有); branch.xyzy.description是git格式补丁在为branch xyzy运行时将包含在求职信中的描述性文本; 等等。因此,如果要添加branch.name.parent字符串值,可以将字符串存储在此处。然后,您只需要希望Git开发人员在将来不会从您那里窃取父级名称

由于这完全是自由形式的,您只需运行git symbolic ref或类似程序来查找当前的分支名称,然后git config-get branch.$branch.parent来获取其父设置(如果有)。如果没有,那么它必须是一个普通的日常无父Git分支,而不是您自己的一个特殊装饰的分支,它确实有一个名义上的父级。要设置某个分支的父级,您需要运行git config branch.$branch.parent$parent,其中$parent是您想要的设置。由您决定是否要求$parent作为分支名称,在这种情况下,像XYZY、main和plugh这样的字符串可以,或者它是否也可以作为远程跟踪名称,在这种情况下,您最好使用完全限定的字符串,如refs/heads/XYZY、refs/heads/main等等。这将允许您使用refs/remotes/origin/main(远程跟踪名称)作为父项

是否有可能涉及GitHub和/或任何相关API的内容

当然不是,这也指出了使用分支的另一个弱点。$name.parent:无法在GitHub上记录这些数据。这是一个纯粹的本地设置。此外,分支名称完全是本地的:需要注意的是,您需要将开发分支称为dev或develope,即使您克隆的某个GitHub存储库中的开发分支名称称为dev或develope

在结束之前,让我再添加几个分支的定义。我们还需要更多的定义:

分支提示是分支名称所指向的提交。也就是说,给定一些分支名称,如main,它指示某些特定的提交哈希ID,如a123456…,则分支main的提示提交是a123456。。。。使用git checkout或git switch按名称签出分支,然后添加提交自动将新提交的哈希ID存储在分支名称中,以便提示提交自动进行。新提交的父级将是旧的分支提示

分支的多种含义之一是一组提交,其中包括分支的提示提交,此处的branch表示包含co的名称 mmit哈希ID。这组提交开始的位置在用户的脑海中,但如果未指定,Git通常包括从tip commit可访问的每个提交

要定义可到达,请参见

远程跟踪名称是存在于Git存储库中但由于Git在其他Git存储库中看到的分支名称而创建的名称。这些名称位于refs/remotes/名称空间中,该名称空间由远程对象(如origin)进一步限定。例如,refs/remotes/origin/main将是存储库中的一个远程跟踪名称,在这个名称中,Git会记住存储在origin的分支名称main中的hash ID,这是Git最后一次从其Git获得更新

对于某些用户,远程分支是指在tip提交时终止的一系列提交的分支,其中tip提交由远程跟踪名称给出。对于其他用户或在其他时间说话的同一用户,远程分支是存在于某个远程存储库(如origin)中的分支。这两者很容易混淆,因为您自己的origin/main跟踪另一个Git的main,因此术语remotetracking name。Git将其称为远程跟踪分支名称,但名词名称前面的形容词remotetracking似乎就足够了


正如您所看到的,branch这个词的定义非常松散,几乎毫无价值。我们通常可以根据上下文重建说话者或作家心目中的正确定义,但为了清楚起见,最好使用其他术语。

哇,天哪!这是一个惊人的信息量,非常有用。非常感谢您花时间如此透彻地解释这一切。非常非常感谢!!其中一些是我第一次写下一些关于改进git rebase以处理多分支重定的背景想法,为此我们迫切需要某种相关分支配置。但这种关系是什么以及如何编码还不完全清楚。哇,天哪!这是一个惊人的信息量,非常有用。非常感谢您花时间如此透彻地解释这一切。非常非常感谢!!其中一些是我第一次写下一些关于改进git rebase以处理多分支重定的背景想法,为此我们迫切需要某种相关分支配置。但这种关系是什么以及如何编码还不完全清楚。
git checkout -b child-branch parent-branch