2017-12-12 7 views

答えて

1

あなたは、commit1..commit2が、人々が最初にそれが意味すると思うものを意味するわけではありません。実際、この表記法はcommit2 ^commit1の略語です。つまり、コミットがcommit2から到達可能であり、コミットを除いてcommit1であり、到達可能性はcommit1です。

この「到達可能」という概念は少しトリッキーです。私はそれを「ペイントが赤または緑で一時的に行う」と考えるのが好きです。赤は停止を意味し、緑は通常どおりに移動することを意味します。私たちは最新のコミットから始まり、逆に作業します。赤いペイントは緑のペイントをオーバーライドします。停止したコミットは、他の何かが行かなくても停止したままです。 、我々はに対応したバージョン1.01.1、および2.0vとタグ)を、リリースしている。ここ

    tag:v2.0 
        | 
        v 
       J1--J2 <-- release/2 
      /
...--G--H--I--J--... <-- mainline 
     \ 
      H1--H2--H3--H4--H5 <-- release/1 
      ^  ^
       |   | 
      tag:v1.0 tag:v1.1 

は新しいコミットは常に右側に追加され、この1、のようなグラフをコミット考えてみましょうH2H5、およびJ2をそれぞれコミットします。いくつかの名前mainlineポイントがJ後にコミットし、私たちが行く/緑として名前mainlineを使用している場合、我々はJまで、そのすべてのコミットを取得し、その上IHGに後方続ける、と。しかし、私たちは決して再び右に行くことはありません。したがって、余分なもののいずれかを描くことはありませんJnまたはHnは緑色です。同様に、H2を赤で塗りつぶした場合、H2、次にH1、次にH、およびGというようにペイントして左に移動しますが、右に移動しないので、Iまたはそれ以上のものには触れません右。

コミットを見てv1.0..v1.1を表示します。コミットH5、次にH4、次にH3と表示されます。彼らは(v1.1 aka H5から始まる)緑色で塗装されていて、v1.0 aka H2から始まって赤く塗られたことはありません。 v1.1..v2.0を見ると、J2、次にJ1、次にJ、次にI、次にHと表示されます。それはすべて罰金であり、おそらくあなたが期待しているものです。

しかし、このグラフは非常に線形です。我々はグラフのいくつかのフォークとマージの振る舞いがあるとします。

  G--H 
     / \ 
...--E--F  K--L <-- branchname 
     \ /
      I--J 

を、我々はから開始するLをコミット選ぶ、とJで停止します。我々はJ赤を塗り、IFEなどもすべて赤です。そして、我々はL緑、K緑、そしてH緑、そしてG緑を塗りつぶします。 Fは既に赤色です(または、緑の後に赤を表示すると赤で上書きされます)。最終的なコミットのリストは、GがおそらくJより前のものであっても、L,K,H、およびGです。そのトリックは、GJからに到達できないということです。 Gitは日付をまったく使っていません。コミットグラフの到達可能性になります。

また、my answer~List commits between 2 commit hashes in git、より一般的にはThink like (a) Gitも参照してください。

+0

詳細な説明をありがとう。 – lebowski

関連する問題