tutorial often español changes and git git-pull

often - Diferencia entre git pull y git pull--rebase



git rebase tutorial (5)

A veces tenemos un canal ascendente que redistribuye / rebobina una rama de la que dependemos. Esto puede ser un gran problema, causando conflictos confusos para nosotros si estamos en una etapa posterior.

La magia es git pull --rebase

En términos generales, un impulso normal de git es algo así (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, podrías pensar que un git pull --rebase hace justamente esto:

git fetch origin git rebase origin/foo

Pero eso no ayudará si la rebase ascendente implicaba algún "aplastamiento" (lo que significa que los identificadores de parches 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í 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 sobre tu propio "foo":

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

Mientras tanto, en un ataque de furia antisocial, el mantenedor ascendente no solo ha rebasado su "foo", sino que incluso utilizó 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 resultaría en un caos. Incluso un git ir a buscar; git rebase origin / foo no lo cortaría, porque cometer "b" y "c" en un lado, y cometer "b + c" en el otro, entraría en conflicto. (Y de manera similar con d, e, yd + e).

Lo que hace git pull --rebase , 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)

Aún puede tener 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):
gitolite.com/git-pull--rebase

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

Por favor ayúdame a entender la diferencia.


En el caso más simple de no colisiones.

  • con rebase: rebasa sus confirmaciones locales en la parte superior del HEAD remoto y no crea una confirmación de combinación / fusión
  • sin / normal: fusiona y crea un commit de mezcla

Ver también:

man git-pull

Más precisamente, git pull ejecuta git fetch con los parámetros dados y llama a git merge para combinar los cabezales de rama recuperados en la rama actual. Con --rebase, ejecuta git rebase en lugar de git merge.

Ver también:
¿Cuándo debo usar git pull --rebase?
http://git-scm.com/book/en/Git-Branching-Rebasing


Para esto es importante entender la diferencia entre Merge y Rebase.

Las rebases son cómo los cambios deberían pasar de la parte superior de la jerarquía hacia abajo y las combinaciones son la forma en que fluyen hacia arriba

Para más detalles, consulte: http://www.derekgourlay.com/archives/428


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


git pull = git fetch + git merge con el seguimiento de la rama en sentido ascendente

git pull --rebase = git fetch + git rebase contra el seguimiento de la rama en sentido ascendente

Si quieres saber cómo difieren git merge y git rebase , lee esto .