2012-02-21 8 views
2

私は各コミットを順番に確認しようとしていますが、最初のものから現在のものまで動いています。実際にはgit bisectではありませんが、私は何の問題も予期していません。しかし、私は各コ​​ミットが自己完結していて正しいことを確認したい。gitには「相対的な」ツリーがありますか?

HEAD ^を使用してヒントから戻ることはできますが、「私はどこから来ているのですか」というのはありますか?

git checkout deadbeefe 
build and test 
git checkout current+1 
<up two, return> 
<up two, return> 

をしかし、私は「1 +現在」のtreeishを把握することはできません。私は私がやりたい

o aaabbbccc (tip) 
| 
o abcdefabc 
| 
o fedcbafed 
| 
o abcdabcde 
| 
o deadbeefe (root) 

を持っている場合、それは、あります。

+5

これは「木の実」ではありません。あなたは、木ではなく、コミットについて話しています(コミットやタグなどのツリーを含むオブジェクト)。しかし、いいえ、子供のコミット(2つ以上ある可能性があります)を参照するためのgitのような方法はありません。また、履歴は親ポインタだけで保存されます。 – knittl

+1

@knittlでも答えは 'HEAD〜n'を使い、繰り返し'〜n'を減らすことができます。 – Maxpm

答えて

4

Gitは、親から子へのリンクを保存しません。子供から親までのリンクのみ。コミットの子を見つけるには、リポジトリ内の子孫のコミット(ブランチヒント、タグ、HEADなど)から始め、ルートノードに到達するか問題のコミットを見つけるまで親チェーンを歩かなければなりません。

あなたのDAGをコミットするには、線形であり、tipはchildmostへの参照がコミットされ、子供が改正deadbeefeのコミットを見つけるために、次のような何かを行うことができます場合は、次の

git rev-list deadbeefe..tip | tail -n 1 

これから歩き始めるためにGitリポジトリを引き起こしtipdeadbeefeに達するかルートに到達し、それが出てくるすべてのコミットを表示します。最後に訪問されたコミットを選択するために出力はtailにパイプされ、コミット履歴が線形の場合はdeadbeefeの子になります。

HEADは現在チェックアウトされているコミットを指しているので、deadbeefeではなく現在のコミットの子が必要な場合はHEADを使用してください。未指定の場合は、次の操作を行うことができますので、HEADにデフォルトのコミットが必要なコマンド:

git rev-list ..tip | tail -n 1 

は再び、DAGであればこれだけの作品は線形です。コミット履歴が線形でない場合は、 --ancestry-path引数を rev-listに使用できます。

次のコミットに移動するたびにO(n^2)になりますが、Gitは非常に速いため、通常は実際には問題になりません。あなたはそれがO(n)とする必要がある場合は、私は次のようにしてください:

git rev-list --reverse tip | while IFS= read -r rev; do 
    git checkout "${rev}" || handle_checkout_error_here 
    # build and test here 
done 

そして@knittlはあなたがここに欲しい用語がtreeish、ないコミットされ—正しいです。いくつかの用語:

  • A「treeishは、」ファイルシステムツリー(例えば、インデックス、作業ディレクトリ、作業ディレクトリ内のサブディレクトリ、コミット、コミット内部のサブディレクトリなどのように振る舞うことができるものです)。
  • '改訂'はコミットよりもあまり定義されていませんが、通常はコミット(コミット、コミットを指し示す注釈付きタグ、コミットを参照する参照)を識別するものを意味します。
  • 'reference'は、Gitオブジェクトまたは別の参照へのポインタです(この場合、 'シンボリックリファレンス'と呼ばれます)。参照は、通常、コミットまたは注釈付きタグオブジェクトを指しますが、何かを指すことができます。人々は通常、HEAD、タグ、および/または支店を総称して参照したいときに参照をします。
+0

私がしたいことが直接的に可能ではなく、その問題を回避するテクニックを提供していることを明確にしてくれてありがとう。 私は一度にこれを行う、会議に出るなどの理由で、あなたのショーのようなループを実際には望んでいません。 gitに「私は+/- nです少なくとも「私はどこですか?」と言う方法はありますか?つまり、「git checkout deadbeefe」と言うと、「git ???」に挿入して「deadbeefe」を取り戻すにはどうすればよいですか?もし私がそれを持っていれば、あなたはループの外であなたの 'テール'テクニックを使うことができます。 –

+0

'treeish'に関しては、私がコミットを操作しようとしていることを知っていますが、SHAを明示的に使用してHEAD、ブランチ{n}などのようなものを使用することを区別しようとしていました。 ? –

+0

@ChrisNelson:あなたのコメントに答えるために私の答えを更新しました –

関連する問題