Git提交多个分支,如何找到提交的分支?

时间:2018-02-08 13:46:40

标签: git

如果您将文件提交到多个分支,那么如何查找提交的哪些分支?

1 个答案:

答案 0 :(得分:1)

答案可能git branch --contains,但问题并未形成。

在Git中,提交是每个文件的完整快照。更准确地说,每个提交都标识了Git称为 tree 对象的内容,树本身列出了文件名,模式(100644或100755)以及Git称之为 blob 哈希的内容ID-"真实姓名"存储在Git内部数据库中的文件,Git可以通过它提取文件的数据。 (每棵树也可以列出子树,然后列出更多文件名等等。)

提交也有一个哈希ID。此哈希ID是唯一的:它标识一个特定的提交。但2512f15446149235156528dafbe75930c712b29e并不完全有用;我们喜欢像v2.16.0这样的好名字。所以Git允许我们使用分支和/或标记名来标识一个特定的提交。

每个提交还可以列出其他提交哈希ID,并且大多数列出恰好一个这样的哈希ID。这些是提交的提交。当我们调用v2.16.0的提交只有一个父(实际上是e0d575025a80c83c3eaec82a217714610f0ab115)时,这意味着提交2512f15...位于历史记录中的e0d57502...之后或Git&#39}中。条款,历史记录 2512f15...紧接着e0d57502...。如果我们从后来的提交开始,我们可以回过头来看看前面的提交。如果我们比较两个已保存的快照,我们会在该时间段内看到已更改的内容:

$ git show 2512f15446149235156528dafbe75930c712b29e
commit 2512f15446149235156528dafbe75930c712b29e (tag: v2.16.0)
Author: Junio C Hamano ... [snippage]
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 258aff35c..e4c858d35 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
 #!/bin/sh

 GVF=GIT-VERSION-FILE
-DEF_VER=v2.16.0-rc2
+DEF_VER=v2.16.0

 LF='
 '

同时,像master这样的分支名称只标识一个特定的提交

$ git rev-parse master
5be1f00a9a701532232f57958efab4be8c959a29

如果我们从这个提交开始并在时间上向后工作,在每次提交其父提交之后,也许我们将达到提交2512f15446149235156528dafbe75930c712b29e

$ git branch --contains 2512f15446149235156528dafbe75930c712b29e
* master

并且是的,事实上,master(提交5be1f00... 最终会回到2512f15...

所以,你的问题的一个可能的答案是使用git branch --contains:给它一个提交哈希ID,它会告诉你每个分支名称,如果Git从提交开始该分支名称指向并向后工作,最终导致该特定提交。

但是有一个问题:你的意思是:

  

如果您将文件提交到多个分支......

当你运行git commit时,Git所做的就是创建一个 new 提交。新提交创建过程进行提交,这显然不会 - 至少在任何分支上不存在:

$ git write-tree
8ccb7d4fa49449a843b00aca64baf99feb10e2ab

这是一个由索引构成的新树:它是新提交的快照。

$ git commit-tree -p HEAD -m message 8ccb7d4fa49449a843b00aca64baf99feb10e2ab
aa123a5b9d43186143b6e43cfeca434a67bab9f3
$ git cat-file -p aa123a5b9d43186143b6e43cfeca434a67bab9f3 | sed 's/@/ /'
tree 8ccb7d4fa49449a843b00aca64baf99feb10e2ab
parent 5be1f00a9a701532232f57958efab4be8c959a29
author Chris Torek <chris.torek gmail.com> 1518104686 -0800
committer Chris Torek <chris.torek gmail.com> 1518104686 -0800

message
$ git branch --contains aa123a5b9d43186143b6e43cfeca434a67bab9f3
$ 

所以没有分支包含这个新提交。但是当我们使用常规方式进行提交时(而不是git write-treegit commit-tree), last 步骤是git commit本身更改当前分支 - 在我的情况下,master - 以便当前分支名称指向刚刚进行的新提交。

这意味着如果我要跑:

$ git add somefile
$ git commit

我得到一个新的提交,其中包含当前索引中的所有内容以及添加的文件somefile作为其快照。 Git会让我的master分支指向我刚刚添加的这个新提交。由于提交是 new ,因此其他分支可能无法返回此新提交。因此只有一个分支可以包含它,这就是我现在所在的分支。

因此:

  

如何查找提交的哪些分支是?

如果你刚刚刚提交了提交,那么只有一个提交仅在一个分支上:它就在你现在所在的分支上。这与问题的条件部分相冲突:

  

如果您将文件提交到多个分支......

(单个)提交 C 仅在&#34; on&#34;你做的那个分支。你没有真正将文件提交到一个分支,你提交了文件 一个提交(好吧,这是一种空洞的,但足够真实)然后将 commit 添加到分支。

稍后,您可能已经移动了其他分支名称 - 可能通过git mergegit reset命令 - 和/或创建了指向 commit C ,或者在其历史记录中提交 C (通过遵循其实际的头部提交父哈希ID形成)。那时你可以找到多个包含commit C 的分支名称。

或者,你可能会问一个完全不同的问题,例如:&#34;如果我有一些提交在其存储的树中有一个路径为 P 的文件,我有其他提交,其中没有文件的路径为 P ,如何找到所有所有提交的提交当前分支头,其中存储的提交有一个路径为 P?&#34;在这种情况下,答案是 git branch --contains,但这不是我已回答的问题。