私は相対的なコミット参照について学び、次のgit log --oneline --graph
レッスンで提供される出力。
レッスンでは、与えられたHEADは9ec05ca
コミット、HEAD ^^^(great祖父母のコミットを意味する)は0c5975a
コミット。しかし、私には_4c9749e
は、各SHAがその下の子孫の直接の子孫である場合、great祖父母でなければなりません。
コミットは複数の親を持つことができます。 ^ 1は最初の親を意味します。 ^ 2は2番目の親を意味します。 ^のデフォルトは、最初の親である^ 1です。
同様に、先祖のために上に移動するアクセスを許可します。たとえば、3世代まで〜3世代する場合。同じブランチで最後の7番目のコミットが必要な場合は、トラバース中に最初の親を優先します。
マージには2つの親があり、ブランチへのマージが最初の親になります。 2番目の親になるブランチからマージします。
setia_の答えは最も適切なままですが、git履歴は2つの異なる観点から考えることができるため、あなたの質問は意味があります:完全に親の順序が重要ではないと想定される(数学)グラフとして表示するか、ORマージ操作は、外部ブランチを共通トランク(つまり、現在のブランチ、非常に頻繁に「マスター」)に統合することと見なします。これは、_git merge
_によって行われる仮定でもあります。
これは、指数関数的に成長するツリーをすばやく閲覧するのが苦痛になるだけでなく、完成品を含むブランチ「マスター」を持ち、外部提出を統合することが多くのワークフローが続くモデルであるため重要です。
これらの視点は両方とも有効であるため、_--first-parent
_が頻繁に使用されるオプションになりますが、メインコマンドでもデフォルトの動作でもありません。
たとえば、Linuxカーネルのメインリポジトリ(Gitが最初に設計された)を単純な_git log --graph
_で参照すると、何かを表示するまでに最大1分かかることがありますが、_git log --graph --first-parent
_はメインブランチを表示して、主にマージで構成されており、ときどき直接コミットされることを確認してください。
もう1つ注意しなければならないのは、_--date-order
_を使用した時系列順、または_--topo-order
_を使用したトポロジ順でコミットを表示するよう要求できることです。 2つの異なるブランチがあり、最終的にそれらをマージする前にどちらか一方にコミットすることを想定します。順序に応じて、結果のグラフは次のいずれかになります。
_Chronological order Topological order
* ec9a124 Merge branch 'B' into A * ec9a124 Merge branch 'B' into A
|\ |\
* | e5314f2 Ninth | * e3e2435 Eighth
| * e3e2435 Eighth | * af3bac5 Sixth
* | 308228b Seventh | * 3a2f0b9 Fourth
| * af3bac5 Sixth | * d901c9f Second
* | ab11578 Fifth * | e5314f2 Ninth
| * 3a2f0b9 Fourth * | 308228b Seventh
* | 344bd0f Third * | ab11578 Fifth
| * d901c9f Second * | 344bd0f Third
|/ |/
* 0f029bc First * 0f029bc First
_
すべてのコミットはそれぞれの行に残りますが、後者は深さ優先の検索です。 _git log
_(_git rev-list
_も同様)事前に収集されたリビジョンのコレクションを表示するため、_--graph
_を使用している場合でも、フラットリストとして表示している場合でも(実際にはこの順序は同じです) 、指定されていない場合、_git log
_はデフォルトで逆時系列を使用し、_--graph
_を使用する場合は位相順を使用します。
そのため、選択する親を決定するために最初の行だけに頼ることはできません。
これにより、古いコミットが新しいコミットの前に表示される可能性があります。これは、Gitで開始すると混乱する可能性があり、作業が消えたような印象を与えます(検索を実行してから埋もれて取得するまで)歴史のどこかに)。