A veces tenemos un flujo ascendente que rebase / rebobina una rama de la que dependemos. Esto puede ser un gran problema, ya que nos genera conflictos desordenados si estamos aguas abajo.
La magia es git pull --rebase
Un git pull normal es, en términos generales, algo como esto (usaremos un origen remoto llamado 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, puede pensar que un git pull --rebase hace exactamente esto:
git fetch origin
git rebase origin/foo
Pero eso no ayudará si el rebase ascendente involucró algún "aplastamiento" (lo que significa que los identificadores de parche de los commits cambiaron, no solo su orden).
Lo que significa git pull --rebase tiene que hacer un poco más que eso. Aquí hay una explicación de lo que 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 hecho algunas confirmaciones además de tu propio "foo":
a---b---c---d---e---p---q---r (foo)
Mientras tanto, en un ataque de rabia antisocial, el mantenedor corriente arriba no solo ha rebajado su "foo", sino que incluso usó una calabaza o dos. Su cadena de compromiso ahora se ve así:
a---b+c---d+e---f (origin/foo)
Un tirón git en este punto daría lugar al caos. Incluso una git fetch; git rebase origin / foo no lo cortaría, porque comete "b" y "c" por un lado, y comete "b + c" por el otro, entraría en conflicto. (Y de manera similar con d, e, y d + e).
Lo git pull --rebase
que, en este caso, es:
git fetch origin
git rebase --onto origin/foo e foo
Esto te da: