2011-12-14 12 views
7

Sto cercando di capire perché rebase richiede un'unione a tre. Per esempio, se abbiamoPerché git rebase richiede un'unione a 3 vie?

A1 - A2 
\ 
    B1 

E ho controllato B1, e voglio realizzare:

git rebase A2 

Perché git merge A2, B1 e A1? Perché A2 e B1 non basterebbero? Voglio dire, non A2 e B1 come commit contengono l'istantanea corrente completa dell'albero?

+1

grazie, è quello che stavo cercando di mostrare con la mia domanda. – worker1138

risposta

7

Per eseguire un'unione, Git ha bisogno di scoprire cosa è successo esattamente nei due rami dall'antenato comune (A1). Come hai detto correttamente, Git memorizza istantanee di commit/alberi in modo da ottenere un set di modifiche effettivo, deve confrontare A2 a A1 e B1 a A1 e quindi unire quelle serie di modifiche individuali.

La stessa cosa accade in un rebase. Per applicare il set di modifiche di A2 su B1, dobbiamo prima calcolare il set di modifiche dalle differenze tra A1 e A2. E poi possiamo applicarlo a B1. Puoi pensare a un rebase come qualcosa di simile a una generazione automatica di file di patch. Per prima cosa genera tutti quei file di patch dal vecchio ramo e li applica quindi al corrente HEAD.

Quindi, abbiamo bisogno di tutti quei tre commit per calcolare effettivamente le differenze, in quanto non possiamo capire cosa è successo in un commit solo guardando quel commit.

+0

grazie, è molto sensato. – worker1138