svn の使用について私が見逃していることの 1 つは、リビジョン番号の単純な番号付けです。テスト環境にデプロイされたバージョンが特定のコミットの前か後かを簡単に確認できます。
コミットにハッシュを使用するgitでは、コミットが別のコミットの前または後に行われたかどうかを確認する方法は何ですか?
svn の使用について私が見逃していることの 1 つは、リビジョン番号の単純な番号付けです。テスト環境にデプロイされたバージョンが特定のコミットの前か後かを簡単に確認できます。
コミットにハッシュを使用するgitでは、コミットが別のコミットの前または後に行われたかどうかを確認する方法は何ですか?
お気づきのように、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 番目の形式は処理が遅くなりますが、あるコミットが別のコミットの祖先であるという絶対的な確信が得られます。
ハッシュ、作成者、日付、およびコメントを示すログからすべてのコミット情報を取得できます。
git log
コミット ログから特定のコミットの日時を取得できます。何かのようなもの:
git log -1 --format="%cd" <commit>
「%cd」は、ログの形式で日付を示します。次のこともできます。
そこから、自動化する必要がある場合は、いくつかのスクリプトを使用していくつかの比較を行うことができます。
タグを使用すると、次のことができます
git describe --tags
これにより、最後のタグ以降のコミット数がわかります。