git rebase y git push: no avance rápido, ¿por qué usar?


Tengo una rama que debería estar disponible para otros colaboradores y que debería estar constantemente al día con el maestro.

Desafortunadamente, cada vez que hago 'git rebase' y luego intento empujar, resulta en un mensaje de 'no avance rápido' y el aborto de empujar. La única manera de presionar aquí es usar force la fuerza. ¿Significa eso que debería usar 'git merge' en lugar de rebasing si mi rama se hizo pública y otros están trabajando en ella?

Author: snitko, 2009-02-18

2 answers

Algunas notas sobre cómo funciona git (no técnico):

Cuando rebases, git toma las confirmaciones en cuestión, y las "vuelve a comprometer" encima de un historial limpio. Esto es para evitar que la historia muestre:

Description: tree -> mywork -> merge -> mywork -> merge -> mywork -> merge
Commit SHA1: aaaa -> bbbb   -> cccc  -> dddd   -> eeee  -> ffff   -> gggg

Después de un rebase, puede verse así (o similar):

Description: tree -> rebase
Commit SHA1: aaaa -> hhhh

El problema es que la nueva confirmación que está intentando enviar es NO un descendiente de la confirmación en la punta de la rama a la que está enviando.

Ahora, usted sabe que la misma información está en las confirmaciones, pero git es responsable no solo sobrescribiendo esas confirmaciones (bbbb-gggg en el ejemplo anterior).


Modelo de repositorio compartido

Si está utilizando un repositorio compartido, entonces cosas como esta pueden ser muy confusas. Déjame explicarte por qué. Digamos que otro desarrollador bajó la rama, y tienen commits aaaa -> gggg en su rama. Entonces hacen un commit iiii

Mientras tanto, usted rebasado y forzó un empujón, haciendo que el árbol se viera así:

Description: tree -> rebase
Commit SHA1: aaaa -> hhhh

Cuando el otro desarrollador intenta empujar, recibe un mensaje de "no avance rápido". Cuando hace una fusión, entonces ambas historias se vuelven a vincular, y terminas con un lío

Algo como esto (desordenado):

Description: tree -> rebase -> mywork -> merge -> mywork -> merge -> mywork -> merge -> devwork -> merge 
Commit SHA1: aaaa -> hhhh   -> bbbb   -> cccc  -> dddd   -> eeee  -> ffff   -> gggg -> iiii    -> jjjj

EN otras palabras, si otros están tirando Y empujando, es mejor que te quedes con git merge, o EVITA EMPUJAR hasta después del rebase (y solo rebase tu trabajo).


Modelo de Repositorio Públicamente Visible

Tal vez esté utilizando un modelo diferente (más gitano) donde solo desea que la gente pueda extraer de su repositorio. En este caso, git push force force no es tan malo, porque entonces pueden lidiar con mantenerse al día con él. Pueden rebase sus cambios para estar en la parte superior de sus cambios antes de darle sus parches a usted. Evita que tu repositorio se arruine.

Sin embargo, puede haber una mejor manera para ti. git push mirror mirror

Desde http://www.kernel.org/pub/software/scm/git/docs/git-push.html

En lugar de nombrar cada ref a push, especifica que todas las refs bajo $GIT_DIR/refs/ (que incluye, pero no limitado a refs / cabezas/, refs / remotes/, y refs/ tags/) be mirrored al repositorio remoto. Los árbitros locales recién creados serán empujado al extremo remoto, localmente refs actualizado será fuerza actualizada en el extremo remoto, y eliminado refs se se retira del extremo remoto. Este es el valor predeterminado si la configuración opción remota..el espejo está listo.


Una de las grandes cosas de git es que es muy flexible y permite muchos tipos diferentes de flujos de trabajo. Pero su verdadera fortaleza radica en el hecho de que es un modelo distribuido, por lo que creo que el mayor ROI se puede obtener al usarlo de esa manera.

 99
Author: gahooa,
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
2009-09-09 20:51:36

No, rebase es perfectamente legal con repositorios públicos e incluso puede ser deseable para mantener la historia fluida. Solo ten en cuenta que no debes usar rebase para reescribir el historial de confirmaciones publicadas de forma remota. Es decir, rebase solo se puede aplicar a sus propias confirmaciones locales que nunca ha publicado. Utilizas rebase para colocar tus commits encima de ellos cuando fetch y luego, quizás, ajustarlos allí. Otra razón por la que puede recibir este mensaje es que la rama que empujó fue actualizado y necesitas sincronizar -- fetch y rebase tus commits encima de lo que has buscado.

 2
Author: Val,
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
2013-01-11 10:37:40