tutorial - Git-¿es pull o rebase cuando trabajas en sucursales con otras personas?
git-- amend (5)
Git rebase
es una re-escritura de la historia. Nunca debe hacer esto en sucursales que son "públicas" (es decir, sucursales que comparte con otros). Si alguien clona su sucursal y luego vuelve a establecer la base de esa sucursal, entonces ya no podrá extraer / fusionar los cambios de su sucursal, tendrá que tirar la anterior y volver a tirar.
Este artículo sobre el software de empaquetado con git es una lectura muy útil. Se trata más de gestionar las distribuciones de software, pero es bastante técnico y habla de cómo se pueden usar / administrar / compartir las sucursales. Hablan sobre cuándo volver a establecer la base y cuándo extraer, y cuáles son las diversas consecuencias de cada una.
En resumen, ambos tienen su lugar, pero debes asimilar realmente la diferencia.
Entonces, si estoy usando ramas que son ramas remotas (rastreadas), y quiero obtener lo último, todavía no estoy git rebase
si debería estar haciendo git pull
o git rebase
. Pensé que había leído que haciendo git rebase
cuando trabajaba en una sucursal con otros usuarios, puede arruinarlos cuando lo extraen o lo vuelven a ajustar. ¿Es eso cierto? ¿Deberíamos todos estar usando git pull
?
Si desea extraer la fuente sin afectar ramas remotas y sin ningún cambio en su copia local, es mejor usar git pull.
Creo que si tienes una rama activa en la que hayas realizado cambios, usa git rebase para cambiar la base de esa rama para que sea la última maestra remota, mantendrás todos tus cambios de rama, sin embargo, la rama se ramificará desde el maestro ubicación, en lugar de desde donde anteriormente se ramificó.
git pull
realiza una combinación si tienes confirmaciones que no están en la rama remota. git rebase
reescribe las confirmaciones existentes que tiene que ser relativas a la punta de la rama remota. Son similares en que ambos pueden causar conflictos, pero creo que usar git rebase
si puedes permite una colaboración más fluida. Durante la operación de rebase puede refinar sus confirmaciones para que se vean como si se hubieran aplicado recientemente a la última revisión de la rama remota. Una combinación es quizás más apropiada para ciclos de desarrollo más largos en una rama que tiene más historial.
Al igual que la mayoría de las otras cosas en git, hay una gran cantidad de funcionalidades que se superponen para adaptarse a diferentes estilos de trabajo.
Echa un vistazo a los excelentes episodios de Gitcasts sobre la ramificación y la fusión , así como el rebase .
Git pull es una combinación de 2 comandos
- fetch git (sincroniza su repositorio local con las cosas más nuevas en el control remoto)
- git merge (fusiona los cambios de la rama distante, si hay alguno, en su rama de seguimiento local)
git rebase es solo un equivalente aproximado a git merge. No capta nada de forma remota. De hecho, tampoco realiza una combinación adecuada, sino que reproduce las confirmaciones de la rama en la que se encuentra después de las nuevas confirmaciones de una segunda rama.
Su objetivo es principalmente permitirle tener un historial más limpio. Muchas personas no necesitan muchas fusiones antes de que la historia pasada en gitk se vuelva terriblemente parecida a un espagueti.
La mejor explicación gráfica se puede ver en los primeros 2 gráficos aquí . Pero déjame explicarte aquí con un ejemplo.
Tengo 2 ramas: master y mybranch. Cuando estás en mybranch puedo correr
git rebase master
y obtendré algo nuevo en el maestro insertado antes de mis confirmaciones más recientes en mybranch. Esto es perfecto, porque si ahora fusiono 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 ocurre si rebase en la dirección "incorrecta". Si acabo de obtener el máster maestro (con nuevos cambios) y desde el maestro, rebase así (antes de sincronizar mi rama):
git rebase mybranch
Ahora lo que acabo de hacer es que inserté mis nuevos cambios en algún lugar del pasado del maestro. La línea principal de confirmaciones ha cambiado. Y debido a la forma en que git funciona con los identificadores de commit, todos los commits (desde el máster) que se repitieron sobre mis nuevos cambios tienen nuevos ids.
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 del maestro en mi historial de confirmaciones
- volver a dominar
- ''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 usar rebase cuando las diferencias son triviales (por ejemplo, personas que trabajan en archivos diferentes o al menos líneas diferentes). Tiene el gotcha que traté de explicar justo arriba, pero hace una historia mucho más limpia.
Tan pronto como haya conflictos importantes (por ejemplo, un compañero de trabajo ha renombrado algo en un grupo de archivos), recomiendo fusión. En este caso, se te pedirá que resuelvas el conflicto y luego confirmes la resolución. En el lado positivo, una fusión es mucho más fácil de resolver cuando hay conflictos. El inconveniente es que su historia puede ser difícil de seguir si mucha gente se fusiona todo el tiempo :-)
¡Buena suerte!