簡體   English   中英

git branch-不合並<list of branches>

[英]git branch --no-merged <list of branches>

我有2個主要分支masterarchive 如果某些工作被擱置,以后我可能會需要,我可以通過合並到archive分支中來歸檔該工作。 對於未完成的工作,需要保留標簽,這對我來說是一種選擇,因為存在一些標簽問題。

我想找出兩個分支(branch1&branch2)中沒有合並的分支。 我想運行類似

git branch -a --no-merged branch1 branch2

當我以這種方式運行時,它可以工作,但結果不是我所需要的。 我知道一個分支沒有合並到這兩個分支中的任何一個中,它根本不會返回任何內容。 當我開始使用其他2個分支時,它會返回一些結果。

更詳細的例子

FC-o-o(b3)-o-o(b1)
  \         /
   o-o-o(b4)
   |\
   | o-o(b6)-o-o-o(b2)
   |  \       /
   |   o-o(b7)
   |     
   o-o(b5)             

FC - first commit
o - a commit
o(bN) - a branchN(one of the branch1,...,branch7) at a certain commit

所以,如果我運行語句

git branch -a --no-merged branch1 branch2

我想要一個單一的branch5,因為它沒有合並到2個分支的任何一個branch1和branch2中。 請注意,我沒有在文檔中找到任何內容,當我在--no-merged之后指定2個分支時會發生什么。 這就是我試圖檢查的結果是否可以滿足我的期望。

branch3,branch4,branch6和branch7不在輸出中,因為

  • branch3的更改在branch1中
  • branch4合並到branch1
  • branch6的更改在branch2中
  • branch7合並為branch2

可能有一種更簡單的方法來執行此操作,但是上次我沒有找到任何方法,因此我想到了這段腳本。 它的格式為'alias'放入gitconfig文件。 如果您對此不感興趣,請刪除明顯的別名前綴和“!” 在開頭,&&在結尾處為true。

[alias]
    unmer-excl = !git rev-list --all --no-merges --not `git rev-parse HEAD` $* | xargs -L1 git name-rev | grep -oE '[0-9a-f]{40}\\s[^\\~\\^]*' | grep -vE '\\stags/' && true

它的名稱代表“ git unmer ged- excl usive”。

如果添加到別名,則此命令的工作方式如下:

git unmer-excl
# ^ give me all not yet merged into current branch
111111 feature1
444444 feature1
222222 remotes/origin/experiment2
555555 remotes/origin/infrastructure
888888 remotes/origin/experiment2
333333 feature1
999999 remotes/origin/experiment2

如您所見,此命令列出了提交及其唯一的最佳猜測分支名稱。 您可以添加分支以排除:

git unmer-excl feature1 origin/experiment2
# ^ ...excluding anything that was already merged into feature1 or experiment2
555555 remotes/origin/infrastructure

這不僅排除給定分支上的新鮮內容,還排除已經合並到該分支中的所有內容。

輸出從最新提交到最舊提交按順序列出。 這就是為什么如果您不習慣它通常看起來很難看的原因,但是優點是:

  • 最近的第一!
  • 顯示提交,因此您會看到“有多少工作”有待合並(幾行提交ID?十五個屏幕?)
  • 輸出簡單,易於切割| cut -d' ' -f2 | sort | uniq | cut -d' ' -f2 | sort | uniq | cut -d' ' -f2 | sort | uniq ,您會得到未合並分支的列表

    git unmer-excl | 切-d''-f2 | 排序 uniq Feature1遙控器/起源/實驗2遙控器/起源/基礎設施

至於后者,您甚至可以在&& true之前將其添加到別名中,我默認情況下不希望使用它,因為這樣做是為了避免最近發生的簡單損壞排序,而是使用簡單的名稱排序。

對於原始示例:

FC-01-02(b3)-03-04(b1)
  \            /
   05-06-07(b4)
   |\
   | 08-09(b6)-10-11-12(b2)
   |   \         /
   |    13-14(b7)
   |     
   15-16(b5)

我用提交號更改了o以便更好地識別。 下面的示例在項目排序和分支名稱方面的輸出可能有所不同(提交14可以標記為B2或B4等)

git checkout (somewhere not on B5)
git unmer-excl b1 b2    | cut -d' ' -f2 | sort | uniq
b5

git checkout b4
git unmer-excl          | cut -d' ' -f2 | sort | uniq
b1
b2
b5

git checkout FC
git unmer-excl b1 b2
15 b5
16 b5

git checkout b6
git unmer-excl b3 b4
03 b1
04 b1
10 b2
11 b2
12 b2
13 b2
14 b2
15 b5
16 b5

我不知道這對您有幫助,但是您也可以嘗試通過以下命令顯示來自branch1和branch2的提交差異: git log branch1..branch2

暫無
暫無

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

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