1

Git 早送りマージは、時間に関して FORWARD です。ポインタは、古いコミットから新しいコミットへと移動します。

例 (ffwd マージ マスター ポインターにより、コミット D からコミット G に移動):

早送りマージ前:

                  master
                    |
        A<--B<--B<--D<--E<--F<--G
                                |
                           new_branch

早送りマージ後:

                              master
                                |
        A<--B<--B<--D<--E<--F<--G
                                |
                           new_branch

ただし、コミット ポインターは新しいものから古いものへとポイントするため、これらのポインターに関して厳密には、ブランチ ポインターはコミットポインターの上流に戻ります。その意味で、高速逆マージと呼ぶことができます。アップストリーム (ProGit ブックの用語、マージに関する章) は、リバース フロー、アップストリームを指すため、アップストリーム フローを早送りとして説明すると、初心者は混乱する可能性があります。っていうことは:

コミット ポインターに関して上流。

コミット時間に関して順方向。

この推論は理にかなっていますか?

4

2 に答える 2

2

これは、コミットが矢印のパスをたどった場合にのみ当てはまります。

それがあなたを混乱させていると思います。矢印は、あなたがどこへ行くかではなく、あなたがどこから来たかを指していることを忘れないでください.

マスター ポインターは、分岐に沿って時間を進め、前方に移動しました。HEAD はブランチの先端にあることを思い出してください。HEAD に向かって移動するときはいつでも (後方に移動していないと仮定して)、時間を進めてコミットします。

さて、それをリンクされたリストと考えたいのであれば、そうです、通常、A が先頭で、G が末尾です。ただし、Git では HEAD が G を指していることがわかっています。 、初心者が通常、この低レベルでそれを見て、データ構造の概念をそれに適用しようとするとは思いません。

難しく考えすぎだよ。

于 2012-05-30T15:33:40.520 に答える
0

masterいいえ、 「G」には動きません。「G」で始まり、ffから「D」までです。masterは単なる名前/ラベルです(と呼ばれrefます)。段階的に「移動」するのではなく、マージ後に更新されます。

これを理解するには、競合を伴うマージを試すだけです。マージが手動解決を待っているとき、ブランチはまだ古いコミットを指しています。チェックアウト ツリーとインデックスだけが不確定な状態です。

更新:次 のように考えることができます:

  1. マージ ベースgit merge-base D Gを見つけます。これは G です
  2. G に偽の一時的なブランチを作成します (実際にはブランチではありませんが、しばらくこれを想定してみましょう)。
  3. D への偽のブランチを ff します。
  4. 偽のブランチの名前を に変更しmaster、古いものを上書きします。
于 2012-05-30T15:33:19.227 に答える