我想测试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 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
master
,develop
和feature
。运行时:的那个存储库,并且已将该URL保存为名称$ git clone <url>
您将获得自己的Git存储库。 您的
Git存储库现在知道另一个Git存储库-位于[[url
origin
:$ git remote
origin
$ git remote show origin
* remote origin
Fetch URL: ...
... lots more stuff ...
<< [second命令不要调用任何其他Git:它们仅在您的 Git存储库中查找。此时,您的 Git存储库只有git remote
命令实际上实际上调用了另一个Git来获取信息。到目前为止,在Git中的Most
一个
分支名称,几乎可以肯定是master
。1如果运行git branch
列出您的分支名称,您会看到那个分支。这是否意味着分支develop
和feature
在您的存储库中不存在?答案是否定的。问题在于确定branch的意思。另请参见What exactly do we mean by "branch"?您可能在这里关心的commits确实存在。实际上,您可能想使用的某些
names
也存在! 不存在存在的名称是分支名称develop
和feature
。如果您运行: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 fetch
的origin
时,您的Git在origin
调用Git。他们进行了交谈,您的Git将会获取他们拥有的,您没有的,您的Git想要进行的任何提交。然后,您的Git将更新您的远程跟踪名称。在这种情况下,您的远程跟踪名称将是origin/master
,origin/develop
和origin/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
,那么现在您do有older-branch
。 older-branch
标识的提交将是[[Came]现在标识的same
现在您确实有一个分支名称,这取决于您自己维护。删除它并直接使用 1origin/older-branch
可能更明智。默认情况下,origin/older-branch
命令不会列出远程跟踪名称,但是使用git branch
选项时,它正是will列表中的名称。因此,-r
将列出那些远程跟踪名称,其中远程跟踪名称的提交是您在命令行上指定的提交哈希的后代。git branch -r --contains
命令中指定有关git clone
应该创建哪个分支的信息。但是除非有人另外设置,否则其他Git会说
我推荐git clone