簡體   English   中英

Git提交到多個分支,如何找到提交到哪個分支?

[英]Git commit to multiple branches, how do I find which branches the commit went to?

如果將文件提交到多個分支,如何查找提交的分支屬於哪個分支?

答案可能git branch --contains ,但是問題的格式不正確。

在Git中,提交是每個文件的完整快照。 更准確地說,每次提交都標識Git調用對象的內容,樹本身列出文件名,其模式(100644或100755)以及Git調用的Blob哈希ID(存儲在Git內部的文件的“真實名稱”)數據庫,Git可以通過該數據庫提取文件的數據。 (每棵樹還可以列出子樹,然后列出更多文件名,依此類推。)

提交也具有哈希ID。 該哈希ID是唯一的:它標識一個特定的提交。 但是2512f15446149235156528dafbe75930c712b29e人類並不完全有用; 我們喜歡v2.16.0類的好名字。 因此,Git允許我們使用分支和/或標記名稱來標識一個特定的提交。

每個提交還可以列出其他提交哈希ID,並且大多數列表僅列出一個這樣的哈希ID。 這些是提交的提交。 當我們稱為v2.16.0的提交只有一個父對象時(實際上是e0d575025a80c83c3eaec82a217714610f0ab115 ),這意味着提交2512f15...e0d57502...之后e0d57502...在歷史上–或按Git的說法,歷史 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-commit-creation流程進行了一個新的提交,該提交顯然(至少目前尚未)存在於任何分支上:

$ 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 )時, 最后一步是git commit本身會更改當前分支(在我的情況下為master ,以便當前分支名稱指向到剛剛做出的新提交。

這意味着如果我要運行:

$ git add somefile
$ git commit

我將獲得一個新的提交,該提交具有作為快照,現在索引中的所有內容以及添加的文件somefile Git將使我的master分支指向我剛剛添加的這一新提交。 由於該提交是提交,因此沒有其他分支可以返回該新提交。 因此, 只有一個分支可以包含它,這就是我現在所在的分支。

因此:

您如何查找提交屬於哪個分支?

如果您剛剛才進行提交,則單個提交僅在一個分支上:您現在在該分支上。 這與問題的條件部分沖突:

如果將文件提交到多個分支...

(單個)提交C僅在創建時所在的分支“上”。 你沒有真正的文件提交分支,你犯下的文件提交(當然,這是一種空洞的,但真的不夠),然后添加提交到分支。

以后,您可能已經移動了其他分支名稱(可能通過git mergegit reset命令)和/或創建了其他新的分支名稱,這些新分支名稱要么指向 commit C ,要么在歷史記錄中具有commit C (通過遵循它們的實際頭部提交形成)父哈希ID)。 到那時,您可以找到包含提交C的多個分支名稱。

或者,您可能會問一個完全不同的問題,例如:“如果我有一定數量的提交,在它們的存儲樹中有一個路徑為P的文件,而我還有其他提交,則沒有路徑為P的文件。 ,如何在存儲的提交具有路徑為P的文件的所有當前分支頭中找到所有可到達的提交 “在這種情況下,答案不是 git branch --contains ,但這不是我要回答的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM