Error de Git al confirmar después de la fusión - fatal: no se puede realizar una confirmación parcial durante una fusión

280

Corrí un git pullque terminó en un conflicto. Resolví el conflicto y todo está bien ahora (también utilicé mergetool).

Cuando confirmo el archivo resuelto aparece git commit file.php -m "message"el error:

fatal: cannot do a partial commit during a merge.

Tuve el mismo problema antes y usar -aen commit funcionó perfectamente. Creo que no es la forma perfecta porque no quiero comprometer todos los cambios. Quiero comprometer archivos por separado con comentarios separados. ¿Cómo puedo hacer eso? ¿Por qué git no permite a los usuarios confirmar archivos por separado después de una fusión? No pude encontrar una respuesta satisfactoria a este problema.

pMan
fuente
55
Y ya sabes, buscar git perform "full commit" no devuelve casi nada útil. No hay un documento relevante de las páginas de manual de Git. Esta es una herramienta tan miserable.
jww
66
@Torek - habla sobre otro desastre creado por Git ... ¿Por qué es tan difícil sacar un archivo en conflicto de otra rama para evitar el conflicto, agregarlo a esta rama y luego confirmarlo? ¿Y WTF es una confirmación parcial? No puedo encontrar ninguna documentación al respecto ... Los usuarios se ven obligados a probar las siguientes conjeturas ...
jww
¿Cómo lo hiciste? Tengo un conflicto y no puedo hacer nada
Niklas R.

Respuestas:

442

Descubrí que agregar "-i" al comando commit me soluciona este problema. El -i básicamente le dice que organice archivos adicionales antes de comprometerse. Es decir:

git commit -i myfile.php
MikaelHalen
fuente
18
Que Stage additional filessignifica
jcalfee314
9
La preparación de @ jcalfee314 en git es preparar el archivo para la confirmación. En este caso particular, organiza el archivo a través de la línea de comandos antes de confirmar. La bandera -i se usa principalmente para cuando se concluye una fusión. Puede leer más sobre las banderas de confirmación aquí .
MikaelHalen
44
@ jcalfee314 Verifiqué la documentación y dice "Antes de realizar una confirmación de contenido por etapas hasta el momento, organice también el contenido de las rutas dadas en la línea de comando. Esto generalmente no es lo que desea a menos que esté concluyendo una fusión en conflicto" . Supongo que bajo esta condición, hay algún tipo de inconsistencia en el área de preparación que no se puede resolver git add, lo que hace que git commitfalle. Agregar -ile diría a git que agregue y confirme al mismo tiempo. Todavía no estoy seguro de por qué, pero parece tener sentido.
JonSlowCN
55
Para novatos como yo, también recibirá este mismo error si prueba un mensaje que incluye espacios sin comillas. P.ej. [git commit -m uno dos tres] Correcto: [git commit -m "uno dos tres"]
Skychan
2
El comentario de @ Skychan fue el boleto para mí.
tehbeardedone
106
git commit -am 'Conflicts resolved'

Esto funcionó para mí. Puedes probar esto también.

Pratip Ghosh
fuente
1
¡Increíble, no sabía esto!
JeanValjean
11
Esto agrega todos los archivos modificados a la confirmación, incluso los que no están organizados, lo que puede no ser deseable. Los usuarios pueden querer dejar la bandera 'a'
Chase Sandmann
44
Esto es exactamente lo que el usuario está pidiendo que no haga, que es evitar comprometer todos los archivos.
Michael
33

Puede usar git commit -ipara la mayoría de los casos, pero en caso de que no funcione

Que tiene que hacer git commit -m "your_merge_message". Durante un conflicto de fusión, no puede fusionar un solo archivo, por lo que debe

  1. Etapa solo el archivo en conflicto ( git add your_file.txt)
  2. git commit -m "your_merge_message"
aWebDeveloper
fuente
16

Probablemente tienes un conflicto en algo que no has puesto en escena para cometer. git no le permitirá cometer cosas de forma independiente (porque es parte de la fusión, supongo), por lo que necesita git addese archivo y luego git commit -m "Merge conflict resolution". La -ibandera de git commithace el complemento para usted.

Paul Price
fuente
55
No en 1.9.0 - commit -ifuncionó, pero nogit add; git commit
LeeGee
14

Obtuve esto cuando olvidé el -mcompromiso de mi git al resolver un conflicto de fusión de git.

git commit "commit message"

debiera ser

git commit -m "commit message"
wgeorge
fuente
2
¡Ah ah! ¡Lo olvidé de nuevo!
user2705463
9

