`git branch --contains`不显示源自提交的分支

问题描述 投票:0回答:1

我想测试git branch --contains,所以我从一个之前从未签出的分支中找到了一个提交,older-branch

[在另一个不同的,最新的分支(我们称其为较新的分支)上,我执行了git fetch以确保我与上游保持最新。然后我做了,git branch older-branch --contains COMMITHASH

但是这没有返回较早的分支。

此外,当我执行git branch --contains COMMITHASH时,它显示较新的分支,但在列表中未显示较旧的分支。

[混淆,我先按git checkout older-branch,然后按git branch contains older-branch --contains COMMITHASH,它返回了较早的分支!然后我做了git branch --contains COMMITHASH,它显示了较早的分支以及我最初在其上测试这些git命令的较新分支!

然后我切换回较新的分支。这次,当我执行git branch older-branch --contains COMMITHASH时,它显示了较早的分支!为什么会这样?

git commit git-branch
1个回答
0
投票

您的问题仍然充满奇怪的结构,例如:

git branch contains older-branch --contains COMMITHASH

但是我思考我了解您在做什么和问。 (请注意,更集中的问题可能会得到更集中的答案。)我认为您想要的答案是git branch -r --contains。但是如果不是的话......>

您在这里犯的基本错误是,认为分支名称实际上对Git意味着任何意义。 :-)更具体地说,您假设当某些other

Git存储库更新their分支名称时,您的分支名称会自动更新。

不是这种情况。

[运行git fetch时,您的Git会在某个地方调用其他Git存储库。通常,您将有一个完全相同的其他Git存储库,您将其称为origin。但是,您可以列出多个其他Git存储库。您只需为每个名称组成一个唯一的名称。

现在,假设位于origin处的Git存储库位于某个URL url

上,它具有三个分支名称:masterdevelopfeature。运行时:
$ git clone <url>

您将获得自己的Git存储库。 您的

Git存储库现在知道另一个Git存储库-位于[[url
的那个存储库,并且已将该URL保存为名称origin$ git remote origin $ git remote show origin * remote origin Fetch URL: ... ... lots more stuff ...
<< [second git remote命令实际上实际上调用了另一个Git来获取信息。到目前为止,在Git中的

Most

命令不要调用任何其他Git:它们仅在您的 Git存储库中查找。此时,您的 Git存储库只有

一个

分支名称,几乎可以肯定是master1如果运行git branch列出您的分支名称,您会看到那个分支。
这是否意味着分支developfeature在您的存储库中不存在?答案是否定的。问题在于确定branch的意思。另请参见What exactly do we mean by "branch"?

您可能在这里关心的commits确实存在。实际上,您可能想使用的某些

names

也存在! 不存在存在的名称是分支名称 developfeature
如果您运行:git branch --contains <hash-id>

您将

绝对不会看到名称develop,因为

没有名称develop
我做了git fetch以确保我与上游保持最新。
至少是-或

a

正确的做法。

......感到困惑,我做了git checkout older-branch,然后[git branch --contains为我工作]

这是因为git checkout有时会

创建

一个新的

分支名称

这里的键再次是单词

branch

的含糊含义。如果您指的是[[branch name
,则必须具有name。但是,如果您还有其他意思,那么....>除了分支名称之外,您自己的Git存储库具有我现在所说的远程跟踪名称。 Git称它们为

远程跟踪分支名称

,但它们根本不是branch名称。
[当您运行git fetch origin或使用git fetchorigin时,您的Git在origin调用Git。他们进行了交谈,您的Git将会获取他们拥有的,您没有的,您的Git想要进行的任何提交。然后,您的Git将更新您的远程跟踪名称在这种情况下,您的远程跟踪名称将是origin/masterorigin/developorigin/feature。您的Git为您的Git在其Git中看到的每个

分支名称

创建一个。
这些远程跟踪名称,为您/您的Git记住,

their

Git具有branch名称,以及这些分支名称保留的提交哈希ID。 git fetch将更新它们。 (如果他们已经删除了一些分支名称,则可以使用git fetch --prune让您的Git删除相应的远程跟踪名称。如果没有修剪选项,您的Git将挂在其他远程跟踪名称上。这种修剪模式可能< [应该为默认值,但出于历史原因不是。)

您的分支名称就是这样:您的。仅仅因为Fred已添加,删除和更改了某些his

分支名称,但这并不意味着您的Git会更改

yours。如果将Git连接到名为fred的遥控器,则Git将自动更新fred/*名称,因为您的Fred跟踪名称(而您的名称)是为了记住Fred的名称。您的origin跟踪名称也是如此。但是,当您执行git checkout older-branch时,您的git checkout命令会通过您的分支名称进行查找。名称older-branch不存在。不仅仅是立即放弃说:您没有那个分支,您的Git继续查看了您所有的remote-tracking

名称。

如果您有一个看起来像您想要的分支名称的远程跟踪名称,那么您的Git现在创建自己的分支名称,对应于该远程跟踪名称。因此,如果您有origin/older-branch,那么现在您doolder-brancholder-branch标识的提交将是[[Came]现在标识的same

提交哈希ID

现在您确实有一个分支名称,这取决于您自己维护。删除它并直接使用origin/older-branch可能更明智。默认情况下,origin/older-branch命令不会列出远程跟踪名称,但是使用git branch选项时,它正是will列表中的名称。因此,-r将列出那些远程跟踪名称,其中远程跟踪名称的提交是您在命令行上指定的提交哈希的后代。

1

other Git会告诉您默认情况下获得的分支名称,如果您没有在git branch -r --contains命令中指定有关git clone应该创建哪个分支的信息。但是除非有人另外设置,否则其他Git会说
我推荐git clone

,所以无论如何这就是您通常会得到的。
© www.soinside.com 2019 - 2024. All rights reserved.