2016-11-10 108 views
0

我有一個名爲release/X.X.X.X的發佈分支,其中包含我要部署到生產的所有功能分支。發佈分支位於當前生產狀態的master之上。如何比較兩個git分支並通過提交消息過濾差異?

在每個發佈日,我確保我們的發佈分支僅包含計劃發佈的更改。我使用這個命令來比較發行版和主分支:git log release/X.X.X.X ^master --no-merges。然後,我手動檢查提交的關鍵字,如「SHR-1234」,它們代表票證管理系統中的票號。我需要將每個提交與一個票號列表進行比較,以確定不需要的更改。

如何過濾git log release/X.X.X.X ^master --no-merges不包含關鍵字(如「SHR-1234」)返回的提交?這樣我可以識別不需要的更改的票數。

我嘗試了grep和awk,但結果沒有用,因爲它們沒有過濾掉整個提交。

+2

請參閱'git log --grep',然後查看'--invert-grep'選項。 – torek

+0

@torek通過gui間接使用1000次,但不知道tbh:D謝謝!你可以添加它作爲答案,我可以接受它嗎?我使用它像這樣'git log release/XXXX^master --no-merges --invert-grep --grep ='SHR-1234'--grep ='SHR-4321'...' – clinical

+0

相關:https: //stackoverflow.com/q/1419623/1959808 –

回答

1

git log command這裏提供了兩個有趣的選項:

--grep=<pattern>
            Limi t提交輸出到日誌消息與指定模式(正則表達式)匹配的日誌消息。與多於一個的 --grep=<pattern>,提交其消息匹配任何被選擇給定 圖案(但參閱--all-match)。

           當--show-notes生效時,從音符的信息是 匹配就好像它是日誌信息的一部分。

因此--grep讓你找到那個承諾做包含某些特定字符串或模式。你想提交該包含(任何或全部)字符串,所以我們進入到:在提交輸出

--invert-grep
           限於與日誌消息是那些不匹配 用--grep=<pattern>指定的圖案。

(順便說一句,注意release/X.X.X.X ^master也可以拼寫master..release/X.X.X.X。沒有機器級別的理由可以選擇其中一種,因爲它們都是在內部完全相同的東西 - 所以請使用您發現更具可讀性的那個)。

+0

太棒了,正是我所需要的。謝謝! – clinical

0

您可以使用-G '正則表達式',以滿足您的要求

git log release/X.X.X.X ^master--no-merges -G ‘regular expression’(包括或不包括指定的提交)

+0

'-G'搜索一個表達式,該表達式會在*補丁*中顯示爲添加或刪除的行,即,它取決於在'git diff'輸出上。還有一個'-S',用於搜索字符串*出現次數*的變化(不像'-G'這個搜索固定字符串,而不是正則表達式,除非添加更多標記)。但是,OP想要搜索* commit消息*文本。 – torek

-1

問題標題承認稍有不同的答案,這對於有些人。一個簡單的方法來比較兩個分支通過提交標題是轉儲從每個分支到一個單獨的文本文件提交的標題,並打開這兩個文件的差異閱讀:

git --no-pager log --pretty=format:%s master > log_master.txt 
git --no-pager log --pretty=format:%s other > log_other.txt 
meld log_master.txt log_other.txt 

我們首先轉儲承諾從受試者分支master到文件log_master.txt,然後將分支other中的主體提交到文件log_other.txt,並在視覺差異查看器meld(一個替代方案是kdiff3)中打開它們。

+0

這根本不幫助OP;這不會有什麼不同,然後他說'git log OTHER master'。他的問題是試圖識別他不希望的消息的某些提交;這並沒有減少或解決問題......具有諷刺意味的是,問題是你關注的是標題而不是問題的內容。 – UpAndAdam

+0

事實上,它會導致與'git log --pretty = format:%s other^master'相同的區別。這種方法的一個用途是比較兩個分支中未包含的提交相對於其他提交的位置。 –

+0

你錯過了......在這裏,不會有'master'中的任何提交,這些提交不在OP中關心的'other'中。 'other'比'master'更早於他的版本'分支'。沒有命令可以比較,只是在'other'上的提交列表,而OP想要在那裏找到不應該存在的提交....當完成OP時將合併回'master' ..這也是爲什麼沒有要訂購的東西。你正在回答一個沒有被問到的問題,爲什麼不問問題並回答你一直試圖回答的問題;這可能對其他人有用:) – UpAndAdam