Como dice el mensaje de error, no puede realizar una confirmación parcial después de una fusión. En lugar de comprometerse, solo file.phpdebe cometer todos los cambios.

Esto debería funcionar.

git commit -m "Fixing merge" 
Asim Jalis
fuente
Gracias, ayudó
Narendra Pandey
Trabajó para mí tal como está
Shashank Bodkhe
6

Tu fusión se detuvo en medio de la acción. Debe agregar sus archivos y luego 'git commit':

git add file_1.php file_2.php file_3.php git commit

Salud

Moyshe Zuchmir
fuente
5

Si solo desea deshacerse de todos los archivos de selección de cerezas y confirmación en los conjuntos que desee,

git reset --soft <ID-OF-THE-LAST-COMMIT>

te lleva allí.

Lo que hace el reinicio por software es que mueve el puntero que apunta al HEAD actual al commit (ish) que proporcionó pero no altera los archivos. El restablecimiento completo movería el puntero y también revertiría todos los archivos al estado en ese commit (ish). Esto significa que con el reinicio por software puede borrar el estado de fusión pero mantener los cambios en los archivos reales y luego confirmarlos o reiniciarlos individualmente según su gusto.

Zds
fuente
¿Podrías explicar esto más? Esto es probablemente lo que necesito, pero no entiendo cómo funcionaría ... Todas las respuestas aquí son 'agregar los archivos, luego confirmar!', Pero eso es tan obvio; La razón por la que estoy aquí es que no quiero agregar esos archivos antes de comprometerme. -_-;
Kyle Baker,
Eso ayuda. Gracias. :)
Kyle Baker
5
  1. ve a tu directorio de proyectos
    1. mostrar archivos ocultos (aparecerá la carpeta .git)
    2. Abra la carpeta .git
    3. eliminar MERGE_HEAD
    4. comprometerse de nuevo
    5. si git le dijo que git está bloqueado, regrese a la carpeta .git y elimine index.lock
    6. comprometerse de nuevo, todo funcionará bien esta vez.
Ahmed Samir
fuente
¡Excelente! Eso funcionaría para mí. Por cierto, si en MacOS, desde el terminal podría haber llamado `open .git`, witch mostrará el contenido '.git' en el Finder
tontonCD
Esto también funciona para mí. Esto debe ser aceptado como respuesta.
vandu
3

Para mí, esto sucedió en SourceTree cuando intenté realizar una fusión antes de resolver todos los archivos. Luego marqué el último archivo resuelto y aún así me dio este error al intentar confirmar. Cerré SourceTree y lo volví a abrir, y luego se comprometió bien.

Justin
fuente
1
gracias, pero desafortunadamente esto no funcionó para mí. Molesto, tuve que cometer una vista privada así como la fusión antes de que me permitiera cometer la fusión.
Coxy
3

Resolví esto con un enfoque completamente diferente, usando solo el control de código fuente de Xcode.

Antecedentes: otro equipo introdujo cambios en el repositorio remoto de Git (a través de Beanstalk). Por mi parte, los archivos .xcodeproj entraron en un directorio diferente, y los cambios no tomaron. Más tarde, cuando intenté comprometerme, recibí un error de Conflicto de árbol en Xcode.

Captura de pantalla de Tree Conflict

Siendo casi imposible de corregir usando Xcode, reemplacé el .xcodeprojarchivo con una versión descargada del servidor Git. El resultado ... el proyecto Xcode parecía aclararse, sin embargo, todas las actualizaciones del corrupto Pull aparecían como cambios que hice y se organizaron para un commit.

Mira todas estas modificaciones y archivos agregados

Sin embargo, cuando traté de comprometerme, recibí el mismo error "fatal: no puedo hacer una confirmación parcial durante una fusión", discutido aquí.

Así es como resolví el problema ... (Ahora, entiendo que soy un programador novato, por lo que podría faltar algo de comprensión ... pero mi ignorancia me llevó a encontrar otra forma de hacer esto). Primero, cloné a mi maestro Se bifurca en una rama secundaria y se cambia a esa rama. Luego creé una Copia de trabajo y coloqué el directorio en esa copia de trabajo fuera del directorio original del proyecto. (No sé si esto era necesario, pero es lo que hice cuando leí otras técnicas de solución de problemas). Luego cambié las ramas al maestro, donde me di cuenta de que todos mis archivos por etapas (cambios en commit) habían desaparecido. Para asegurarme de que todos los archivos se actualizaron a los últimos cambios realizados por la otra parte, creé una nueva rama llamada ThirdBranch, que duplicaba todos los archivos, Lo introduje en el servidor Git y dejé que Beanstalk compare la versión de mi servidor de la rama maestra con la rama de ThirdBrach que acabo de empujar (línea por línea), y todos los cambios realizados por la otra parte estaban presentes en mi Xcode. Esto significaba que mi repositorio principal y el repositorio principal de Git eran los mismos, lo que verifica que resolví el problema usando Xcode solamente.

