5

親ブランチ A と子ブランチ B があります。ブランチ B には 2 つの別々のコミットがあります。このように、AのブランチBをスカッシュとマージしました

git merge --squash B 

ブランチ A とブランチ B を比較すると:

git log A..B

ブランチ B からの両方のコミットがマージされていないことを示しています。親ブランチ A の押しつぶされたコミットと比較するにはどうすればよいですか? 両方のブランチ間で応答に違いがないように

ありがとう

4

1 に答える 1

6

git mergeドキュメントを引用すると、次のようになります--squash

実際のマージが発生したかのように (マージ情報を除いて) 作業ツリーとインデックスの状態を生成しますが、実際にはコミットを作成したり、次のコマンドでマージ コミットを作成するようにHEADレコードを移動したりしません。これにより、現在のブランチの上に単一のコミットを作成できます。その効果は、別のブランチをマージするのと同じです (タコの場合はそれ以上)。$GIT_DIR/MERGE_HEADgit commit

つまり、git commit結果が得られた後は、マージ コミットではなく、通常のコミットが行われます。この通常のコミットに関連付けられたツリー(チェックアウトすると作業ディレクトリにあるもの) は、マージを実行して取得したツリーと一致しますが、実際のマージは記録されません。

説明したセットアップを考えると、実行する前にこれがありましたgit merge --squash B

...- o         <-- A
      \
       o - o   <-- B

あなたのコミットグラフとして。git checkout A; git merge --squash B; git commit -m squash-Bあなたが今持っている後:

...- o ----- *   <-- HEAD=A
      \
       o - o     <-- B

*最新のコミットと、 branch のみにある 2 つのコミットのいずれかとの間には、コミットグラフ接続がないことに注意してくださいB。コミットのツリー*は、通常のマージで得られるものと同じですが、コミット グラフは異なります。実際のマージは次のようになります。

...- o ----- *
      \     /
       o - o

(これが実際に持っているものではないことを強調するために、ここではブランチ ラベルを省略しました)。


ドット ドット表記では、「 から到達可能なコミットから、 から到達可能なコミットを差し引いたものA..B」が求められます。グラフは次のようになります (上記のいくつかと同じですが、わかりやすくするためにここで繰り返します)。BA

...- o ----- *   <-- HEAD=A
      \
       o - o     <-- B

下部セクションに沿った2 つのコミットは、上部およびそれ以前のコミットとともにoから到達可能です。ただし、マークされたコミットから開始して逆方向に作業することにより、上位およびそれ以前のコミットに到達できるため、これらは除外されます。これにより、 branch の先端にあるコミットとその前にあるコミットの 2 つだけが残ります。BooA*oB

実際のマージを行った場合A..B、ブランチの先端から到達可能なすべてのコミットはブランチの先端Bからも到達可能であるため、空になることに注意してくださいA。(そして、対照的に、そのコミットは からではなく から到達可能であるため、B..A単なるコミットになります。しかし、これは no-actual-merge スカッシュのみの履歴にも当てはまります。)*AB

于 2014-09-24T07:00:15.500 に答える