Elija la estrategia Git merge para archivos específicos ("nuestros", "míos", " suyos")


Estoy en el medio de reajuste 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 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 git conveniente.

También, tenga en cuenta que solo podré elegir una estrategia de fusión para cada archivo cuando vea qué archivos golpean conflictos y posiblemente cuáles son los conflictos ser.

Author: Steven Wexler, 2013-05-30

3 answers

Para cada archivo en conflicto que obtenga, puede especificar

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

De la git checkout docs

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

--ours
--theirs
Al comprobar rutas desde el índice, echa un vistazo a la etapa #2 (ours) o #3 (theirs) para rutas sin fusionar.

El índice puede contener entradas no fusionadas debido a una fusión fallida anterior. De forma predeterminada, si intenta retirar dicha entrada del índice, la operación de pago fallará y nada será revisado. Usar -f ignorará estas entradas no fusionadas. Los contenidos de un lado específico de la fusión se pueden extraer del índice usando --ours o --theirs. Con -m, los cambios realizados en el archivo de árbol de trabajo se pueden descartar para volver a crear el resultado de fusión en conflicto original.

 173
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-30 00:21:47

A pesar de que esta pregunta es respondida, proporcionando un ejemplo de lo que significa "suyo" y "nuestro" en el caso de git rebase vs merge. Ver este enlace

Git Rebase
theirs en realidad es la rama actual en el caso de rebase. Por lo tanto, el siguiente conjunto de comandos está aceptando los cambios de rama actuales sobre 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 merge, el significado de theirs y ours se invierte. Tan, para obtener el mismo efecto durante una combinación , es decir, mantener 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
 45
Author: Abe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-15 16:49:36

Tenga en cuenta que git checkout --ours|--theirs sobrescribirá los archivos por completo, eligiendo theirs o ours la versión, que podría ser o no lo que desea hacer (si tiene cambios no conflictivos que vienen del otro lado, se perderán).

Si en su lugar desea realizar una combinación de tres vías en el archivo, y solo resolver los trozos en conflicto utilizando --ours|--theirs, mientras que mantener los trozos no en conflicto de ambos lados en su lugar, es posible que desee recurrir a git merge-file; ver detalles en esta respuesta.

 9
Author: jakub.g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:29