Estoy en medio de un rebase después de a 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 combinación y acepto manualmente todos los cambios "sus" o "mis". Sin embargo, sospecho que me falta un comando git conveniente.
Además, 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.
git
git-rebase
git-merge-conflict
Steven Wexler
fuente
fuente
Respuestas:
Para cada archivo en conflicto que obtenga, puede especificar
De los
git checkout
documentosfuente
git rebase -s recursive -X <ours/theirs>
ogit merge -s recursive -X <ours/theirs>
. Tenga en cuenta que para un rebase, "lo nuestro" y "lo suyo" se invierten de lo que son durante una fusión. Probablemente también podrías usar un archivo / shell glob, comogit checkout --theirs -- *.txt
.ours/theirs
rebase me estaba volviendo loco! (Tiene sentido ahora que pienso en cómo funciona realmente un rebase, pero no del todo intuitivo).git checkout --outs -- "**/*.csproj"
harás lo que quieres decir. Lo mismo es cierto, por ejemplo, paragit lfs track "*.jpg"
. Si tiene algunos archivos jpg en su CWD, sin las comillas, solo estos serán rastreados.A pesar de que esta pregunta es respondida, brinda 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 en realidad está aceptando los cambios actuales de su rama en la rama remota.Git Merge
Para fusionar , el significado de
theirs
yours
se invierte. Por lo tanto, para obtener el mismo efecto durante una fusión , es decir, mantener los cambios de rama actuales (ours
) sobre la rama remota que se está fusionando (theirs
).fuente
Tenga en cuenta que
git checkout --ours|--theirs
va a sobrescribir los archivos por completo , ya sea por la eleccióntheirs
o laours
versión, que podría ser o no ser lo que quiere hacer (si tiene cualquier cambio no conflictivas que vienen desde el otro lado, se perderán).Si, por el contrario, desea realizar una fusión tripartita en el archivo y solo resuelve los trozos en conflicto utilizando
--ours|--theirs
, mientras mantiene a los trozos no conflictivos de ambos lados en su lugar, puede recurrir agit merge-file
; ver detalles en esta respuesta .fuente
example.txt
en laours
versión, uno está en conflicto (también cambiado en latheirs
revisión), otro no está en conflicto. Si lo hacegit checkout --theirs example.txt
, leerá ciegamente todo el archivo en latheirs
revisión y se perderá la parte no conflictiva del diff.git checkout --merge <path>
.