git - que - ¿Cómo finalizo la combinación después de resolver mis conflictos de combinación?
resolver conflictos git (9)
¿Cómo finalizo la combinación después de resolver mis conflictos de combinación?
Con Git 2.12 (Q1 2017), tendrá el comando más natural:
git merge --continue
Ver commit c7d227d (15 de diciembre de 2016) por Jeff King ( peff
) .
Consulte commit 042e290 , commit c261a87 , commit 367ff69 (14 de diciembre de 2016) por Chris Packham ( cpackham
) .
(Fusionada por Junio C Hamano - gitster
- in commit 05f6e1b , 27 de diciembre de 2016)
Ver 2.12 notas de la versión .
merge
: añada la opción ''--continue
'' como sinónimo de ''git commit
''Enseñe a ''
git merge
'' la opción--continue
que permite ''continuar'' una fusión completándola.
La forma tradicional de completar una fusión después de resolver conflictos es usar ''git commit
''.
Ahora, con comandos como ''git rebase
'' y ''git cherry-pick
'' que tienen una opción ''--continue
'', agregar dicha opción a ''git merge
'' presenta una interfaz de usuario consistente.
He leído la sección Bifurcación y fusión básica del Libro de la Comunidad Git.
Así que lo sigo y creo una rama: experimental
.
Entonces yo:
- cambiar a rama experimental (git checkout experimental)
- hacer un montón de cambios
- cometerlo (git commit -a)
- cambiar a la rama maestra (git checkout master)
- Haz algunos cambios y comprométete allí.
- cambiar de nuevo a experimental (git checkout experimental)
- fusionar master cambiar a experimental (git merge master)
hay algunos conflictos, pero después de resolverlos, hice ''git add myfile''
Y ahora estoy atascado, no puedo retroceder al maestro.
Cuando lo hago
$ git checkout master
error: Entry ''res/layout/my_item.xml'' would be overwritten by merge. Cannot merge.
y lo hice:
$ git rebase --abort
No hay rebase en progreso?
y lo hice :
$ git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry ''res/layout/my_item.xml'' would be overwritten by merge. Cannot merge.
¿Qué puedo hacer para volver a mi rama maestra?
Cuando hay un conflicto durante una fusión, tiene que terminar la confirmación de fusión manualmente. Parece que has hecho los dos primeros pasos, para editar los archivos en conflicto y luego ejecutar git add
en ellos para marcarlos como resueltos. Por último, debe realizar la fusión con git commit
. En ese momento podrás cambiar de rama nuevamente.
Después de que se hayan agregado todos los archivos, el siguiente paso es un " git commit ".
"git status" sugerirá qué hacer: los archivos que aún no se han agregado se enumeran en la parte inferior, y una vez que estén listos, sugerirá un compromiso en la parte superior, donde se explica el estado de combinación de la rama actual.
En caso de que alguna vez se quede atascado durante una fusión / rebase, siempre puede
git reset --hard
para restaurar su funcionamiento al estado de la última confirmación. Esto perderá sus cambios en el árbol de trabajo, por lo que si tuvo modificaciones locales antes de la fusión, desaparecerán después de esto, por lo que es recomendable no iniciar una fusión cuando tenga modificaciones locales. :)
Lo primero que quiero aclarar es que los nombres de las ramas son solo un alias para un compromiso específico. un commit es lo que funciona git, cuando tiras, presionas unir y así sucesivamente. Cada confirmación tiene una identificación única.
Cuando haces $ git merge, lo que realmente está sucediendo es que git intenta avanzar rápidamente a tu rama actual para que realice la confirmación de la rama a la que se hace referencia (en otras palabras, ambos nombres de rama apuntan a la misma confirmación). Este escenario es el más fácil para git Para tratar, ya que no hay nuevo compromiso. Piensa en el maestro saltando al lilipad en el que se está enfriando tu rama. Es posible establecer la marca --no-ff, en cuyo caso git creará un nuevo commit sin importar si hubo algún conflicto de código.
En una situación en la que existen conflictos de código entre las dos ramas que intenta fusionar (normalmente, dos ramas cuyo historial de confirmación comparte una confirmación común en el pasado), el avance rápido no funcionará. Es posible que git aún pueda fusionar automáticamente los archivos, siempre que ambas ramas no hayan cambiado la misma línea en un archivo conflictivo. en este caso, git fusionará los archivos en conflicto por ti Y los confirmará automáticamente. Puede obtener una vista previa de cómo git haciendo $ git diff --cached. O puede pasar el indicador --no-commit al comando de combinación, que dejará los archivos modificados en su índice que deberá agregar y confirmar. Pero puedes $ git diff estos archivos para revisar lo que cambiará la fusión.
El tercer escenario es cuando hay conflictos que git no puede resolver automáticamente. En este caso necesitarás fusionarlos manualmente. En mi opinión, esto es más fácil de hacer con una fusión, como araxis merge o p4merge (gratis). De cualquier manera, tienes que hacer cada archivo uno por uno. Si la combinación parece estar atascada alguna vez, use $ git merge --continue, para empujarla. Git debería decirte si no puede continuar, y si es así, ¿por qué no? Si sientes que has aprovechado la fusión en algún momento, puedes hacer $ git merge --abort, y cualquier fusión se deshará y puedes comenzar de nuevo. Cuando haya terminado, cada archivo que fusionó será un archivo modificado que debe agregarse y confirmarse. Puedes verificar dónde están los archivos con el estado de $ git. Si aún no ha confirmado los archivos combinados. Necesitas hacer eso para completar la fusión. Debe completar la combinación o abortar la combinación antes de poder cambiar de rama.
Los siguientes pasos después de resolver los conflictos manualmente son:
- git añadir.
- estado de git (esto le mostrará qué comandos son necesarios para continuar con el procedimiento de combinación automática)
- [el comando git sugiere, por ejemplo,
git merge --continue
,git cherry-pick --continue
,git rebase --continue
]
Sólo git commit
.
Opcionalmente git abort
:
Me encontré con un conflicto de fusión. ¿Cómo puedo abortar la fusión?
Para hacer la vida más fácil con las combinaciones, instale kdiff3 y configúrelo como mergetool. Instrucciones: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/
Esa página contiene este video: https://www.youtube.com/watch?v=Cc4xPp7Iuzo
Se produce un conflicto de combinación cuando dos ramas que intentas fusionar cambian la misma parte del mismo archivo. Puedes generar una lista de conflictos con el git status
.
Cuando se encuentra la línea en conflicto, Git editará el contenido de los archivos afectados con indicadores visuales que marcan ambos lados del contenido en conflicto.
<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch
Cuando arregles tus archivos en conflicto y estás listo para fusionar, todo lo que tienes que hacer es ejecutar git add
y git commit
para generar el commit de fusión. Una vez que se realizó la confirmación, git push
los cambios a la rama.
Artículo de referencia: Git merge .
Siempre que fusiones dos ramas con el comando git merge brancha branchb
, hay dos posibilidades:
Una rama (digamos brancha) puede ser alcanzada por la otra rama (digamos branchb) siguiendo su historial de confirmaciones. En este caso, git simplemente avanza rápidamente la cabeza para apuntar a la rama reciente (en este caso, branchb).
2. Pero si las dos ramas se han desviado en algún punto anterior, git creará una nueva instantánea y agregará una nueva confirmación que apunta a ella. Entonces, en caso de que no haya conflicto entre las ramas que está fusionando, git creará un nuevo commit sin problemas.
Ejecute
git log
para ver la confirmación después de haber fusionado dos ramas no conflictivas.
Ahora volviendo al caso interesante cuando hay conflictos de fusión entre las ramas fusionadas. Cito esto de la página https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging
Git no ha creado automáticamente un nuevo compromiso de fusión. Ha pausado el proceso mientras resuelve el conflicto. Si desea ver qué archivos no se fusionan en cualquier momento después de un conflicto de combinación, puede ejecutar el
git status
Por lo tanto, en caso de que haya conflictos de combinación, debe resolver el conflicto y luego agregar los cambios que haya realizado en el área de git add filename
usando git add filename
y luego confirmar los cambios con el comando git commit
que fue detenido por git debido al conflicto. Espero que esto explique su consulta. También visite el enlace de arriba para entender las cosas en detalles. En caso de cualquier consulta, por favor comente a continuación, estaré encantado de ayudarle.