0

今日は git の奇妙な動作がありました。これが正常かどうかを尋ねたいと思います。さて、これが状況です(新しいコミットは一番下に追加されます):

br1  br2
  A
    \ 
     B
     C
     D

さて、作るときは

git checkout br1
git merge --no-ff br2

こうなります(上から下まで読んでください。最新のコミットは「E」です)

br1  br2
  A
  | \ 
  |  B
  |  C
  |  D
  | /
  E

わかりました.. さて、奇妙なことは; 今は「git status」と呼んでいます。リモートブランチより4コミット進んでいると表示されます。これはどのように起こっていますか?私はコミットを1つだけ先にするべきではありませんか?

そして奇妙なことに、スタッシュ (基本的には Git Web UI) からチェックすると、この「4 つのコミット」ステータスが確認され、「br1」と「br2」の両方の下に同じコミット (BC と D) が表示されます。 .

「--no-ff」パラメーターを使用した場合、「br2」(BCD) のコミットは「br1」にコピーされず、マージコミットのみが作成されると想定しました。私はここで間違っていますか?

4

3 に答える 3

2

Git でブランチがどのように機能するかを誤解していると思います。ブランチは軽量です。つまり、新しいブランチを作成したり、あるブランチを別のブランチにマージしたりしても、何もコピーされません。

ブランチは、コミットを指す参照です。すべてのコミットは以前のコミットにリンクされているため、1 つのコミットを指すと、事実上そのコミットの履歴を指すことになります。

あなたの例では、2 つのブランチを結合して単一の履歴を作成するEマージ コミットです。これは、 にマージした後、(これは現在への参照です) は(これはまだへの参照です)の履歴について知っていることを意味します。これは、とが の履歴の一部であるためです。br2br1br1Ebr2DDCBE

ローカルbr1は への参照ですがE、リモートbr1は依然として への参照Aです。したがって、の歴史には新しいB4 つのコミット ( 、CDおよびE) があります。br1

于 2016-02-26T09:40:22.157 に答える