¿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.
112
¿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.
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.Respuestas:
Simplemente haga grep a través del directorio de trabajo y envíe la salida a través del comando xargs:
o
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
fuente
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 ustedgit merge
también. Entonces:git reset --hard HEAD
)git merge -Xours
ogit 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.fuente
--theirs
o--ours
-Opción para V1.9.4 git. Un enfoque seríagit merge -s recursive -Xtheirs BRANCH
.--theirs
y--ours
no están disponibles ni con git2.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 consecuenciagit 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.fuente
error: path 'foo/bar/blah' does not have our version
.Parece hacer el trabajo. Tenga en cuenta que debe estar conectado al directorio raíz del repositorio git para lograr esto.
fuente
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:
Gracias a https://stackoverflow.com/a/1295232/560114
O al revés, consulte ¿Existe una versión "de ellos" de "git merge -s our"?
fuente
Agregué esta función en el archivo .zshrc .
Úselos de esta manera:
gitcheckoutall theirs
ogitcheckoutall ours
fuente