2010-07-28 26 views
257

Another question dijo git pull es como git fetch + git merge.git pull VS git fetch git rebase

Pero, ¿cuál es la diferencia entre git pull VS git fetch + git rebase?

+2

alguien debería limpiar el enlace ... y estoy sorprendido de cuántos votos obtuvo esa otra pregunta. – xenoterracide

+11

@xeno: Creo que es solo un conteo de cuántas personas dicen "Tuve esta pregunta también" – bobobobo

+34

Algún día " Encontraré tiempo para leer realmente la documentación de git, pero hasta entonces, estoy agregando mis votos a este tipo de preguntas. –

Respuesta

292

Debería ser bastante obvio por su pregunta que en realidad solo está preguntando sobre la diferencia entre git merge y git rebase.

Supongamos que está en el caso común: ha trabajado en su rama principal, y la ha extraído de la de origen, lo que también le ha costado trabajo. Después de la búsqueda, las cosas se ven de esta manera:

- o - o - o - H - A - B - C (master) 
       \ 
       P - Q - R (origin/master) 

Si fusiona en este punto (el comportamiento predeterminado de git pull), suponiendo que no hay ningún conflicto, se termina con esto:

- o - o - o - H - A - B - C - X (master) 
       \   /
       P - Q - R --- (origin/master) 

Si por el contrario lo hizo el rebase caso, se le iba a terminar con esto:

- o - o - o - H - P - Q - R - A' - B' - C' (master) 
          | 
          (origin/master) 

el contenido de su árbol de trabajo debe llegar a la misma en ambos casos; acabas de crear una historia diferente previa a ella. La rebase reescribe su historial, haciendo que parezca como si se hubiera comprometido encima de la nueva rama maestra de origen (R), en lugar de donde se comprometió originalmente (H). Nunca debe usar el enfoque de rebase si alguien más ya ha sacado de su rama principal.

Finalmente, tenga en cuenta que puede configurar realmente git pull para que una rama determinada use rebase en lugar de fusionar estableciendo el parámetro de configuración branch.<name>.rebase en verdadero. También puede hacer esto para una sola extracción usando git pull --rebase.

+37

Wha ¿Sucede si tuvieras que volver a establecer la base después de que alguien ya haya sacado de tu sucursal principal? ¿Eso rompería el repo? –

+11

¿Cómo sabes si alguien ha sacado de tu sucursal principal? – Frank

+27

Si no está seguro de que alguien * no lo haya hecho *, debe suponer que sí. –

0

En respuesta a su primera afirmación 'git pull es como un git fetch + git merge.',

"En su modo predeterminado, git pull es la abreviatura de git fetch seguido por git fusionar FETCH_HEAD" Más precisamente, git pull corre git fetch con los parámetros dados y llama git merge para combinar el recuperada rama cabezas en la rama actual"

(Ref: https://git-scm.com/docs/git-pull)


Para su segunda declaración/pregunta: 'Pero ¿cuál es la diferencia entre git pull VS git fetch + git rebase' Una vez más, desde el mismo origen:

"Con --rebase, se ejecuta git rebase en lugar de git merge."


Ahora, si desea pedir a la diferencia entre ir a buscar y combinar, que se contesta aquí también: https://git-scm.com/book/en/v2/Git-Branching-Rebasing (la diferencia entre la alteración se registra el historial de versiones manera y lo que no)