簡體   English   中英

Git branch --merged / --no-merged和--squash選項

[英]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實際上並沒有進行合並。 假設您的分支歷史記錄如下所示(使用分支topicdevel ):

          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 ,提交(標記為SM ,無關緊要)再次擁有相同的樹,但現在有兩個父箭頭指向你LJ ,就像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.

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