then - Elija la estrategia de fusión de Git para archivos específicos("nuestro", "mío", "suyo")
no rebase in progress? (3)
Estoy en el medio de git pull --rebase
después de un git pull --rebase
. Tengo algunos archivos que tienen conflictos de combinació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 solo abro el archivo o una herramienta de fusión y acepto manualmente todos los cambios "sus" o "mis". Sin embargo, sospecho que me falta un comando conveniente de git.
Además, tenga en cuenta que solo podré elegir una estrategia de fusión para cada archivo cuando veo qué archivos entran en conflicto y posiblemente cuáles son los conflictos.
Aunque se responde a esta pregunta, brindando un ejemplo de lo que significa "suyo" 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 . Por lo tanto, el siguiente conjunto de comandos acepta realmente los cambios de sucursal actuales en la sucursal remota.
# see current branch
$ git branch
...
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b
Git Merge
Para fusionarse , el sentido de theirs
y el ours
se invierte. Por lo tanto, para obtener el mismo efecto durante una combinación , es decir, mantener sus cambios de rama actuales (los ours
) sobre la rama remota fusionada (la theirs
).
# assuming branch-a is our current version
$ git merge -X ours branch-b # <- ours: branch-a, theirs: branch-b
Para cada archivo conflictivo que obtienes, puedes especificar
git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>
De los documentos de git checkout
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...
--ours
--theirs
Cuando revise las rutas desde el índice, consulte la etapa n.º 2 (ours
) o la n.º 3 (latheirs
) para las rutas no fusionadas.El índice puede contener entradas no fusionadas debido a una fusión fallida anterior. De forma predeterminada, si intenta verificar dicha entrada desde el índice, la operación de pago fallará y no se extraerá nada. El uso de
-f
ignorará estas entradas no fusionadas. Los contenidos de un lado específico de la combinación se pueden consultar en el índice utilizando--ours
o--theirs
. Con-m
, los cambios realizados en el archivo de árbol de trabajo se pueden descartar para volver a crear el resultado original de fusión en conflicto.
Tenga en cuenta que git checkout --ours|--theirs
sobrescribirá los archivos por completo , eligiendo theirs
versión o la ours
, que podría ser o no lo que desea hacer (si tiene algún cambio no conflictivo proveniente del otro lado, se perderán).
Si, por el contrario, desea realizar una combinación de tres vías en el archivo, y solo resolver los --ours|--theirs
conflicto utilizando --ours|--theirs
, mientras mantiene --ours|--theirs
no en conflicto de ambos lados en su lugar, es posible que desee recurrir a git merge-file
ver detalles en esta respuesta .