Git - ¿es pull o rebase cuando trabajas en sucursales con otras personas?

Entonces, si estoy usando ramas que son sucursales remotas (rastreadas), y quiero obtener lo último, todavía no estoy seguro de si debería estar haciendo git pull o git rebase . Pensé que había leído que al hacer git rebase cuando trabajaba en una sucursal con otros usuarios, puede estropearlos cuando lo extraen o rebase. ¿Es eso cierto? ¿Deberíamos todos estar usando git pull ?

0
agregado editado
Puntos de vista: 1

5 Respuestas

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 los cambios de rama, sin embargo, la rama se ramificará desde el maestro ubicación, en lugar de desde donde anteriormente se ramificó.

0
agregado

Git rebase es una re-escritura del historial. 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 software de embalaje 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.

0
agregado
En resumen, no rebase las confirmaciones que vivan en otros repositorios.
agregado el autor Ikke, fuente
El problema es si alguien más tira de una rama que luego rebase. Está bien si selecciono desde A en local y luego rebase local , y alguien más extrae desde A . No está bien si selecciono desde A , otra persona extrae de local , luego rebase local .
agregado el autor Cameron Skinner, fuente
¿Es esto cierto, @Pat? En el caso de una extracción --rebase, ¿no estás reordenando tus compromisos locales para estar al tanto de lo que sacaste? Dado que se trata de confirmaciones locales, y aún no se publicaron, ¿cómo van a romper a alguien que intenta tirar después de que tire --rebase 'ed?
agregado el autor Gabe Hollombe, fuente

git pull does a merge if you've got commits that aren't in the remote branch. git rebase rewrites any existing commits you have to be relative to the tip of the remote branch. They're similar in that they can both cause conflicts, but I think using git rebase if you can allows for smoother collaboration. During the rebase operation you can refine your commits so they look like they were newly applied to the latest revision of the remote branch. A merge is perhaps more appropriate for longer development cycles on a branch that have more history.

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.

0
agregado

Git pull es una combinación de 2 comandos

  • git fetch (sincroniza su repositorio local con las cosas más nuevas en el control remoto)
  • git merge (fusiona los cambios de la rama distante, si corresponde) 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 espaguetis.

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 commit
  • vuelve a ser maestro
  • 'git merge mybranch', que solo avanza rápidamente cuando todo en master también está 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 sean triviales (por ejemplo, personas que trabajan en archivos diferentes o al menos en 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 fusiones. 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!

0
agregado
Me parece que deberías haber dicho: 'git fusionar mybranch', que solo avanza rápidamente cuando todo en master también está en mybranch (evitando así el problema de reordenamiento de commit en una rama pública)
agregado el autor Bruno Bronosky, fuente
'git rebase mybranch' definitivamente debería leer 'git merge mybranch'.
agregado el autor James H, fuente

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

0
agregado