Gitは、親から子へのリンクを保存しません。子供から親までのリンクのみ。コミットの子を見つけるには、リポジトリ内の子孫のコミット(ブランチヒント、タグ、HEADなど)から始め、ルートノードに到達するか問題のコミットを見つけるまで親チェーンを歩かなければなりません。
あなたのDAGをコミットするには、線形であり、tip
はchildmostへの参照がコミットされ、子供が改正deadbeefe
のコミットを見つけるために、次のような何かを行うことができます場合は、次の
git rev-list deadbeefe..tip | tail -n 1
これから歩き始めるためにGitリポジトリを引き起こしtip
がdeadbeefe
に達するかルートに到達し、それが出てくるすべてのコミットを表示します。最後に訪問されたコミットを選択するために出力は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
、タグ、および/または支店を総称して参照したいときに参照をします。
これは「木の実」ではありません。あなたは、木ではなく、コミットについて話しています(コミットやタグなどのツリーを含むオブジェクト)。しかし、いいえ、子供のコミット(2つ以上ある可能性があります)を参照するためのgitのような方法はありません。また、履歴は親ポインタだけで保存されます。 – knittl
@knittlでも答えは 'HEAD〜n'を使い、繰り返し'〜n'を減らすことができます。 – Maxpm