您的问题仍然充满了奇怪的结构,例如:
git branch contains older-branch --contains COMMITHASH
但我认为我理解你在做什么和问什么。 (请注意,更集中的问题可能会得到更集中的答案。)我认为你想要的答案是git branch -r --contains。但万一不是……
您在这里犯的基本错误是认为分支名称实际上对 Git 意味着任何东西。 :-) 更具体地说,您假设当某些 other Git 存储库更新它们的 分支名称时,您的 分支名称会自动更新。 p>
事实并非如此。
当您运行 git fetch 时,您的 Git 会在某处调用其他 Git 存储库。通常,您将拥有另一个 Git 存储库,您将其称为 origin。但是,您可以列出多个不同的其他 Git 存储库。您只需为每个人编一个唯一的名称。
现在,假设位于某个 URL url 的 origin 上的 Git 存储库具有三个分支名称:master、develop 和 feature。运行时:
$ git clone <url>
您将获得自己的 Git 存储库。 您的 Git 存储库现在知道另一个 Git 存储库 - url 的那个 - 并已将该 URL 保存在名称 origin 下:
$ git remote
origin
$ git remote show origin
* remote origin
Fetch URL: ...
... lots more stuff ...
secondgit remote 命令实际上调用了另一个 Git 以从中获取信息。 到目前为止,Git 中的大多数命令不调用任何其他 Git:它们只查看 您的 Git 存储库内部。
此时,您的 Git 存储库只有一个 分支名称,几乎可以肯定master。1 如果您运行git branch列出你的分支名称,你会看到那个分支。
这是否意味着您的存储库中不存在分支 develop 和 feature?答案是否定的。问题在于确定您所说的 branch 是什么意思。另见What exactly do we mean by "branch"?
您可能在这里关心的提交确实存在。事实上,您可能想要使用的一些名称也存在! 不存在的名称是分支名称develop和feature。
如果你跑:
git branch --contains <hash-id>
你绝对不会看到develop这个名字,因为你没有develop这个名字。
我做了git fetch 以确保我了解上游的最新信息。
这是——或至少是一个——正确的做法。
... 困惑,我做了git checkout older-branch 然后 [git branch --contains 为我工作]
这是因为git checkout 有时会创建一个新的分支名称。
这里的关键再次是branch这个词的含糊意思。如果你的意思是branch name,你必须有名字。但如果你的意思是别的,那么......
除了分支名称,您自己的 Git 存储库还有我现在所说的远程跟踪名称。 Git 称它们为远程跟踪分支名称——但它们根本不是分支名称。
当您运行 git fetch origin 或使用 origin 的 git fetch 时,您的 Git 会在 origin 调用 Git。他们进行对话,您的 Git 将获得他们拥有的任何提交,而您没有,您的 Git 想要接受。然后,您的 Git 将更新您的远程跟踪名称。
在这种情况下,您的远程跟踪名称将是 origin/master、origin/develop 和 origin/feature。您的 Git 会为您的 Git 在其 Git 中看到的每个分支名称创建一个。
这些远程跟踪名称记住,对于您/您的 Git,他们的 Git 有 branch 名称,以及这些分支名称持有的提交哈希 ID。 git fetch 将更新它们。 (如果他们删除了一些分支名称,您可以使用 git fetch --prune 让您的 Git 删除您相应的远程跟踪名称。如果没有修剪选项,您的 Git 将保留额外的远程跟踪名称。这种修剪模式可能 应该是默认值,但由于历史原因,不是。)
你的分支名称就是:你的。仅仅因为 Fred 添加、删除和更改了一些 他的 分支名称,这并不意味着您的 Git 会更改 您的。如果您将 Git 连接到名为 fred 的遥控器,您的 Git 将自动更新您的 fred/* 名称,因为您的 Fred 跟踪名称(而您的名称)是为了记住 Fred 的。您的origin-tracking 名称也是如此。
不过,当您执行git checkout older-branch 时,您的git checkout 命令会查看您的 分支名称。 older-branch 这个名字不在里面。与其直接放弃并说:你没有那个分支,你的 Git 继续查看你所有的 remote-tracking 名称。
如果您有一个与您要求的分支名称非常相似的远程跟踪名称,您的 Git 现在创建一个您自己的分支名称,对应于该远程跟踪名称。所以如果你有origin/older-branch,那么现在你确实有older-branch。 older-branch 标识的提交将是origin/older-branch 现在标识的相同提交哈希 ID
既然您已经有了一个分支名称,那么由您来维护它。删除它并直接使用origin/older-branch 可能更明智。 git branch 命令默认不会列出远程跟踪名称,但使用-r 选项,这正是它将 列出的内容。所以git branch -r --contains 将列出那些远程跟踪名称,其中远程跟踪名称的提交是您在命令行中指定的提交哈希的后代。
1其他Git 会说出默认情况下你得到哪个分支名称,如果你没有在你的git clone 命令中具体说明你的@ 哪个分支987654373@ 应该创建。但除非有人另外设置,否则另一个 Git 会说我推荐master,所以这就是你通常会得到的。