如果您将文件提交到多个分支,那么如何查找提交的哪些分支?
答案 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-tree
和git commit-tree
), last 步骤是git commit
本身更改当前分支 - 在我的情况下,master
- 以便当前分支名称指向刚刚进行的新提交。
这意味着如果我要跑:
$ git add somefile
$ git commit
我得到一个新的提交,其中包含当前索引中的所有内容以及添加的文件somefile
作为其快照。 Git会让我的master
分支指向我刚刚添加的这个新提交。由于提交是 new ,因此其他分支可能无法返回此新提交。因此只有一个分支可以包含它,这就是我现在所在的分支。
因此:
如何查找提交的哪些分支是?
如果你刚刚刚提交了提交,那么只有一个提交仅在一个分支上:它就在你现在所在的分支上。这与问题的条件部分相冲突:
如果您将文件提交到多个分支......
(单个)提交 C 仅在&#34; on&#34;你做的那个分支。你没有真正将文件提交到一个分支,你提交了文件 一个提交(好吧,这是一种空洞的,但足够真实)然后将 commit 添加到分支。
稍后,您可能已经移动了其他分支名称 - 可能通过git merge
或git reset
命令 - 和/或创建了指向 commit C ,或者在其历史记录中提交 C (通过遵循其实际的头部提交父哈希ID形成)。那时你可以找到多个包含commit C 的分支名称。
或者,你可能会问一个完全不同的问题,例如:&#34;如果我有一些提交在其存储的树中有一个路径为 P 的文件,我有其他提交,其中没有文件的路径为 P ,如何找到所有从所有提交的提交当前分支头,其中存储的提交有一个路径为 P?&#34;在这种情况下,答案是不 git branch --contains
,但这不是我已回答的问题。