tag - Reasignación de sucursales remotas en Git
git push tag (4)
Debido a que tiene una feature
actualizada en la parte superior del nuevo master
, su feature
local ya no es un avance rápido del origin/feature
. Así que, creo, está perfectamente bien en este caso anular la verificación de avance rápido haciendo la git push origin +feature
. También puedes especificar esto en tu configuración
git config remote.origin.push +refs/heads/feature:refs/heads/feature
Si otras personas trabajan en la parte superior del origin/feature
, se verán perturbados por esta actualización forzada. Puede evitar eso fusionándose en el nuevo master
en feature
en lugar de rebase. El resultado será de hecho un avance rápido.
Estoy usando un repositorio intermedio de Git para duplicar un repositorio SVN remoto, desde el cual las personas pueden clonar y trabajar. El repositorio intermedio tiene su rama principal reestablecida todas las noches desde el SVN ascendente, y estamos trabajando en ramas de características. Por ejemplo:
remote:
master
local:
master
feature
Puedo enviar exitosamente mi rama de características al control remoto y terminar con lo que espero:
remote:
master
feature
local:
master
feature
Luego reinicié la rama para rastrear el control remoto:
remote:
master
feature
local:
master
feature -> origin/feature
Y todo está bien. Lo que me gustaría hacer desde aquí es volver a establecer la base de la rama de características en la rama principal en el control remoto, pero me gustaría hacer esto desde mi máquina local. Me gustaría poder hacer:
git checkout master
git pull
git checkout feature
git rebase master
git push origin feature
Para mantener la rama de funciones remota actualizada con el maestro remoto. Sin embargo, este método hace que Git se queje:
To <remote>
! [rejected] feature -> feature (non-fast-forward)
error: failed to push some refs to ''<remote>''
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. ''git pull'') before pushing again. See the
''Note about fast-forwards'' section of ''git push --help'' for details.
git pull
hace el truco, pero provoca un compromiso de fusión que me gustaría evitar. Me preocupa que el mensaje muestre la feature -> feature
lugar de feature -> origin/feature
pero esto puede ser solo una cuestión de presentación.
¿Me estoy perdiendo algo, o estoy haciendo esto de una manera completamente incorrecta? No es crítico evitar hacer la rebase en el servidor remoto, pero hace que arreglar cualquier conflicto de fusión desde la base de datos sea mucho más difícil.
Es bueno que hayas traído este tema.
Esta es una cosa / concepto importante en git que una gran cantidad de usuarios de git se beneficiarían de saber. git rebase es una herramienta muy poderosa que te permite aplastar commits, eliminar commits, etc. Pero como con cualquier herramienta poderosa, básicamente necesitas saber lo que estás haciendo o algo puede ir realmente mal.
Cuando trabajas localmente y te relacionas con las sucursales locales, puedes hacer lo que quieras siempre que no hayas enviado los cambios al repositorio central. Esto significa que puede reescribir su propia historia, pero no la de otros. Al solo jugar con sus cosas locales, nada tendrá ningún impacto en otros repositorios.
Esta es la razón por la cual es importante recordar que una vez que haya enviado las confirmaciones, no debería volver a establecerlas más adelante. La razón por la cual esto es importante es porque otras personas pueden tirar de sus compromisos y basar su trabajo en sus contribuciones a la base de códigos, y si luego decide mover ese contenido de un lugar a otro (volver a establecer la base) y enviar esos cambios, entonces otras personas tendrán problemas y tendrán que volver a establecer su código. Ahora imagina que tienes 1000 desarrolladores :) Simplemente provoca una gran cantidad de trabajos innecesarios.
Puede desactivar el cheque (si está realmente seguro de que sabe lo que está haciendo) utilizando la opción --force
para git push
.
Todo se reduce a si la función es utilizada por una persona o si otros están trabajando fuera de ella.
Puedes forzar el empuje después de la rebase si solo eres tú:
git push origin feature -f
Sin embargo, si otros están trabajando en ello, debe fusionar y no volver a establecer la base fuera del maestro.
git merge master
git push origin feature
Esto asegurará que tenga una historia común con las personas con las que está colaborando.
En un nivel diferente, no deberías estar haciendo fusiones inversas. Lo que está haciendo es contaminar el historial de su rama de características con otras confirmaciones que no pertenecen a la característica, lo que hace que el trabajo posterior con esa rama sea más difícil: volver a basarlo o no.
Este es mi artículo sobre el tema llamado rama por función .
Espero que esto ayude.