2013-01-08 16 views
7

svnの使用について私が欠場しているものは、リビジョン番号の単純な番号です。テスト環境にデプロイされたバージョンが特定のコミットの前か後かを簡単に確認できます。ハッシュが与えられた別のコミットの前または後にgitコミットがチェックインされているかどうかを調べる

gitでコミットにハッシュを使用すると、別のコミットの前後にコミットがあったかどうかを確認する方法はありますか?

答えて

7

これは、気になるとおり、Gitでは簡単ではありません。特に、「前」と「後」の定義にはもう少し明確化が必要です。

リポジトリにコミットする人々がタイムスタンプを混乱させることなく信頼し、両方のコミットが同じブランチ上にあることをすでに知っている場合は、コミットのタイムスタンプを比較し、どちらが早いかを確認できます。コミットごとに次のコマンドを使用し、結果を比較します。 Gitのでは

git log -1 --format='%ci' <commit> 

Subversionのとは違って、それらを生産する仕事に中央リポジトリが存在しないので、あなたは必ずしも、しかし、タイムスタンプを信頼することはできません。また、2つのコミットが同じブランチ上にあることを確認することはできません(Subversionではこの問題も存在します)。

これらの問題を回避するには、あるコミットがその前後に来るのではなく、別のコミットが別のものの祖先であるかどうかを話してください。決定するかどうか、AがBをコミットの祖先であるコミット、(次のコマンドを使用し

B (master) 
| C (branch) 
|/ 
A (root) 

:BがCの先祖も、その逆ではないながら、グラフをコミット以下では、BおよびCは、Aの祖先でありますan article at git readyに)ベース:

git rev-list <commitA> | grep $(git rev-parse <commitB>) 

最初の部分リストはコミットの祖先であるすべてのコミット。 2番目の部分はコミットBの完全ハッシュを取得し、そのコミットの先祖リストを検索します。出力がある場合は、コミットAはコミットBの祖先です。コミットAがコミットBの祖先である場合は、引数を入れ替えてください。

この2番目の形式は遅くなりますが、1つのコミットが別のコミットの祖先であることが絶対確実です。

+0

私はgitのログ-1 --format = '%ciは' を行うときにタイムスタンプが何を表しているのでしょうか?私は、タイムスタンプを信用できないときのシナリオを理解しようとしています。 – Glide

+0

@Glide:タイムスタンプは、コミットが行われた時刻を表します。しかし、コミットは開発者のローカルリポジトリで最初に行われるため、コンピュータの時計が間違っているか、GIT_COMMITTER_DATEで再生するようなトリックを使用すると、そのタイムスタンプが正しくない可能性があります。 –

+0

ねえ、コマンドは機能しますが、どのように動作するかについてあなたが言ったことは間違っています。 git rev-listコマンドは、コミットBがコミットAの祖先であるかどうかを実際に判断します。「最初の部分は、コミットAの祖先であるすべてのコミットをリストします。私がやったいくつかのテストから明らかにそうです。したがって、コミットSHAのためにそのリストをグロッピングする場合、grepは成功します。IFFコミットBはその祖先リストにあります。つまり、コミットAの祖先です - あなたが書いたものの反対です。 – eeeeaaii

0

あなたがタグを使用している場合は、これはどのように多くのコミット最後のタグ以来のことを教えてくれます

git describe --tags 

を行うことができます。

2

各コミットでgit showを使用すると、コミットの日付を見つけることができます。順序を決定するためにハッシュを見るだけの方法はありません。ハッシュだけなので、順序を決定する方法はありません。

カスタムフォーマット文字列を使用して、必要なものだけを表示することができます。詳細については、man pagesを確認してください。

git show --format="%ci" <commit> 
2

あなたはすべてのハッシュ、著者、日付を表示するログから情報をコミット取得し、コメントすることができます

git log 

は、あなたが特定のコミットログからの時刻/日付をコミット引くことができます。以下のような何か:

'%CDには、' あなたのログの形式で日付を与える
git log -1 --format="%cd" <commit> 

、あなたも行うことができます。

  • % CD:RFC2822スタイル
  • %のCR:相対
  • %CT:UNIXタイムスタンプ
  • %のCI:ISO 8601形式

そこから、ヨーヨーもしあなたが自動化する必要があれば、いくつかのスクリプトとの比較ができます。

3

git rev-list --countが役に立ちます。 110a187を想定して、その後、5d41af1前に4つのコミットをしています:

$ git rev-list --count 110a187..5d41af1 
4 
$ git rev-list --count 5d41af1..110a187 
0 

したがってような何か:

test $(git rev-list --count $a..$b) == 0 && \ 
     echo "$a is not an ancestor of $b" 
+0

@Glideが一時的ではなく親/子孫を意味する場合、この回答は、コミットが異なるブランチからのマージを介してブランチに入った場合に、より正確です。 –

関連する問題