Git - es tirar o rebase cuando se trabaja en ramas con otras personas


Así que si estoy usando ramas que son ramas remotas (rastreadas), y quiero obtener la última, todavía no estoy claro si debería estar haciendo git pull o git rebase. Pensé que había leído que hacer git rebase cuando se trabaja en una rama con otros usuarios, puede arruinarlos cuando tiran o rebase. Es eso cierto? ¿Todos deberíamos usar git pull?

Author: lucapette, 2008-09-19

5 answers

Git pull es una combinación de 2 comandos

  • git fetch (sincroniza tu repositorio local con las cosas más recientes en el control remoto)
  • git merge (fusiona los cambios de la rama distante, si los hay, en tu rama de seguimiento local)

Git rebase es solo un equivalente aproximado a git merge. No trae nada ni remotamente. De hecho, tampoco hace una combinación adecuada, repite las confirmaciones de la rama en la que estás parado después de las nuevas confirmaciones de una segunda rama.

Su propósito es principalmente permitirle tener una historia más limpia. No se necesitan muchas fusiones de muchas personas antes de que la historia pasada en Gitk se vuelva terriblemente espagueti.

La mejor explicación gráfica se puede ver en los primeros 2 gráficos aquí. Pero permítanme explicar aquí con un ejemplo.

Tengo 2 ramas: maestro y mi rama. Cuando estoy de pie en mybranch puedo correr

git rebase master

Y obtendré cualquier cosa nueva en master insertada antes de mis confirmaciones más recientes en mybranch. Esto es perfecto, porque si ahora merge o rebase las cosas de mybranch en master, mis nuevas confirmaciones se agregan linealmente justo después de las confirmaciones más recientes.

El problema al que se refiere sucede si rebase en la dirección "incorrecta". Si acabo de obtener el maestro más reciente (con nuevos cambios) y desde el maestro rebase así (antes de sincronizar mi rama):

git rebase mybranch

Lo que acabo de hacer es insertar mis nuevos cambios en algún lugar del pasado del maestro. La línea principal de confirmaciones tiene cambiar. Y debido a la forma en que git trabaja con los commits id, todos los commits (de master) que se reprodujeron en mis nuevos cambios tienen nuevos id.

Bueno, es un poco difícil de explicar solo con palabras... Espero que esto tenga un poco de sentido: -)

De todos modos, mi propio flujo de trabajo es este:

  • ' git pull ' nuevos cambios desde el control remoto
  • cambiar a mybranch
  • 'git rebase master' para traer los nuevos cambios de master en mi historial de confirmaciones
  • volver a master
  • ' git merge mybranch', que solo avanza rápidamente cuando todo en master está también en mybranch (evitando así el problema de reordenamiento de commit en una rama pública)
  • 'git push'

Una última palabra. Recomiendo encarecidamente el uso de rebase cuando las diferencias son triviales (por ejemplo, personas que trabajan en diferentes archivos o al menos diferentes líneas). Tiene el gotcha que intenté explicar justo allí, pero hace para una historia mucho más limpia.

Tan pronto como pueda haber conflictos significativos (por ejemplo, un coworker ha cambiado el nombre de algo en un montón de archivos), recomiendo encarecidamente combinar. En este caso, se le pedirá que resuelva el conflicto y luego confirme la resolución. En el lado positivo, una fusión es mucho más fácil de resolver cuando hay conflictos. El lado negativo es que su historia puede ser difícil de seguir si mucha gente se fusiona todo el tiempo: -)

¡Buena suerte!

 48
Author: webmat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-08 02:39:21

Git rebase es una reescritura de la historia. Nunca debe hacer esto en ramas que son "públicas" (es decir, ramas que comparte con otros). Si alguien clona tu rama y luego rebases esa rama then entonces ya no pueden tirar/fusionar cambios de tu rama they tendrán que tirar su antigua y volver a tirar.

Este artículo sobre software de empaquetado con git es una lectura muy valiosa. Se trata más de administrar distribuciones de software, pero es bastante técnico y habla sobre cómo las ramas pueden ser usadas / administradas / compartidas. Hablan de cuándo rebase y cuándo tirar y cuáles son las diversas consecuencias de cada uno.

En resumen, ambos tienen su lugar, pero necesitas realmente grok la diferencia.

 10
Author: Pat Notz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 23:43:39

git pull hace una fusión si tienes confirmaciones que no están en la rama remota. git rebase reescribe cualquier confirmación existente que tenga que ser relativa a la punta de la rama remota. Son similares en que ambos pueden causar conflictos, pero creo que usar git rebase if you can permite una colaboración más fluida. Durante la operación de rebase, puede refinar sus confirmaciones para que parezcan que se aplicaron nuevamente a la última revisión de la rama remota. Una fusión es quizás más apropiada por más tiempo ciclos de desarrollo en una rama que tienen más historia.

Como la mayoría de las otras cosas en git, hay una gran cantidad de funciones superpuestas para acomodar diferentes estilos de trabajo.

 6
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 20:38:08

Echa un vistazo a los excelentes Gitcasts sobre Ramificación y fusión, así como rebasing.

 2
Author: webmat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-19 17:29:19

Si desea extraer el código fuente sin afectar a las ramas remotas y sin ningún cambio en su copia local, es mejor usar git pull.

Creo que si tienes una rama en funcionamiento en la que has realizado cambios, usa git rebase para cambiar la base de esa rama para que sea la última maestra remota, mantendrás todos los cambios de tu rama, sin embargo, la rama ahora se ramificará desde la ubicación maestra, en lugar de desde donde se ramificó anteriormente.

 0
Author: Lee H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 20:38:55