Pregunta ¿Cuándo debería usar git pull --rebase?


Sé de algunas personas que usan git pull --rebase por defecto y otros que insisten en nunca usarlo. Creo que entiendo la diferencia entre fusión y rebase, pero trato de poner esto en el contexto de git pull. ¿Se trata simplemente de no querer ver muchos mensajes de compromiso de fusión, o hay otros problemas?


633
2018-03-18 18:04


origen


Respuestas:


Deberías usar git pull --rebase cuando

  • sus cambios no se merecen una rama separada

De hecho, ¿por qué no entonces? Es más claro, y no impone un agrupación lógica en tus compromisos.


Ok, supongo que necesita alguna aclaración. En Git, como probablemente sabrás, te animamos a que se ramifique y se fusione. Su sucursal local, en la que realiza los cambios, y la sucursal remota son, en realidad, sucursales diferentes, y git pull se trata de fusionarlos. Es razonable, ya que no realiza muchas transferencias y suele acumular una serie de cambios antes de que constituyan una función completa.

Sin embargo, a veces, por cualquier razón, piensas que en realidad sería mejor si estos dos, remotos y locales, fueran uno rama. Como en SVN. Es aquí donde git pull --rebase entra en juego. Ya no se fusiona, en realidad comprometerse en la parte superior de la rama remota. De eso se trata en realidad.

Si es peligroso o no, la cuestión de si se está tratando a las sucursales locales y remotas es algo inseparable. A veces es razonable (cuando los cambios son pequeños o si se encuentra al comienzo de un desarrollo sólido, cuando los pequeños cambios generan cambios importantes). A veces no lo es (cuando normalmente crearías otra rama, pero eras demasiado perezoso para hacerlo). Pero esa es una pregunta diferente.


448
2018-03-18 19:01



Me gustaría proporcionar una perspectiva diferente sobre lo que realmente significa "git pull - rebase", porque parece perderse a veces.

Si alguna vez ha usado Subversion (o CVS), puede estar acostumbrado al comportamiento de "svn update". Si tiene cambios para confirmar y la confirmación falla porque los cambios se han realizado en sentido ascendente, puede "actualizar svn". Subversion procede al fusionar los cambios iniciales con los suyos, lo que puede generar conflictos.

Lo que Subversion acaba de hacer, fue esencialmente "pull --rebase". El acto de volver a formular los cambios locales para que sean relativos a la versión más nueva es la parte de "rebase". Si ha hecho "svn diff" antes del intento de compromiso fallido, y luego compara la diferencia resultante con la salida de "svn diff", la diferencia entre las dos diferencias es lo que hizo la operación de rebase.

La principal diferencia entre Git y Subversion en este caso es que en Subversion, "tus" cambios solo existen como cambios no comprometidos en tu copia de trabajo, mientras que en Git tienes confirmaciones reales a nivel local. En otras palabras, en Git has bifurcado la historia; su historia y la historia original divergieron, pero tiene un ancestro común.

En mi opinión, en el caso normal de que su sucursal local simplemente refleje la rama ascendente y haga un desarrollo continuo de ella, lo correcto es siempre "--rebase", porque eso es lo que está semánticamente en realidad obra. Usted y otros están pirateando la historia lineal deseada de una sucursal. El hecho de que alguien más presionó levemente antes de intentar empujar es irrelevante, y parece contraproducente que cada accidente de tiempo resulte en fusiones en la historia.

Si realmente sientes la necesidad de que algo sea una sucursal por cualquier razón, esa es una preocupación diferente en mi opinión. Pero a menos que tenga un deseo específico y activo de representar sus cambios en forma de fusión, el comportamiento predeterminado debería ser, en mi opinión, "git pull --rebase".

Considere a otras personas que necesitan observar y comprender la historia de su proyecto. ¿Desea que la historia esté plagada de cientos de fusiones por todas partes, o solo desea unas pocas fusiones que representan fusiones reales de intencionales esfuerzos de desarrollo divergentes?


608
2018-01-13 00:15



Creo que deberías usar git pull --rebase cuando colaboras con otros en la misma rama. Usted está en su trabajo → comprometer → trabajar → comprometer ciclo, y cuando decide impulsar su trabajo su impulso es rechazado, porque ha habido trabajo paralelo en la misma rama. En este punto yo siempre haz una pull --rebase. No uso squash (para aplanar commits), pero rebase para evitar las confusiones de fusión adicionales.

