svn の使用で懐かしく思うことの 1 つは、リビジョン番号のシンプルな番号付けです。テスト環境にデプロイされたバージョンが特定のコミットの前か後かを簡単に確認できます。
Git がコミットにハッシュを使用する場合、コミットが別のコミットの前に行われたか後に行われたかを確認する方法は何ですか?
ベストアンサー1
ご指摘のとおり、Git では物事はそれほど単純ではありません。特に、「前」と「後」の定義をもう少し明確にする必要があります。
リポジトリにコミットする人がタイムスタンプをいじらないことを信頼していて、両方のコミットが同じブランチにあることが既にわかっている場合は、コミットのタイムスタンプを比較して、どちらが早いかを確認できます。各コミットに対して次のコマンドを使用し、結果を比較します。
git log -1 --format='%ci' <commit>
ただし、Git では、Subversion とは異なり、タイムスタンプを作成する中央リポジトリがないため、必ずしもタイムスタンプを信頼することはできません。また、2 つのコミットが同じブランチにあるかどうかもわかりません (ただし、この問題は Subversion でも存在します)。
これらの問題を回避するには、あるコミットが別のコミットの前か後かではなく、そのコミットの祖先であるかどうかについて考えます。次のコミット グラフでは、B と C は A の祖先ですが、B は C の祖先ではなく、その逆も同様です。
B (master)
| C (branch)
|/
A (root)
コミットAがコミットBの祖先であるかどうかを判断するには、次のコマンドを使用します(git readyの記事):
git rev-list <commitA> | grep $(git rev-parse <commitB>)
最初の部分はコミット A の祖先であるすべてのコミットをリストします。2 番目の部分はコミット B の完全なハッシュを取得し、そのコミットの祖先リストを検索します。出力が表示された場合、コミット A はコミット B の祖先です。引数を入れ替えて、コミット A がコミット B の祖先であるかどうかを判断します。
この 2 番目の形式は遅くなりますが、あるコミットが別のコミットの祖先であることを絶対的に確信できます。