Elija la estrategia de combinación de Git para archivos específicos ("nuestro", "mío", "de ellos")

Resuelto Steven Wexler asked hace 11 años • 4 respuestas

Estoy en medio de un cambio de base después de un git pull --rebase. Tengo algunos archivos que tienen conflictos de fusión. ¿Cómo puedo aceptar "sus" cambios o "mis" cambios para archivos específicos?

$ git status
# Not currently on any branch.
# You are currently rebasing.
#   (fix conflicts and then run "git rebase --continue")
#   (use "git rebase --skip" to skip this patch)
#   (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:  CorrectlyMergedFile
#
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#       both modified: FileWhereIWantToAcceptTheirChanges
#       both modified: FileWhereIWantToAcceptMyChanges

Normalmente, simplemente abro el archivo o una herramienta de combinación y acepto manualmente todos "sus" o "mis" cambios. Sin embargo, sospecho que me falta un comando git conveniente.

Además, tenga en cuenta que solo podré elegir una estrategia de combinación para cada archivo cuando vea qué archivos tienen conflictos y posiblemente cuáles son los conflictos.

Steven Wexler avatar May 30 '13 07:05 Steven Wexler
Aceptado

Para cada archivo en conflicto que obtenga, puede especificar

git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>

De los git checkoutdocumentos

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
Al verificar rutas del índice, consulte la etapa n.° 2 ( ours) o n.° 3 ( theirs) para conocer las rutas no fusionadas.

El índice puede contener entradas no fusionadas debido a una fusión anterior fallida. De forma predeterminada, si intenta extraer dicha entrada del índice, la operación de extracción fallará y no se extraerá nada. El uso -fignorará estas entradas no fusionadas. El contenido de un lado específico de la combinación se puede extraer del índice usando --ourso --theirs. Con -m, los cambios realizados en el archivo del árbol de trabajo se pueden descartar para recrear el resultado de la fusión original en conflicto.

 avatar May 30 '2013 00:05

Aunque se responde a esta pregunta, se proporciona un ejemplo de lo que significan "de ellos" y "nuestro" en el caso de git rebase vs merge. Ver este enlace

Git Rebase
theirs es en realidad la rama actual en el caso de rebase . Entonces, el siguiente conjunto de comandos en realidad acepta los cambios de la rama actual en la rama remota.

# see current branch
$ git branch
... 
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b

Git Merge
Para fusionar , el significado de theirsy oursestá invertido. Entonces, para obtener el mismo efecto durante una fusión , es decir, mantenga los cambios de la rama actual ( ours) sobre la rama remota que se está fusionando ( theirs).

# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b
Abe avatar Mar 20 '2017 15:03 Abe