Git resuelve el conflicto usando --our / - suyo para todos los archivos

112

¿Existe alguna forma de resolver el conflicto de todos los archivos mediante el checkout --oursy --theirs? Sé que puede hacerlo para archivos individuales, pero no pudo encontrar la manera de hacerlo para todos.

exe163
fuente
7
¿ git checkout --ours -- .Funciona? El .significa el directorio actual, cuando se aplica desde la raíz del directorio de trabajo, por lo que básicamente significa el directorio de trabajo completo. Sin --oursembargo, no estoy seguro de si eso funcionará con la bandera, y no estoy seguro de cómo manejará los conflictos de archivos eliminados o renombrados.
@Cupcake Lo he usado con éxito. ¿Quizás esa debería ser una respuesta?
Pedro Gimeno

Respuestas:

90

Simplemente haga grep a través del directorio de trabajo y envíe la salida a través del comando xargs:

grep -lr '<<<<<<<' . | xargs git checkout --ours

o

grep -lr '<<<<<<<' . | xargs git checkout --theirs

Cómo funciona: grepbuscará en todos los archivos del directorio actual (el .) y los subdirectorios de forma recursiva (el -rindicador) en busca de marcadores de conflicto (la cadena '<<<<<<<')

el indicador -lo --files-with-matcheshace que grep muestre solo el nombre de archivo donde se encontró la cadena. El escaneo se detiene después de la primera coincidencia, por lo que cada archivo coincidente solo se genera una vez.

Los nombres de archivo coincidentes luego se canalizan a xargs , una utilidad que divide el flujo de entrada canalizado en argumentos individuales para git checkout --ourso--theirs

Más en este enlace .

Dado que sería muy inconveniente tener que escribir esto cada vez en la línea de comandos, si se encuentra usándolo mucho, puede que no sea una mala idea crear un alias para su shell de elección: Bash es el habitual .

Este método debería funcionar al menos con las versiones 2.4.x de Git

Dmitri
fuente
14
En lugar de grepping, creo que también es posible usar git diff --name-only --diff-filter=U.
Tailandés
10
También git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]. Más rápido que grepping si tienes un proyecto grande.
joshbodily
1
@joshbodily Nice. No tengo proyectos tan grandes que notaría una diferencia, pero puedo ver cómo sería mucho más rápido, especialmente si pocos archivos han cambiado en comparación con el número total en el directorio, que debería ser el caso de los archivos normales. se compromete.
Dmitri
1
Tenga en cuenta que esto no funciona para los conflictos de cambio de nombre / cambio de nombre, por ejemplo,CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard
1
Sin embargo, otra opción: git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax
52

Puede -Xourso -Xtheirscon usted git mergetambién. Entonces:

  1. abortar la fusión actual (por ejemplo con git reset --hard HEAD)
  2. fusionar usando la estrategia que prefiera ( git merge -Xourso git merge -Xtheirs)

DESCARGO DE RESPONSABILIDAD: por supuesto, puede elegir solo una opción, -Xourso bien -Xtheirs, utilice una estrategia diferente, por supuesto, debe ir archivo por archivo.

No sé si hay una manera de checkouthacerlo, pero honestamente no creo que sea terriblemente útil: seleccionar la estrategia con el comando checkout es útil si desea diferentes soluciones para diferentes archivos; de lo contrario, elija el enfoque de estrategia de fusión.

Gracias por todo el pescado
fuente
Gracias, no sabía que tenían '--los nuestros' y '--los suyos' para fusionarse. Parece que para la fusión, en realidad, no son parte de la estrategia '-s' sino de las opciones recursivas '-X'. La versión '-s' de la nuestra en realidad simplemente reemplaza todos los archivos sin fusionar y la suya no existe.
exe163
No existe --theirso --ours-Opción para V1.9.4 git. Un enfoque sería git merge -s recursive -Xtheirs BRANCH.
fbmd
--theirsy --oursno están disponibles ni con git 2.2.0. O mi respuesta no fue precisa o estaban disponibles en la versión anterior de git (esta respuesta es bastante antigua en la época de TI). El enfoque correcto es con -X. Actualizo en consecuencia
ThanksForAllTheFish
A partir de la versión 2.4.0, el nuestro y el suyo todavía están disponibles git-scm.com/docs/git-checkout
Dmitri
Intenté esto y obtuve "error de fusión automática, solución de conflictos". Este comando claramente no funciona como se esperaba, y recomiendo evitarlo, tiene demasiados errores.
Adam
37

git checkout --[ours/theirs] .hará lo que quiera, siempre y cuando esté en la raíz de todos los conflictos. el nuestro / el de ellos solo afecta a los archivos no fusionados, por lo que no debería tener que crear conflictos con grep / find / etc.

Cory Petosky
fuente
5
Para mí, esto no parece recurrir a subdirectorios.
Daniel Baughman
5
Yo entiendo error: path 'foo/bar/blah' does not have our version.
Robin Green
Estoy usando git versión 2.16.2.windows.1 y me funciona perfectamente. ¡Gracias!
Pankwood
30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

Parece hacer el trabajo. Tenga en cuenta que debe estar conectado al directorio raíz del repositorio git para lograr esto.

Pedro
fuente
3
Creo que esta es una mejor respuesta que la más votada porque (1) se aplica a todos los archivos, no solo al directorio de trabajo; y (2) no tendrá ninguna fragilidad en torno a la búsqueda de marcadores de conflicto. El comando 'git diff' aquí enumera todas las rutas no fusionadas, que es exactamente lo que queremos verificar.
bchurchill
¡Agradable! Siempre estuve preocupado por la confiabilidad de los marcadores de conflicto grep
00-BBB
2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

Agregué esta función en el archivo .zshrc .

Úselos de esta manera: gitcheckoutall theirsogitcheckoutall ours

iWheelBuy
fuente