2017-07-30 127 views
2

在我的項目中有一個stable分支和一個dev分支。承諾從dev分支挑選到stable分支。git cherry:如何通過提交消息識別等價提交

爲了篩選dev所有未提交合併到stable的提交,git cherry -v stable dev看起來是不錯的選擇。然而,通過差異,通常解決中cherry-pick合併衝突後改變標識等價:

等價測試是基於差異,刪除空白 和行號之後。 git-cherry因此通過git-cherry-pick(1),git-am(1)或git-rebase(1)檢測提交已被「複製」的提交。

我想知道是否有像git cherry一樣的任何命令,但通過提交消息標識等效提交?

+0

如果你只是想清理'dev'分公司爲了不具有多次提交反覆變化,你可以做'git的變基stable'。當然,那麼你必須清理所有的衝突。 –

+0

你有沒有強迫推'dev'? – max630

+0

@ max630不是。 'dev'分支受gerrit保護。 – lz96

回答

1

似乎有做這個沒有直接的方法,所以我寫了一個簡短的腳本:

#!/bin/bash 
git cherry -v stable dev | grep + | cut -d ' ' -f 3- > /tmp/unmerged 
xargs -a /tmp/unmerged -I{} git --no-pager log stable --pretty=oneline --grep {} | cut -d ' ' -f 2- > /tmp/cherry-picked 
diff /tmp/unmerged /tmp/cherry-picked 

說明

git cherry -v stable dev | grep + | cut -d ' ' -f 3- > /tmp/unmerged 寫道承諾,只有在dev存在提交的信息科。這些提交包括那些已被挑選並更改爲stable分支的提交,並且我們需要在下一步中過濾掉這些提交。

xargs -a /tmp/unmerged -I{} git --no-pager log stable --pretty=oneline --grep {} | cut -d ' ' -f 2- > /tmp/cherry-pickedstable中輸出出現的消息(1)出現時具有相同的消息。換句話說,/tmp/cherry-picked存儲所有被挑選並從dev更改爲stable的提交。

最後,diff /tmp/unmerged /tmp/cherry-picked給出了在dev上的所有提交,其中在stable上沒有發現具有相同提交消息的提交。

+0

依靠提交消息是脆弱的,使用'patch-id'是正確的方式,如果你想以'git cherry'的方式匹配提交' –

0

如果dev中的提交沒有重定位,那麼您可以使用git cherry-pick -x,明確標記源。沒有自動使用這些信息,但有一些bash fu可以使用它。

0

您想使用patch-id。這是git cherry使用的機制。

要查找提交3642151運行的等效:

git show 3642151 | git patch-id

你應該得到一個符合兩個散列;第一是patchid(電話 它PATCHID_FROM_ABOVE

git log -p | git patch-id | grep PATCHID_FROM_ABOVE

這應該給你的是對應於patchid所有提交的清單。

被盜來源:http://git.661346.n2.nabble.com/git-cherry-to-find-equivalent-commit-IDs-td3440883.html

+0

在'cherry-pick'期間解決衝突後,提交的差異可能會改變,這就是爲什麼在這種情況下'git cherry'或'git patch-id'不起作用。 – lz96

+0

你爲什麼問「我想知道有沒有像git cherry一樣的命令?」? –