¿Cómo mantener el archivo local o el archivo remoto durante la fusión usando Git y la línea de comando?

194

Sé cómo fusionar la modificación usando vimdiff, pero, suponiendo que sé que todo el archivo es bueno para guardar o tirar, ¿cómo hago eso?

No quiero abrir vimdiff para cada uno de ellos, cambio quiero un comando que diga 'mantener local' o 'mantener remoto'.

EG: Tengo una fusión con archivos marcados como modificados porque alguien lo abrió bajo Windows, cambiando la EOL, y luego se comprometió. Al fusionarme, quiero mantener mi propia versión y descartar la suya.

También me interesa lo contrario: me equivoqué mucho y quiero aceptar el archivo remoto, descartando mis cambios.

e-satis
fuente

Respuestas:

309

También puedes hacer:

git checkout --theirs /path/to/file

para mantener el archivo remoto y:

git checkout --ours /path/to/file

para mantener el archivo local.

Luego git addellos y todo está hecho.

Edición: tenga en cuenta que esto es para un mergeescenario. Durante un se rebase --theirsrefiere a la rama donde has estado trabajando.

Esperando a Dev ...
fuente
44
Hice esto ... pero no pasa nada ... ¿cómo sé que está tomando el archivo correcto? Estoy usando git version 1.8.4si eso importa.
Rosdi Kasim
3
¿Por qué se usa la palabra inversa? Asumo "de ellos" habría archivo remoto y "nuestro" sería mi archivo
phuclv
1
Así es, @ LưuVĩnhPhúc
Waiting for Dev ...
77
no, sus significados se invierten stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 ellos serían mis archivos y los nuestros son los archivos de la rama remota
phuclv
66
"Fácil", sí. ¿Intuitivo? No.
Wilbur Whateley
107

Este enfoque parece más sencillo, evitando la necesidad de seleccionar individualmente cada archivo:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

o

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Copiado directamente de: Resolver conflictos de fusión de Git a favor de sus cambios durante una extracción

keflavich
fuente
3
Amo esta. Especialmente si hay más de un archivo.
Tek
La pregunta era para dos comandos diferentes, pero no hay una descripción de lo que hacen estos dos. ¿Qué hace cada línea?
Alex
Revisé al menos cinco respuestas de stackoverflow antes de encontrar esto, que es lo que quería. Gracias.
Bolton Bailey,
14

git checkout {branch-name} -- {file-name}

Esto usará el archivo de la rama elegida.

Me gusta esto porque el posh-gitautocompletado funciona muy bien con esto. También elimina cualquier ambigüedad sobre qué rama es remota y cuál es local. Y --theirsno funcionó para mí de todos modos.

Ben Wilde
fuente
Sin ambigüedades, funciona tanto para {mine} como {hiss}, admite agregar directorios completos. Esta debería ser la respuesta aceptada.
dotancohen
9

Para la cosa del final de línea, consulte man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Asegúrese de agregar autocrlf = falsey / o safecrlf = falseal clon de Windows (.git / config)

Usando git mergetool

Si configura una herramienta de combinación como esta:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Entonces un simple

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Hará el trabajo

Usando comandos simples de git

En otros casos, supongo

git checkout HEAD -- path/to/myfile.txt

debería hacer el truco

Edite para hacer lo contrario (porque lo arruinó):

git checkout remote/branch_to_merge -- path/to/myfile.txt
sehe
fuente
+1 para los consejos, pero no se acepta pero porque no es lo que pedí. Quiero algo que funcione en todos los casos, no solo en los casos de ejemplo. Además, "git checkout remote / branch_to_merge - path / to / myfile.txt" no funcionará si ya comenzó su fusión: dirá que está en medio de una fusión y le impedirá hacerlo.
e-satis
1
@ e-satis: eso es sorprendente. Consideraría que es un error, ya que el pago con una ruta no es un pago regular (y no afecta a HEAD). Voy a probarlo ahora porque no puedo creerlo
Sehe
1
@ e-satis: Soooo ... Tenía razón; git checkout remote/branch_to_merge -- path/to/myfile.txtfunciona de maravilla mientras resuelve un conflicto de fusión. (git 1.7.1)
sehe
1
Se agregó una solución basada en git mergetool ahora
sehe