2012-04-27 57 views
6

¿Alguien podría explicar esto teniendo en cuenta incluso los repositorios remotos en mente?Diferencia entre git pull --rebase, git rebase y git merge

+1

No hay 'git commit --rebase'; ¿quisiste decir 'git pull --rebase'? O bien, 'git svn dcommit --no-rebase'? (se perdió la etiqueta git-svn al principio) – torek

+0

gracias por señalar el error ... ¡He actualizado la pregunta! –

Respuesta

7

git pull --rebase es el camino a seguir cuando desee actualizar su rama de desarrollo: esas ramas no suelen publicarse para otros (excepto tal vez para echarle un vistazo) así que reescribir la historia no es un problema y usted realmente no quiero fusiones, etc. en tal rama.

git merge realiza una fusión; ver la página de manual para más detalles - el comando tiene toneladas de opciones que serían demasiado para explicar aquí.

git rebase realiza una rebase, es decir, reescribe la historia. Llevará sus confirmaciones hasta el punto en que divergen de la otra rama, las eliminará temporalmente, aplicará las confirmaciones faltantes de la otra rama y luego volverá a aplicar sus compromisos. git rebase también tiene un modo interactivo donde puede eliminar/modificar/combinar (aplastar) ciertos commits.

Eche un vistazo a http://learn.github.com/p/rebasing.html para obtener buenos gráficos sobre cómo funcionan las rebases.

+0

Nota: git 2.8 (marzo de 2016) permitirá un 'git pull --rebase = comando interactivo'. Ver http://stackoverflow.com/a/29717607/6309. – VonC

6

git rebase le permite separar una rama del punto donde ha divergido, y volver a enchufarla en la parte superior de la otra rama. git merge, en cambio, simplemente fusiona los cambios desde otra rama en la rama actual, sin volver a conectar el historial.

Si no hay conflictos, el resultado es idéntico entre la fusión y rebase, pero la historia es diferente:

(merge branch on master): 
master --A--B--C--E 
       /
branch   --D 

(rebase branch onto master): 
master  --A--B--C--D' 

En primer caso la fusión crea la rama branch se combina en master, lo que lleva a la creación de un commit de fusión, E. En el segundo caso, D simplemente se vuelve a enchufar en master, creando ante commit, D'.

git pull --rebase buscará los cambios desde un control remoto, y rebase (vuelva a enchufar) los cambios en la parte superior. Literalmente registrará los cambios que realizó que no están en el control remoto y los reproducirá a partir del último cambio que acaba de realizar.