2010-09-29 181 views
25

我正在編寫一個腳本,需要檢查特定的提交是否爲合併/恢復提交或不,我想知道是否有一個git技巧。告訴Git提交是否合併/恢復提交

到目前爲止我所提出的(我絕對不想依賴提交信息)是檢查HASH^2,看看我是否沒有錯誤,是否有更好的方法?

回答

29

搞清楚是否合併很容易。這是所有提交超過一個家長。要檢查是否存在,你可以做,例如

$ git cat-file -p $commit_id 

如果有輸出超過一個'父」行,你找到了合併。

恢復它並不容易。通常,還原僅僅是正常的提交,恰好相反地應用了先前提交的差異,有效地消除了引入的提交的更改。沒有其他特別的。

如果使用git revert $commit創建恢復,那麼git通常會生成一條提交消息,指示恢復以及恢復的提交。但是,很可能以其他方式進行恢復,或者更改由git revert生成的提交的提交消息。

尋找那些生成的回覆提交消息可能已經是一個很好的嘗試你想實現的啓發式。如果不是,你必須實際查看其他提交,比較彼此的差異,看一個是另一個提交的確切的反向操作。但即使這不是一個好的解決方案。通常,足夠的回覆與其正在恢復的提交的反轉略有不同,例如,以適應在提交和回覆之間發生的代碼更改。

+0

修正。謝謝! – rafl 2010-09-29 23:17:09

8

使用git cat-file的答案是使用git 「管道」命令,由於輸出格式不可能發生變化,因此通常更適合構建腳本。使用git showgit rev-parse的那些可能需要隨時間改變,因爲它們使用的是porcelain命令。

我已經使用了很長時間的bash函數使用git rev-list

gitismerge() { 
    local sha="$1" 
    msha=$(git rev-list -1 --merges ${sha}~1..${sha}) 
    [ -z "$msha" ] && return 1 
    return 0 
} 

瓷/管道命令的列表可以在文檔的頂層 git命令可以找到。

此代碼使用git-rev-list與特定gitrevisions查詢${sha}~1..${sha}在打印SHA的第二父,如果它存在的方式,或者什麼,如果它不存在,這是一個合併提交的確切定義。

具體地說,SHA~1..SHA意味着包括由SHA可達提交但排除那些可達SHA〜1,這是SHA的第一個親本。

結果存儲在$ msha中,並使用bash [ -z "$msha" ]失敗(返回1)(如果爲空)或通過(返回0)(如果非空),測試其是否爲空。來測試合併

+0

你的意思是什麼*瓷器*?你指的是什麼答案? – knocte 2017-02-27 04:12:10

+0

嗨@knocte我給鏈接添加了一些文字,HTH。 – qneill 2017-02-27 23:58:07

+0

感謝您的更新;還有兩個問題:'[-z foo]'實際上做了什麼?我想知道這一點,因爲我有興趣使用這個而不是bash腳本......另外,與'cat-file'相比,你的解決方案有什麼缺點和好處?歡呼 – knocte 2017-02-28 04:34:50

2

一種方式提交:

$ test -z $(git rev-parse --verify $commit^2 2> /dev/null) || echo MERGE COMMIT 

至於混帳復歸承諾,我同意@rafl,最現實的做法是尋找提交信息的復歸消息樣板;如果有人改變它,檢測將會非常複雜。

+1

'test -z'做了什麼?這個問題沒有要求bashisms ... – knocte 2017-02-28 06:06:01

+0

空洞的測試,請參閱https://stackoverflow.com/questions/18096670/what-does-z-mean-in-bash – qneill 2017-12-06 23:56:26

14

以下指令將僅轉儲出父散列。較少的濾波需要...

git show --no-patch --format="%P" <commit hash>

0

簡單的方法來測試合併提交:

git show --summary HEAD | grep -q ^Merge: 

這將非合併提交返回0合併提交,1。用你想要的提交替換HEAD來測試。

實例:

if git show --summary some-branch | grep -q ^Merge: ; then 
    echo "some-branch is a merge" 
fi 
+1

這似乎是一個很好的解決方案給我,因爲如果有人在正常(非合併)提交中使用單詞「合併」,那麼您將有一個** false positive ** – knocte 2017-02-27 04:11:04

+0

@knocte正則表達式中的插入符號(^):它搜索合併_在行_的開頭。提交消息由幾個空格縮進,所以即使它包含合併,它也不會匹配。差異本身的內容(除了縮進之外)都沒有顯示出來,這是由 - 小結標誌提供的。我知道它看起來很糟糕,但這就是Git :)這個解決方案沒有誤報。 – hraban 2017-02-28 00:37:51

+0

好的謝謝澄清;正如你所說,它看起來很糟糕...... – knocte 2017-02-28 06:05:17