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

Lus*_*ney 2 git bash command-line github

有一个快速的问题。

假设我有一个名为的分支parent-branch,我通过执行以下操作在该分支上创建了一个分支

git checkout -b child-branch parent-branch
Run Code Online (Sandbox Code Playgroud)

当然,这一切都很好,但我正在寻找(希望)做的是能够以某种方式parent-branch从 bash 脚本中引用。例如,类似于git_current_branchgit_main_branch将打印我所在的当前本地分支,并master分别打印该分支。

有没有办法让我可以做一些类似git_parent_branch或类似的事情)来访问parent-branchin bash 和命令行。无论是 bash 脚本函数,还是其他任何可能可行的方法。

在可能的情况下,是否有涉及 GitHub 和/或任何相关 API 的内容。除了仅使用他们的 Web 界面之外,我对连接到 GitHub 并不太熟悉,因此在这方面的任何事情都可能有很大帮助(理想情况下与我的问题有关)!

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

tor*_*rek 5

Git中在最基本的层面,分行根本不具备的父母。好吧,我说的很简单,但它没有那么简单,因为我们还没有定义分支,Git 的用户使用这个词非常松散,并且当他们说它时通常意味着不同的——有时是矛盾的——事情。所以让我们先定义分支名称,它至少有一个简单、明确的含义:

  • 一个分支名是其完整拼写开始使用一个名称refs/heads/,其-为了生存,包含一些现有的哈希ID,有效的承诺。

这里的最后一点——有点多余:现有的提交是有效的,并且有效的提交(无论这意味着什么)必须存在——是对我们可以有存在的分支名称的事实的让步(还没有,或者不再):xyzzy例如,作为分支名称很好,但在您创建它之前,它只是一种潜在的分支名称,就像漂浮在边缘一样。

由于分支名称必须包含提交 ID 才能存在,因此新的空存储库(没有提交)也没有分支名称。然而你初始分支上。它处于不确定状态,目前还不存在。当你让你在这个空库第一次提交,然后将分支名称实际上存在。如果您愿意,可以使用或在非空存储库中重新创建此特殊情况。(它们在操作 Git 索引的方式上略有不同,但两者都让您处于处于尚不存在的分支上的这种时髦状态。)git checkout --orphangit switch --orphan

除了这种特殊情况,因为分支名称必须包含一些提交哈希 ID,我们通常通过选择一些现有的哈希 ID来创建一个分支,就像在您的示例中一样:

git checkout -b child-branch parent-branch
Run Code Online (Sandbox Code Playgroud)

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

不过,现在我们来回答你自己的问题:

有没有办法让我可以做一些像 git_parent_branch (或类似的东西)这样的事情来访问 bash 和命令行中的父分支。

Git 包含,作为一个有用的工具——Git 的一部分以各种方式利用它——一个完全通用的基于字符串的配置系统,我们可以在其中运行git config以将一些任意字符串设置为某个任意值。按照惯例,这些字符串具有层次结构:user.nameuser.email生活中的user空间; push.defaultpush+组成default;等等。Git 甚至使用INI 文件样式的语法来存储它们。

这意味着虽然Git 本身没有父/子关系,但你可以自己编写. 这样做有几个明显的缺点:

  • Git 不会为你维护它。
  • 您需要选择 Git 不会破坏的名称,即使在将来的某个版本中(可能是 Git 版本 3.14)。
  • 没有人会明白你在做什么。

所以,如果你选择这样做,你就靠自己了——但请注意,Git确实在命名空间存储了一些每个分支的信息:branch.name

  • branch.xyzzy.remote是名为 的分支的远程设置xyzzy
  • branch.xyzzy.rebasegit pull设置控制第二命令的使用是否是git mergegit rebase,并根据其第二个命令要使用什么旗,如果有的话,传递给第二个命令,当你在分公司xyzzy和运行git pull;
  • branch.xyzzy.descriptiongit format-patch当为 branch 运行时,将包含在求职信中的描述性文本xyzzy

等等。所以如果你要添加一个字符串值,你可以在这里存储你的字符串。然后,您只需要希望 Git 开发人员将来不要从您那里窃取该名称。branch.name.parentparent

由于这些东西完全自由形式的,您只需运行git symbolic-ref或类似的方法来查找当前分支名称,然后git config --get branch.$branch.parent获取其父设置(如果有)。如果它没有,这必须是一个普通的日常无父 Git 分支,而不是你自己的一个特殊装饰的分支,它确实有一个名义上的父分支。要为某个分支设置父级,您可以运行git config branch.$branch.parent $parent$parent您想要的设置在哪里。(这是你的决定是否$parent需要为分支机构的名称,在这种情况下像琴弦xyzzymainplugh的罚款,或是否可能是一个远程追踪名同样,在这种情况下,您最好使用完全限定的字符串,例如refs/heads/xyzzyrefs/heads/main等等。这将允许您使用refs/remotes/origin/main- 远程跟踪名称 - 作为“父级”。)

在可能的情况下,是否有涉及 GitHub 和/或任何相关 API 的内容。

绝对不是,这指出了使用想法的另一个弱点branch.$name.parent:无法在 GitHub 上记录这些数据。这是一个纯粹的本地设置。话又说回来,分支名称是纯粹的地方:有指出,需要你叫你的开发分支dev或者develop,即使在一些GitHub上的开发分支域名库你克隆被称为devdevelop

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

  • 分支末端是致力于其中分支名称分。也就是说,给定一些类似的分支名称main,指示一些特定的提交哈希 ID,例如a123456...,分支的提示提交maina123456...名称签出分支使用git checkout或)git switch,然后添加提交会自动将新提交的哈希 ID 存储在分支名称中,以便提示提交自动推进。新提交的父级将是旧的分支提示。

  • 分支(在它的许多含义之一)是一组提交包括所述尖端提交一个分支的(与分支这里指的是包含一个提交散列ID名称)。这组提交哪里开始在用户的脑海中,但如果未指定,Git 通常包括从提示 commit 可到达的每个提交

  • 要定义reachable,请参阅Think Like (a) Git

  • 一个远程跟踪名字是存在于你的Git仓库,但被创造的名字由于分支名称,在一些你自己的Git锯Git仓库。这些名称位于refs/remotes/命名空间中,该命名空间由远程进一步限定,例如origin. 例如,refs/remotes/origin/main将是您存储库中的远程跟踪名称,其中您的 Git 会记住存储在origin's branch name 中的哈希 ID,这是您的 Gitmain上次从其 Git 获得更新的时间。

  • 对于某些用户,远程分支是一个分支(在一系列提交终止于提示提交的含义),其中提示提交由远程跟踪名称给出。对于其他用户(或同一用户在其他时间发言),远程分支是存在于某个远程存储库中的分支,例如origin. 这两者很容易混为一谈,因为您自己的origin/main 跟踪另一个 Git 的main,因此术语remote-tracking name。(Git 称其为远程跟踪分支名称,但名词名称前面的形容词远程跟踪在这里似乎就足够了。)

正如您所看到的,分支这个词的定义非常松散,几乎没有价值。我们通常可以根据上下文重建正确的定义——演讲者或作者想到的定义——但为了清楚起见,使用其他术语通常更好。