2010-04-26 15 views

Respuesta

71

El ProGit book tiene un good explanation.

La respuesta específica a su pregunta se puede encontrar en la sección titulada "Los peligros de rebasar". Una cita de esa sección:

Cuando se rebase cosas, estás abandonando compromete existentes y crear otros nuevos que son similares pero diferente. Si se presiona compromete en alguna parte y otros les tire hacia abajo y la base de trabajar en ellos, y luego se reescribir esas confirmaciones con git rebase y empuje hacia arriba de nuevo, sus colaboradores tendrán que volver a fusionar su trabajo y las cosas desordenar cuando intente recuperar su trabajo en el suyo.

Actualización:
Basado en su comentario a continuación, parece que su tiene problemas con el flujo de trabajo de Git. Aquí hay algunas referencias que pueden ayudar:

+0

Gracias por la explicación. Entonces, solo para aclarar mi entendimiento, después de presionar ciertos cambios, no debería usar 'git rebase' (--interactive?) Para reescribir ese historial, esta es la receta segura de falla. Por otro lado, si tengo una base de datos ciertos cambios en la rama de tema (desde la rama X) y empujarlo, es perfectamente normal volver a establecer la base una vez que otro desarrollador haya cambiado de tema. Esencialmente, he estado usando 'merge' durante bastante tiempo, pero estamos en el mismo barco que, http://darwinweb.net/articles/86 y el historial es casi inutilizable. –

+0

@Hemant: Reasignación de compromisos después de presionar a un repositorio público generalmente es una mala idea. Dicho esto, el consejo del artículo de darwinweb que usted citó parece razonable si su flujo de trabajo se parece al de ellos. Vea mi respuesta actualizada para obtener una lista de otras referencias que podrían ayudar. –

+0

Actualice un enlace a la página "ProGit" sobre "Equipo administrado privado" a http://git-scm.com/book/es/Distributed-Git-Contributing-to-a-Project#Private-Small-Team – Eimantas

5

Una rebase altera el historial de su repositorio. Si push se compromete con el mundo, es decir, los pone a disposición de los demás y luego cambia la vista del historial de confirmaciones, se vuelve difícil trabajar con cualquiera que tenga su historial anterior.

Rebase considered harmful es una buena visión general, creo.

64

Rebasing reescribe el historial. Si nadie sabe acerca de esa historia, entonces eso está perfectamente bien. Sin embargo, si esa historia se conoce públicamente, entonces la reescritura de la historia en Git funciona del mismo modo que en el mundo real: se necesita una conspiración.

Las conspiraciones son realmente difícil de mantener juntas, por lo que es mejor evitar volver a basar las ramas públicas en primer lugar.

Tenga en cuenta que no son ejemplos de éxito conspiraciones: la rama pu del repositorio git de Junio ​​Hamano C. (el repositorio Git oficial del SMC) se reajusta con frecuencia. La forma en que esto funciona es que casi todo el mundo que usa pu también está suscrito a la lista de distribución de desarrolladores de Git, y el hecho de que la rama pu se haya actualizado es ampliamente publicitada en la lista de correo y el sitio web de Git.

+4

+1. Creo que la rama 'pu' de git.git es un ejemplo extremadamente útil de cómo usar rebase en un flujo de trabajo (público). Para aquellos que no estén familiarizados con él, la idea general es volver a establecer las bifurcaciones de tema que no tienen ningún commit en 'next' (la rama inestable justo antes de fusionarse con master), luego reconstruir la rama' pu' volviendo a 'siguiente' y fusionando todas las ramas temáticas. (Fuente: Documentation/howto/maintain-git.txt http://git.kernel.org/?p=git/git.git;a=blob;f=Documentation/howto/maintain-git.txt;h=d527b307707c676e82a08f18cb9fdd7d3abcb228 ; hb = HEAD) – Cascabel

+25

+1 para "reescribir la historia en Git funciona igual que en el mundo real: necesitas una conspiración" –

+0

"No es necesario un anuncio público ya que pu es una rama desechable, como se describió anteriormente " https://git-scm.com/docs/gitworkflows Hacemos algo similar en el trabajo, "TEMP-algo-lo último" es una rama descartable que es una combinación de los últimos cambios, podría ser una fusión de múltiples ramas de características , se puede eliminar y volver a crear en cualquier momento y no se debe desarrollar. – pilkch

212

Para entender esto, tenemos que entender un poco acerca de cómo funciona git. Un repositorio git es una estructura de árbol, donde los nodos del árbol son commits.Aquí hay un ejemplo de un repositorio muy simple: When you fork

tiene cuatro confirmaciones en la rama maestra, y cada confirmación tiene una ID (en este caso, a, b, c y d). Notarás que d es actualmente la última confirmación (o HEAD) de la rama principal. enter image description here

Aquí, tenemos dos ramas: master y my-branch. Puede ver que tanto master como my-branch contienen commits ayb, pero luego comienzan a divergir: master contiene c y d, mientras que my-branch contiene e y f. Se dice que b es la "base de fusión" de mi rama en comparación con el maestro, o más comúnmente, solo la "base". Tiene sentido: se puede ver que my-branch se basó en una versión anterior de master.

Digamos que my-branch se ha quedado obsoleto y desea actualizarlo con la última versión de master. Para decirlo de otra manera, my-branch necesita contener cyd. Podría hacer una combinación, pero eso hace que la rama contenga confusiones de fusión extrañas que hacen que revisar la solicitud de extracción sea mucho más difícil. En cambio, puedes hacer una rebase.

enter image description here

Cuando se rebase, git encuentra la base de su rama (en este caso, b), encuentra todas las confirmaciones que entre la base y la altura (en este caso, E y F), y volver a reproduce esas confirmaciones en la CABEZA de la rama sobre la que está refinanciando (en este caso, maestro). Git en realidad crea nuevas confirmaciones que representan cómo se verán sus cambios en la parte superior del maestro: en el diagrama, estas confirmaciones se llaman e 'y f'. Git no borra tus confirmaciones anteriores: e y f no se tocan, y si algo sale mal con la rebase, puedes volver a la forma en que solían ser las cosas.

Cuando muchas personas diferentes trabajan en un proyecto de forma simulada, las solicitudes de extracción pueden quedar obsoletas rápidamente. Una solicitud de extracción "obsoleta" es aquella que ya no está actualizada con la línea principal de desarrollo, y debe actualizarse antes de que pueda fusionarse en el proyecto. La razón más común por la cual las solicitudes de extracción se vuelven obsoletas es debido a conflictos: si dos solicitudes de extracción modifican líneas similares en el mismo archivo, y una solicitud de extracción se fusiona, la solicitud de extracción no compartida ahora tendrá un conflicto. A veces, una solicitud de extracción puede quedar obsoleta sin conflictos: quizás los cambios en un archivo diferente en la base de código requieran cambios correspondientes en su solicitud de extracción para ajustarse a la nueva arquitectura, o tal vez la rama se creó cuando alguien accidentalmente fusionó las pruebas de unidad rama principal Independientemente de la razón, si su solicitud de extracción se ha quedado obsoleta, tendrá que volver a establecer la base de su rama en la última versión de la rama maestra antes de que pueda fusionarse.

Cuestiones relacionadas