remota - mezclar 2 ramas git
Git fusionar maestro en la rama característica (5)
Digamos que tenemos la siguiente situación en git:
Un repositorio creado:
mkdir GitTest2 cd GitTest2 git init
Algunas modificaciones en el master tienen lugar y se comprometen.
echo "On Master" > file git commit -a -m "Initial commit"
Feature1 se ramificó de maestro y se hace un poco de trabajo:
git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
Mientras tanto, se descubre un error en el código maestro y se establece una rama de revisión
git checkout master git branch hotfix1 git checkout hotfix1
El error se corrigió en la rama del hotfix y se fusionó nuevamente en el maestro (quizás después de una solicitud de extracción / revisión de código):
echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
El desarrollo en feature1 continúa:
git checkout feature1
Ahora mi pregunta: supongo que necesito la revisión en mi rama de características, tal vez porque el error también ocurre allí. ¿Cómo puedo lograr esto sin duplicar las confirmaciones en mi rama de características? Quiero evitar obtener dos nuevos confirmaciones en mi rama de características que no tienen relación con la implementación de la característica. Esto es especialmente importante para mí si utilizo Solicitudes de extracción: Todas estas confirmaciones también se incluirán en la Solicitud de extracción y deberán revisarse aunque esto ya se haya hecho (ya que la revisión ya está en el maestro).
No puedo hacer un git merge master --ff-only
: "fatal: no es posible adelantar, abortar", pero no estoy seguro de si esto me ayudó.
¿Cómo fusionar la rama maestra en la rama característica? Fácil:
git checkout feature1
git merge master
No tiene sentido forzar una fusión hacia delante aquí, ya que no se puede hacer. Has comprometido tanto en la rama característica como en la rama maestra. Avance rápido es imposible ahora.
Echa un vistazo a gitflow . Es un modelo de bifurcación para git que se puede seguir, e inconscientemente ya lo hizo. También es una extensión de git que agrega algunos comandos para los nuevos pasos del flujo de trabajo que hacen las cosas automáticamente, que de otra forma necesitarías hacer manualmente.
Entonces, ¿qué hiciste bien en tu flujo de trabajo? Tiene dos ramas con las que trabajar, su rama feature1 es básicamente la rama "desarrollada" en el modelo gitflow.
Usted creó una rama de revisión del maestro y la fusionó nuevamente. Y ahora estás atascado.
El modelo gitflow le pide que fusione la revisión también con la rama de desarrollo, que es "feature1" en su caso.
Así que la verdadera respuesta sería:
git checkout feature1
git merge --no-ff hotfix1
Esto agrega todos los cambios que se realizaron dentro de la revisión a la rama de la característica, pero SOLO esos cambios. Es posible que entren en conflicto con otros cambios de desarrollo en la rama, pero no entrarán en conflicto con la rama maestra en caso de que fusione la rama de la característica nuevamente con la maestra.
Tenga mucho cuidado con el rebasado. Rebase solo si los cambios que hizo permanecieron locales en su repositorio, por ejemplo, no empujó ninguna rama a otro repositorio. Rebasar es una gran herramienta para que usted organice sus compromisos locales en un orden útil antes de lanzarlos al mundo, pero luego, la rebasación desordenará las cosas para los principiantes de git como usted.
Basándote en este artículo deberías:
- crear una nueva rama que se basa en la nueva versión del maestro
- fusiona tu antigua rama de función en una nueva
- resolver conflictos en la nueva rama de características
De esta manera, su historial queda claro porque no necesita que se fusionen. Y no necesita ser tan súper cauteloso ya que no necesita git rebase
Deberías poder cambiar tu base en el maestro:
git checkout feature1
git rebase master
Gestiona todos los conflictos que surjan. Cuando llegue a las confirmaciones con las correcciones de errores (ya en master), git dirá que no hubo cambios y que tal vez ya se aplicaron. A continuación, continúa la rebase (mientras se omiten las confirmaciones ya en master) con
git rebase --skip
Si realiza un git log
en su rama de características, verá que la corrección de errores aparece solo una vez, y en la parte maestra.
Para una discusión más detallada, eche un vistazo a los documentos del libro Git en git rebase
( https://git-scm.com/docs/git-rebase ) que cubren este caso de uso exacto.
Es posible que pueda hacer un "pick-cherry" para obtener los compromisos exactos que necesita en su rama de función.
Haga un git checkout hotfix1
para obtener en la rama de hotfix1. Luego haga un git log
para obtener el hash SHA1 (secuencia grande de letras y números aleatorios que identifican de forma única una confirmación) de la confirmación en cuestión. Copia eso (o los primeros 10 o más caracteres).
Luego, git checkout feature1
para volver a la rama de características.
Luego, git cherry-pick <the SHA1 hash that you just copied>
Eso atraerá ese compromiso, y solo ese compromiso, a su rama de características. Ese cambio estará en la rama: simplemente lo "seleccionó". Luego, reanude el trabajo, edite, comprometa, presione, etc. al contenido de su corazón.
Cuando, eventualmente, realice otra fusión de una rama a su rama de función (o viceversa), git reconocerá que ya se ha fusionado en ese compromiso en particular , sabe que no tiene que volver a hacerlo, y simplemente "omitir".
La respuesta de Zimi describe este proceso en general. Aquí están los detalles:
1) Crear y cambiar a una nueva rama. Asegúrese de que la nueva rama se base en el master
para que incluya las revisiones recientes.
git checkout master
git branch feature1_new
git checkout feature1_new
# Or, combined into one command:
git checkout -b feature1_new master
2) Después de cambiar a la nueva rama, fusione los cambios de su rama de características existente. Esto agregará sus confirmaciones sin duplicar las revisiones de revisión.
git merge feature1
3) En la nueva rama, resuelva cualquier conflicto entre su función y la rama maestra.
¡Hecho! Ahora usa la nueva rama para continuar desarrollando tu característica.