A medida que tu conocimiento de Git aumenta, te ves buscando mucho más en la historia que con cualquier otro sistema de control de versiones que he usado. Si tienes un montón de pequeños compromisos de fusión, es fácil perder el enfoque de la imagen más grande que está sucediendo en tu historia.

En realidad, este es el único momento en que realizo el rebase (*), y el resto de mi flujo de trabajo se basa en fusión. Pero mientras sus committers más frecuentes lo hagan, la historia se ve mucho mejor al final.

(*) Mientras enseñaba un curso de Git, hice que un estudiante me arrestara por esto, ya que también abogaba por cambiar las ramas de características en ciertas circunstancias. Y él había leído esta respuesta;) Tal rebase también es posible, pero siempre tiene que ser de acuerdo con un sistema preestablecido / acordado, y como tal no debe aplicarse "siempre". Y en ese momento generalmente no hago pull --rebase tampoco, de lo que se trata la pregunta;)


125
2018-03-18 19:00



Quizás la mejor manera de explicarlo es con un ejemplo:

  1. Alice crea la rama de tema A, y trabaja en ella
  2. Bob crea una rama de tema B no relacionada y trabaja en ella
  3. Alice lo hace git checkout master && git pull. Master ya está actualizado.
  4. Bob lo hace git checkout master && git pull. Master ya está actualizado.
  5. Alice lo hace git merge topic-branch-A
  6. Bob lo hace git merge topic-branch-B
  7. Bob lo hace git push origin master antes de Alicia
  8. Alice lo hace git push origin master, que se rechaza porque no se trata de una fusión de avance rápido.
  9. Alice mira el registro de origen / maestro, y ve que el compromiso no está relacionado con el de ella.
  10. Alice lo hace git pull --rebase origin master
  11. La confirmación de fusión de Alicia se desenrolla, se tira de la confirmación de Bob y la confirmación de Alicia se aplica después de la confirmación de Bob.
  12. Alice lo hace git push origin master, y todos están felices de que no tengan que leer una confesión de fusión inútil cuando miran los registros en el futuro.

Tenga en cuenta que la rama específica que se fusiona es irrelevante para el ejemplo. El maestro en este ejemplo podría fácilmente ser una rama de publicación o una rama de desarrollo. El punto clave es que Alice & Bob están fusionando simultáneamente sus sucursales locales en una rama remota compartida.


113
2018-02-12 08:02



No creo que haya alguna vez una razón no usar pull --rebase - Agregué código a Git específicamente para permitir mi git pull comando para siempre volver a establecer la base contra confirmaciones ascendentes.

Al mirar a través de la historia, nunca es interesante saber cuándo el chico / chica que trabaja en la función se detuvo para sincronizarse. Puede ser útil para el chico / chica mientras lo hace, pero eso es lo que reflog es para. Simplemente está agregando ruido para todos los demás.


39
2018-03-19 08:34



Solo recuerda:

  • pull = fetch + merge
  • pull --rebase = fetch + rebase

Por lo tanto, elija la forma en que desea manejar su sucursal.

Será mejor que conozcas la diferencia entre merge y rebase :)


15
2017-07-08 03:26



Creo que se reduce a una preferencia personal.

¿Quieres ocultar tus tontos errores antes de impulsar tus cambios? Si es así, git pull --rebase es perfecto. Te permite aplastar tus commits a unos pocos (o uno) commits. Si se fusiona en su historial (no solicitado), no es tan fácil hacer una git rebase luego uno.

Personalmente, no me importa publicar todos mis errores tontos, por lo que tiendo a fusionar en lugar de rebase.


6
2018-03-18 18:19



git pull --rebase puede ocultar una reescritura de la historia de un colaborador git push --force. Recomiendo usar git pull --rebase  solamente si sabes que olvidaste empujar tus commits antes que alguien más haga lo mismo.

Si no comprometiste nada, pero tu espacio de trabajo no está limpio, solo git stash antes de git pull. De esta forma, no volverá a escribir silenciosamente su historial (lo que podría reducir en silencio parte de su trabajo).


4
2018-06-19 11:42