¿Existe alguna forma de resolver el conflicto de todos los archivos mediante el checkout --ours
y --theirs
? Sé que puede hacerlo para archivos individuales, pero no pudo encontrar la manera de hacerlo para todos.
¿Existe alguna forma de resolver el conflicto de todos los archivos mediante el checkout --ours
y --theirs
? Sé que puede hacerlo para archivos individuales, pero no pudo encontrar la manera de hacerlo para todos.
Respuestas:
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: grep
buscará en todos los archivos del directorio actual (el .
) y los subdirectorios de forma recursiva (el -r
indicador) en busca de marcadores de conflicto (la cadena '<<<<<<<')
el indicador -l
o --files-with-matches
hace 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 --ours
o--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
git diff --name-only --diff-filter=U
.
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]
. Más rápido que grepping si tienes un proyecto grande.
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.
Puede -Xours
o -Xtheirs
con usted git merge
también. Entonces:
git reset --hard HEAD
)git merge -Xours
o git merge -Xtheirs
)DESCARGO DE RESPONSABILIDAD: por supuesto, puede elegir solo una opción, -Xours
o bien -Xtheirs
, utilice una estrategia diferente, por supuesto, debe ir archivo por archivo.
No sé si hay una manera de checkout
hacerlo, 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.
--theirs
o --ours
-Opción para V1.9.4 git. Un enfoque sería git merge -s recursive -Xtheirs BRANCH
.
--theirs
y --ours
no 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
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.
error: path 'foo/bar/blah' does not have our version
.
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.
En caso de que alguien más esté buscando simplemente sobrescribir todo de una rama (por ejemplo, maestra) con el contenido de otra, hay una manera más fácil:
git merge origin/master --strategy=ours
Gracias a https://stackoverflow.com/a/1295232/560114
O al revés, consulte ¿Existe una versión "de ellos" de "git merge -s our"?
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--ours
embargo, 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.