Diferencia entre git pull y git pull --rebase
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 pull
y git pull --rebase
, ya que agregar la --rebase
opción no parece hacer algo muy diferente: solo hace un tirón.
Por favor ayúdame a entender la diferencia.
git pull
= git fetch
+ git merge
contra el seguimiento de la rama ascendente
git pull --rebase
= git fetch
+ git rebase
contra el seguimiento de la rama ascendente
Si quieres saber en qué git merge
se git rebase
diferencian, lee esto .
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 es
git 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 --rebase
significa, 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
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