una remota ramas rama moverse mezclar fusionar example cambiar añadir git

remota - mezclar 2 ramas git



Git fusionar maestro en la rama característica (5)

Digamos que tenemos la siguiente situación en git:

  1. Un repositorio creado:

    mkdir GitTest2 cd GitTest2 git init

  2. Algunas modificaciones en el master tienen lugar y se comprometen.

    echo "On Master" > file git commit -a -m "Initial commit"

  3. 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"

  4. 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

  5. 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

  6. 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.