theirs origin force git merge

origin - Herramienta simple para "aceptar el suyo" o "aceptar el mío" en un archivo completo usando git



git merge--abort (4)

No quiero una herramienta de combinación visual, y tampoco quiero tener que ver el archivo en conflicto y elegir manualmente entre HEAD (el mío) y el cambio importado (el de ellos). La mayoría de las veces quiero todos sus cambios o todos los míos. Comúnmente, esto se debe a que mi cambio lo hizo upsteam y está regresando a mí a través de un tirón, pero puede modificarse ligeramente en varios lugares.

¿Existe una herramienta de línea de comandos que elimine los marcadores de conflicto y elija todos de una forma u otra según mi elección? O un conjunto de comandos git que me puedo alias para hacer cada uno.

# accept mine alias am="some_sequence;of;commands" alias at="some_other_sequence;of;commands"

Hacer esto es bastante molesto. Para ''aceptar el mío'' he intentado:

randy@sabotage ~/linus $ git merge test-branch Auto-merging Makefile CONFLICT (content): Merge conflict in Makefile Automatic merge failed; fix conflicts and then commit the result. randy@sabotage ~/linus $ git checkout Makefile error: path ''Makefile'' is unmerged andy@sabotage ~/linus $ git reset --hard HEAD Makefile fatal: Cannot do hard reset with paths.

¿Cómo se supone que debo deshacerme de estos marcadores de cambio?

Puedo hacer:

git reset HEAD Makefile; rm Makefile; git checkout Makefile

Pero esto parece más bien redondo, debe haber una mejor manera. Y en este punto, no estoy seguro de que git piense que la fusión ocurrió, así que no creo que esto necesariamente funcione.

Yendo por el otro lado, hacer ''aceptar el de ellos'' es igualmente complicado. La única forma en que puedo resolverlo es haciendo:

git show test-branch:Makefile > Makefile; git add Makefile;

Esto también me da un mensaje de confirmación desordenado, que tiene Conflictos: Makefile en él dos veces.

¿Alguien puede indicar cómo realizar las dos acciones anteriores de una manera más simple? Gracias


La solución es muy simple. git checkout <filename> intenta extraer el archivo del índice y, por lo tanto, falla en la combinación.

Lo que debes hacer es (es decir, hacer un checkout):

Para verificar tu propia versión puedes usar uno de:

git checkout HEAD -- <filename>

o

git checkout --ours -- <filename>

o

git show :2:<filename> > <filename> # (stage 2 is ours)

Para pagar la otra versión puedes usar una de:

git checkout test-branch -- <filename>

o

git checkout --theirs -- <filename>

o

git show :3:<filename> > <filename> # (stage 3 is theirs)

También deberías ejecutar ''agregar'' para marcarlo como resuelto:

git add <filename>


Prueba esto:

Para aceptar sus cambios: git merge --strategy-option theirs

Para aceptar el tuyo: git merge --strategy-option ours


Según la respuesta de Jakub, puedes configurar los siguientes alias de git para tu comodidad:

accept-ours = "!f() { git checkout --ours -- /"${@:-.}/"; git add -u /"${@:-.}/"; }; f" accept-theirs = "!f() { git checkout --theirs -- /"${@:-.}/"; git add -u /"${@:-.}/"; }; f"

Opcionalmente, toman una o varias rutas de archivos para resolver y predeterminadas para resolver todo en el directorio actual si no se proporciona ninguna.

~/.gitconfig a la sección [alias] de su ~/.gitconfig o ejecute

git config --global alias.accept-ours ''!f() { git checkout --ours -- "${@:-.}"; git add -u "${@:-.}"; }; f'' git config --global alias.accept-theirs ''!f() { git checkout --theirs -- "${@:-.}"; git add -u "${@:-.}"; }; f''


Según la respuesta de kynan, aquí están los mismos alias, modificados para que puedan manejar espacios y guiones iniciales en los nombres de archivo:

accept-ours = "!f() { [ -z /"$@/" ] && set - ''.''; git checkout --ours -- /"$@/"; git add -u -- /"$@/"; }; f" accept-theirs = "!f() { [ -z /"$@/" ] && set - ''.''; git checkout --theirs -- /"$@/"; git add -u -- /"$@/"; }; f"