Elija la estrategia de combinación de Git para archivos específicos ("nuestro", "mío", "de ellos")
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.
Para cada archivo en conflicto que obtenga, puede especificar
git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>
De los git checkout
documentos
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
-f
ignorará estas entradas no fusionadas. El contenido de un lado específico de la combinación se puede extraer del índice usando--ours
o--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.
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 theirs
y ours
está 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