No me preguntes cómo, más allá de lo que acabo de describir ... y ciertamente llena los vacíos que dejé fuera. Soy nuevo en esto y no entiendo todo. Tal vez un programador experimentado pueda separar la información irrelevante de la relevante y recrear esta técnica más claramente, lo que es en parte por lo que publico esto.

Esta es una respuesta duplicada a una pregunta duplicada como en: Error en Xcode Git Merge está atascado

Plexander
fuente
2
Por favor no publique respuestas duplicadas. Si bien el problema subyacente puede ser el mismo, su respuesta es para un problema mucho más específico y solo nubla las respuestas a esta pregunta general. Creo que en este caso un comentario a la pregunta en la que se vincula a su respuesta original es más apropiado.
Fookatchu
2

Durante una fusión, Git quiere realizar un seguimiento de las ramas principales por todo tipo de razones. Lo que quieres hacer no es una fusión como lo ve git. Es probable que desee hacer un rebase o selección de cereza manualmente.

Talljoe
fuente
1
Nunca antes utilicé rebase o cherry-pick, acabo de leer el manual ahora, entonces, ¿qué sugerirías, "git rebase master" después de fusionar conflictos funcionará?
pMan
1
Es un flujo de trabajo paralelo. Consulte stackoverflow.com/questions/804115/git-rebase-vs-git-merge Básicamente, si desea que la "fusión" sea una confirmación por separado, en su lugar, vuelva a basar la rama de origen en el extremo de la rama de destino.
Talljoe
1
Simplemente agregue cada archivo individual y luego confirme sin -a.
Peter DeWeese
44
en realidad no respondiste la pregunta, sino que simplemente diste más para buscar. Ahora necesitamos saber "qué es recoger cerezas" y "qué es rebase".
ftrotter
2
Me pregunto por qué esta respuesta fue rechazada. Siempre tuve la curiosidad del niño cuando alguien me cuenta cosas que nunca supe antes. Como comenté anteriormente, ahora sé sobre selección de cerezas y rebase. ¿No fue eso progresivo / útil?
pMan
2

git commit -i -m 'merge message'No funcionó para mí. Decía:

fatal: No paths with --include/--only does not make sense.

FWIW, llegué aquí a través de esta pregunta relacionada porque recibía este mensaje:

fatal: You have not concluded your merge (MERGE_HEAD exists).

También probé mergetool, que dijo No files need merging. ¡Muy confuso! ¿Entonces el MERGE_HEAD no está en un archivo que necesita fusionarse?

Finalmente, usé este truco para agregar solo los archivos modificados (no quería agregar todos los archivos en mi árbol, ya que tengo algunos que quiero mantener sin seguimiento):

git ls-files -m | xargs git add

Entonces finalmente pude (!) Comprometerme y empujar hacia arriba. Seguro que sería bueno si git te diera mejores pistas sobre qué hacer en estas situaciones.

szeitlin
fuente
1

Si está en el Árbol de origen , debemos marcar explícitamente un archivo como resuelto después de que se resuelvan los conflictos. Seleccione el archivo que acaba de resolverse sin conflictos. Luego Acciones -> Resolver conflictos -> Marcar resuelto . Si tiene varios archivos, haga lo mismo para todos. Comprométete ahora.

cgr
fuente
1

Después de leer todos los comentarios. esta fue mi resolución:
tuve que "Agregar" nuevamente que cometer:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html
FelipeNutz
fuente
1

Si está utilizando el árbol de fuentes u otra GUI, asegúrese de que todos los archivos estén marcados (después de la fusión).

luky
fuente
0

A veces, durante la fusión, si surgen conflictos y hay deltas que necesitan resolución manual. En tal caso, arregle la resolución manual de los archivos mencionados.

Ahora si emites,

git status Lib/MyFile.php

Verá salida como

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Como ya organizaste el commit, solo necesitas emitir

git commit

Y su compromiso se realizará sin ningún problema.

Ketan Patel
fuente