gitコミットがマージ/リバートコミットであるかどうかを伝える
-
26-09-2019 - |
質問
特定のコミットがマージ/リバートコミットであるかどうかを確認する必要があるスクリプトを書いています。そのためのgitトリックがあるかどうか疑問に思っています。
私がこれまでに思いついたのは、ここでコミットメッセージに依存したくないことは間違いありません)はチェックすることです HASH^2
そして、私がエラーが発生しないかどうかを確認します、より良い方法はありますか?
解決
何かがマージであるかどうかを理解するのは簡単です。それはすべて複数の親でコミットしています。それをチェックするために、たとえばできることができます
$ git cat-file -p $commit_id
出力に複数の「親」ラインがある場合、マージが見つかりました。
元に戻すと、それほど簡単ではありません。一般に、戻ることは、以前のコミットの違いを逆に適用するためにたまたま通常のコミットであり、導入された変更を効果的に削除します。それ以外の場合は特別ではありません。
リバートが作成された場合 git revert $commit
, 、次に、gitは通常、復帰を示すコミットメッセージを生成し、どのコミットが戻ったかを示します。ただし、他の方法で戻ること、またはによって生成されたコミットのコミットメッセージを変更することは非常に可能です git revert
.
生成されたリバートコミットメッセージを探していることは、あなたが達成しようとしていることにとってすでに十分なヒューリスティックかもしれません。そうでない場合は、実際に他のコミットを調べ、違いを互いに比較する必要があります。しかし、それでも良い解決策ではありません。多くの場合、十分なリバートは、たとえば、コミットとリバートの間に発生したコードの変更に伴うなど、彼らが戻っているコミットの逆の逆とはわずかに異なります。
他のヒント
次の指示が捨てられます それだけ 親はハッシュします。より少ないフィルタリングが必要です...
git show --no-patch --format="%P" <commit hash>
使用の答え git cat-file
Gitを使用しています 「配管」 コマンドは、通常、出力形式が変更されないため、スクリプトを構築するのに適しています。使用しているもの git show
と git rev-parse
彼らが使用しているときに時間の経過とともに変更する必要があるかもしれません 磁器 コマンド。
私が長い間使用してきたバッシュ関数 git rev-list
:
gitismerge () {
local sha="$1"
msha=$(git rev-list -1 --merges ${sha}~1..${sha})
[ -z "$msha" ] && return 1
return 0
}
磁器/配管コマンドのリストは、トップレベルのドキュメントにあります ギット 指図。
このコードは使用します git-rev-list 具体的に GitRevisions クエリ ${sha}~1..${sha}
SHAの2番目の親が存在する場合、または存在しない場合は何も印刷する方法では、マージのコミットの正確な定義です。
具体的には、 SHA~1..SHA
意味 Shaから到達可能なコミットを含めますが、Shaの最初の親であるSha〜1に到達可能なものを除外します。.
結果は$ MSHAに保存され、bashを使用して空虚についてテストされています [ -z "$msha" ]
失敗(1つの返却)が空の場合、または渡されます(0を返す)。
マージのコミットをテストする1つの方法:
$ test -z $(git rev-parse --verify $commit^2 2> /dev/null) || echo MERGE COMMIT
Git Revert Commitsについては、同意します @rafl 最も現実的なアプローチは、コミットメッセージ内のメッセージボイラープレートを回復することを探すことです。誰かがそれを変更した場合、検出することは非常に関与します。
マージのコミットをテストする簡単な方法:
git show --summary HEAD | grep -q ^Merge:
これにより、マージコミットの場合は0、非マージコミット用に1が返されます。テストに目的のコミットにヘッドを置き換えます。
使用例:
if git show --summary some-branch | grep -q ^Merge: ; then
echo "some-branch is a merge"
fi
コミットの両親を見つけるためのさらに別の方法:
git show -s --pretty=%p <commit>
使用する %P
完全なハッシュ用。これは何人の親を印刷します HEAD
もっている:
git show -s --pretty=%p HEAD | wc -w