Diferencia entre git pull y git pull --rebase

Resuelto Rndm asked hace 10 años • 5 respuestas

Comencé a usar git hace algún tiempo y no entiendo completamente las complejidades. Mi pregunta básica aquí es descubrir la diferencia entre a git pully git pull --rebase, ya que agregar la --rebaseopción no parece hacer algo muy diferente: solo hace un tirón.

Por favor ayúdame a entender la diferencia.

Rndm avatar Sep 21 '13 15:09 Rndm
Aceptado

git pull= git fetch+ git mergecontra el seguimiento de la rama ascendente

git pull --rebase= git fetch+ git rebasecontra el seguimiento de la rama ascendente

Si quieres saber en qué git mergese git rebasediferencian, lee esto .

mvp avatar Sep 21 '2013 08:09 mvp

A veces tenemos un upstream que rebasó/rebobinó una rama de la que dependemos. Esto puede ser un gran problema, causándonos conflictos complicados si estamos río abajo.

la magia esgit pull --rebase

Un git pull normal es, en términos generales, algo como esto (usaremos un control remoto llamado origin y una rama llamada foo en todos estos ejemplos):

# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo

A primera vista, podrías pensar que git pull --rebase hace precisamente esto:

git fetch origin
git rebase origin/foo

Pero eso no ayudará si la rebase ascendente implicó alguna "aplastación" (lo que significa que los ID de parche de las confirmaciones cambiaron, no solo su orden).

Lo que significa que git pull --rebase tiene que hacer un poco más que eso. Aquí te explicamos qué hace y cómo.

Digamos que su punto de partida es este:

a---b---c---d---e  (origin/foo) (also your local "foo")

El tiempo pasa y has realizado algunas confirmaciones además de tu propio "foo":

a---b---c---d---e---p---q---r (foo)

Mientras tanto, en un ataque de ira antisocial, el mantenedor de aguas arriba no sólo rebasó su "foo", sino que incluso usó una calabaza o dos. Su cadena de confirmación ahora se ve así:

a---b+c---d+e---f  (origin/foo)

Un git pull en este punto resultaría en un caos. Incluso un git fetch; git rebase origin/foo no sería suficiente, porque las confirmaciones "b" y "c" por un lado, y la confirmación "b+c" por el otro, entrarían en conflicto. (Y de manera similar con d, e y d+e).

Lo que git pull --rebasesignifica, en este caso, es:

git fetch origin
git rebase --onto origin/foo e foo

Esto te da:

 a---b+c---d+e---f---p'---q'---r' (foo)

Es posible que aún tenga conflictos, pero serán conflictos genuinos (entre p/q/r y a/b+c/d+e/f), y no conflictos causados ​​por b/c en conflicto con b+c, etc.

Respuesta tomada de (y ligeramente modificada):
http://gitolite.com/git-pull--rebase

Mauri Lopez avatar Sep 21 '2013 08:09 Mauri Lopez

Supongamos que tiene dos confirmaciones en la sucursal local:

      D---E master
     /
A---B---C---F origin/master

Después de "git pull", será:

      D--------E  
     /          \
A---B---C---F----G   master, origin/master

Después de "git pull --rebase", no habrá ningún punto de fusión G. Tenga en cuenta que D y E se convierten en confirmaciones diferentes:

A---B---C---F---D'---E'   master, origin/master
Deqing avatar Jul 01 '2016 07:07 Deqing