3

次のような git コミット ツリーがあるとどうなりますか。

A-B-C-D          D <-- v0.9 (tag)

そして、以前にタグ付けされたコミットより前の変更を含むプル リクエストを受け入れます。タグには、マージされたプル リクエストからのコミットが含まれますか?

A-F-B-G-C-D      D <-- ? v0.9 (tag)
4

1 に答える 1

6

git では、タグは特定のコミット オブジェクトを指します。実際に を実行したgit pull --rebase場合、グラフは次のようになります。

A-B-C-D

A-F-B'-G-C'-D'

実際のコミット オブジェクトはツリーの状態と親子関係に依存するため、C から D への差分が C' と D' の差分とまったく同じであっても、それらは異なるコミット オブジェクトです。

したがって、あなたの質問に対する答えはv0.9、タグが最初に作成されたとき、タグは常に D のバージョンを指すということです。したがって、履歴を書き直した場合は、現在のブランチのツリーに存在しなくなったコミットを指すタグが作成されます。

ただし、BC と D をプッシュする前に、誰かがコミットしてブランチ FBG と C にプッシュしただけの場合は、更新に必要なプルを実行するときに、マージまたはリベースのどちらを実行するかによって、何が起こるかが異なります。既存の歴史を持つ地元の支店。

デフォルトはマージです。これにより、グラフは次のようになります。

A-F-B-G-C
 \       \
  B-C-D---M

ブランチ ヘッドが M を指す場所と、ツリーの各ブランチの B と C は異なります (両方とも別の場所から同じコミットを選択したとしても)。

アップデート

tl;dr:

  • 誰が最初にコミットしたか (タイミング) は問題ではありません。順序は、グラフと、グラフを結合および/または変更するオプション (マージ、リベース、チェリーピック) によって異なります。最終的な構造がどのように見えるかを決定します。
  • commit オブジェクト (タグが指すもの) は変更されないため、タグ付けされたコミットは更新されません
  • コミットは変更されないため、履歴が書き換えられると、差分が同一であっても、実際には新しいコミット オブジェクトが作成されます。物事が変化しているように見えるかもしれませんが、実際にはグラフでは非常に似たものに置き換えられています。
于 2013-05-19T23:03:53.623 に答える