[英]Git branch --merged / --no-merged and --squash option
git branch --merged
似乎與--squash不能很好地配合。
如果你做一個正常的git merge
,那么git branch --merged
告訴你合並了哪些分支。 但是,如果使用--squash選項,即使生成的樹相同,也不是這種情況。
我懷疑這是一個git缺陷,想知道是否有一些git-fu我錯過了,或者我是否誤解了一些東西。
簡而言之:我想使用--squash,但也希望git告訴我,我壓扁的另一個分支是否已經過了。
你不能從這里到達那里(正如指示說話的人)。 更確切地說,它沒有意義。
問題是git merge --squash
實際上並沒有進行合並。 假設您的分支歷史記錄如下所示(使用分支topic
和devel
):
H ⬅ I ⬅ J <-- topic
⬋
⬅ F ⬅ G
⬉
K ⬅ L <-- devel
如果你查看devel
和merge topic
你會得到一個包含合並結果的新合並提交M
,並且M
有兩個父項:
H ⬅ I ⬅ J <-- topic
⬋ ⬆
⬅ F ⬅ G ⬆
⬉ ⬆
K ⬅ L ⬅ M <-- devel
但是如果你使用git merge --squash topic
你會獲得一個新的提交(讓我們將它標記為S
用於壁球):
H ⬅ I ⬅ J <-- topic
⬋
⬅ F ⬅ G
⬉
K ⬅ L ⬅ S <-- devel
其中(正如您已經注意到的)提交S
的內容 (樹)使得所有文件與提交M
的文件相同。 但是從S到topic
沒有反向鏈接(父箭頭)。 它根本不是合並,它只是從topic
獲取所有更改,將它們壓縮成單個更改,並將其添加為完全獨立的提交。
現在,關於git merge --squash
的另一件事是它沒有進行最后的提交。 因此,您可以創建git將在“常規”合並上執行的.git
文件,並執行具有您將在“真正”合並上獲得的兩個父級的提交。 然后你會得到......如果你運行git merge topic
,提交(標記為S
或M
,無關緊要)再次擁有相同的樹,但現在有兩個父箭頭指向你L
和J
,就像M
一樣。
實際上,運行git merge --squash
幾乎與運行git merge --no-commit
完全相同,除了合並完成時留下的跟蹤文件( git commit
使用其中一些設置父項)。 squash
版本不會寫入.git/MERGE
, .git/MERGE_HEAD
和.git/MERGE_MODE
。 (它確實創建.git/MERGE_MSG
,與git merge --no-commit
,它也會創建.git/SQUASH_MSG
。)
因此,基本上,您可以選擇:真正的合並(最終提交中的兩個或多個父級),或者壁球(相同的樹組合機制,但最終提交時只有一個父級)。 並且,由於git branch --merged
通過查看存儲在存儲庫中的每個提交的“父箭頭”來工作,因此只有真正的合並才是合並,因此git branch
稍后才能發現真正的合並。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.