Al aplicar un parche, ¿hay alguna forma de resolver conflictos?

124

Estoy en windows.

Por varias razones, tenemos varias instancias de git de diferentes ramas de svn.

Muchas veces quiero solucionar un problema en el repositorio A, generar un parche y aplicarlo al repositorio B. Esto funciona bien, excepto si hay conflictos.

Al reajustar, simplemente hago clic derecho en la carpeta y uso tortioseGit y selecciono la opción de resolución. Esto muestra una interfaz gráfica de usuario agradable que me permite resolver mis conflictos.

¿Hay alguna forma de lograr esto con fragmentos de parche rechazados?

Aquí está mi enfoque actual para crear / aplicar los parches

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch
Kenoyer130
fuente
3
Normalmente lo hago a mano cuando fallan todas las opciones de parcheo ...
stdcall
Si la combinación falla, es porque el programa no puede averiguar cómo realizar la combinación sin ambigüedades. Debería obtener un archivo con conjuntos <<<<, ===, >>>> y debe ir y resolverlos a mano.
tacaswell
Sí, hacerlo a mano es una verdadera pita cuando hablas de unos 100 rej hunks.
Kenoyer130
Ahí es cuando querrás usar git mergetooly hacer una combinación de 3 vías con la interfaz gráfica de usuario de tu elección (soy parcial a kdiff en Windows) ...
g19fanatic

Respuestas:

254

Para generar su parche, haga lo siguiente:

git format-patch --stdout first_commit^..last_commit > changes.patch

Ahora, cuando esté listo para aplicar los parches:

git am -3 < changes.patch

la -3hará un fusión a tres bandas si hay conflictos. En este punto se puede hacer una git mergetoolsi quieres ir a una interfaz gráfica de usuario de forma manual o simplemente combinar los archivos usando vim (la norma <<<<<<, ||||||, >>>>>>resolución de conflictos).

g19fanatic
fuente
3
Puede ser útil añadir --ignore-whitespace --ignore-space-changea git amtambién. Tuve fusiones triviales que no se llevaron a cabo sin él.
angularsen
12
git apply -3 changes.patchparece funcionar para mí también
peterflynn
1
A pesar de que el parche no se aplica limpiamente, todavía obtengo "No hay archivos que se fusionen" de git mergetool. En su lugar, tuve que encontrar la confirmación base del parche original usado, aplicar encima de eso (afortunadamente mi repositorio tenía esto) y luego rebase.
jozxyqk
4
Tengo el mismo problema que @jozxyqk. Ni git am -3tampoco git apply -3soltaré marcadores de conflicto en mis archivos, aunque recibo mensajes como Applied patch to 'configure.ac' with conflicts.y error: patch failed: .... Esto está encendido git 2.17.1. ¿Quizás cuando algunos archivos no se pueden parchear en absoluto, git retrocede?
nh2
1
Tengo el mismo problema que @ nh2, ¿alguna vez encontró el problema?
Eridanis
12

Si con frecuencia se encuentra con el mismo conjunto de conflictos al aplicar parches, reajustar o fusionar, puede usar la función git rerere (reutilizar la resolución grabada). Esto le permite predefinir cómo se deben resolver los conflictos en función de cómo los resolvió en el pasado. Consulte http://git-scm.com/blog/2010/03/08/rerere.html para obtener detalles sobre cómo funciona.

mplf
fuente
5

TortoiseGit tiene una función de combinación que puede abrir archivos de parche.

Hay una foto de ella aquí .

ams
fuente
En realidad, la opción de fusión podría ser lo que estoy buscando.
Kenoyer130
De Verdad? No he usado tortoise en mucho tiempo, pero la página vinculada tiene el texto "TortoiseMerge puede abrir el archivo de parche de Git directamente, usted lo revisa y parchea a una copia de trabajo", ¡así que parece que debería!
ams
abre archivos de parche ... sin embargo, a veces el formato de archivo de parche rompe tortoisegitmerge. Nunca he tenido éxito con diff -u, sino con la salida diff -c.
thistleknot
También puede arrastrar con el botón derecho los parches en una carpeta de árbol de trabajo y seleccionar "Aplicar parche de serie" (para parches como 0001-xxx.patch, ... 0002-xxy.patch) o "Aplicar archivo de parche único".
MrTux
2

Mi enfoque es:

  • Cree una rama de "integración" donde los archivos sean idénticos
  • Aplicar el parche a esta rama de integración
  • Combínelo o modifíquelo para dominar (no sé si el cambio de base es útil aquí, porque no sé qué sucederá cuando aplique más parches)
MichiBack
fuente