Sospecho que estás confundido aquí porque es fundamentalmente confuso. Para empeorar las cosas, todo lo nuestro / lo suyo cambia de roles (se vuelve hacia atrás) cuando estás haciendo un rebase.
En última instancia, durante una git merge
, la rama "nuestro" se refiere a la rama que está fusionando en :
git checkout merge-into-ours
y la rama "suya" se refiere a la rama (única) que está fusionando:
git merge from-theirs
y aquí "nuestro" y "ellos" tiene sentido, ya que a pesar de "ellos" es probablemente la suya de todos modos, "el suyo" no es el que usted estaba en cuando ejecutó git merge
.
Si bien el uso del nombre real de la sucursal puede ser bastante bueno, se desmorona en casos más complejos. Por ejemplo, en lugar de lo anterior, puede hacer:
git checkout ours
git merge 1234567
donde te estás fusionando por raw commit-ID. Peor aún, incluso puedes hacer esto:
git checkout 7777777 # detach HEAD
git merge 1234567 # do a test merge
en cuyo caso no hay nombres de sucursal involucrados!
Creo que es de poca ayuda aquí, pero de hecho, en gitrevisions
sintaxis , puede referirse a una ruta individual en el índice por número, durante una fusión en conflicto
git show :1:README
git show :2:README
git show :3:README
La etapa n. ° 1 es el antecesor común de los archivos, la etapa n. ° 2 es la versión de la rama de destino y la etapa n. ° 3 es la versión de la que se está fusionando.
La razón por la cual se intercambian las nociones "nuestra" y "suya" rebase
es que el rebase funciona haciendo una serie de selecciones de cereza, en una rama anónima (modo HEAD separado). La rama de destino es la rama anónima, y la rama de fusión es la rama original (previa al rebase): entonces "- nuestro" significa que el rebase anónimo se está construyendo mientras que "- el suyo" significa "nuestra rama está rebaseada" .
En cuanto a la entrada gitattributes: podría tener un efecto: "el nuestro" realmente significa "usar la etapa # 2" internamente. Pero como observa, en realidad no está en su lugar en ese momento, por lo que no debería tener un efecto aquí ... bueno, no a menos que lo copie en el árbol de trabajo antes de comenzar.
Además, por cierto, esto se aplica a todos los usos nuestros y los suyos, pero algunos están en un nivel de archivo completo ( -s ours
para una estrategia de fusión; git checkout --ours
durante un conflicto de fusión) y algunos son pieza por pieza ( -X ours
o -X theirs
durante un -s recursive
unir). Lo que probablemente no ayuda con nada de la confusión.
Sin embargo, nunca se me ocurrió un nombre mejor para estos. Y: ¡vea la respuesta de VonC a otra pregunta, donde git mergetool
introduce aún más nombres para estos, llamándolos "local" y "remoto"!
El ' nuestro ' en Git se refiere a la rama de trabajo original que tiene una parte autorizada / canónica de la historia de git.
El ' suyo ' se refiere a la versión que tiene el trabajo con el fin de ser porcentualizada (cambios para que se reproduzca en la rama actual).
Esto puede parecer intercambiado a personas que no son conscientes de que hacer un rebase (p
git rebase
. Ej. ) En realidad es suspender su trabajo (que es suyo ) para volver a reproducir la historia canónica / principal que es nuestra , porque estamos cambiando nuestro cambios como trabajo de terceros.La documentación para
git-checkout
se aclaró más en Git> = 2.5.1 segúnf303016
commit :Porque
git-merge
se explica de la siguiente manera:Además, aquí se explica cómo usarlos:
Entonces, a veces puede ser confuso, por ejemplo:
git pull origin master
donde-Xours
está nuestro local,-Xtheirs
es su sucursal (remota)git pull origin master -r
donde-Xours
está el de ellos (remoto),-Xtheirs
es nuestroEntonces, el segundo ejemplo es opuesto al primero, porque estamos cambiando nuestra rama por encima de la remota, por lo que nuestro punto de partida es remoto y nuestros cambios se tratan como externos.
Similar para las
git merge
estrategias (-X ours
y-X theirs
).fuente
git merge
, perogit pull
ygit checkout
como ejemplo. Si desea usar este parámetro congit merge
, debe usar-X ours
. Todavía puede usar la--ours
sintaxis paragit checkout
. He aclarado la respuesta aún más.Sé que esto ha sido respondido, pero este problema me confundió tantas veces que he puesto un pequeño sitio web de referencia para ayudarme a recordar: https://nitaym.github.io/ourstheirs/
Aquí están los conceptos básicos:
Fusiones
Si desea seleccionar la versión en
master
:Si desea seleccionar la versión en
feature
:Rebases:
Si desea seleccionar la versión en
master
:Si desea seleccionar la versión en
feature
:(Esto es para archivos completos, por supuesto)
fuente
Así que si usted está en la rama de la liberación / 2.5 y combinar rama / nuevos botones de función en ella, a continuación, el contenido que se encuentra en la liberación / 2.5 es lo nuestro se refiere y el contenido que se encuentra en / nuevos botones de función es lo suyo se refiere a. Durante una acción de fusión, esto es bastante sencillo.
El único problema del que se enamora la mayoría de las personas es el caso de rebase . Si realiza una re-base en lugar de una fusión normal, los roles se intercambian. ¿Como es que? Bueno, eso es causado únicamente por la forma en que funciona el rebase. Piensa en rebase para trabajar así:
Por supuesto, eso no es realmente lo que está sucediendo, pero es un buen modelo mental para mí. Y si observa 2 y 3, comprenderá por qué los roles se intercambian ahora. A partir de 2, su rama actual es ahora la rama del servidor sin ninguno de sus cambios, por lo que esta es la nuestra (la rama en la que se encuentra). Los cambios que realizó ahora están en una rama diferente que no es la actual ( BranchX ) y, por lo tanto, estos cambios (a pesar de ser los cambios que realizó) son suyos (la otra rama utilizada en su acción).
Eso significa que si te unes y quieres que tus cambios siempre ganen, le dirías a git que siempre elija "el nuestro", pero si cambias de opinión y quieres que todos tus cambios siempre ganen, le dices a git que siempre elija "el suyo".
fuente
Sé que no explica el significado, pero me hice una pequeña imagen, como referencia para recordar cuál usar:
¡Espero eso ayude!
PD: marque también el enlace en la respuesta de Nitay 🙂
fuente
Publicaré mi memorando aquí, porque tengo que volver aquí una y otra vez.
ESCENARIO 1. Desarrollador normal: Eres un desarrollador que no puede fusionarse
master
y solo tiene que jugar confeature
ramas.Caso 1: el maestro es un rey. Desea actualizar su
feature
rama (= rebase amaster
), porquemaster
contiene nuevas actualizaciones de dependencias y desea sobrescribir sus modestos cambios.Caso 2: eres un rey. Desea cambiar su
feature
rama a losmaster
cambios. Pero hizo más de lo que sus colegas hicieron y quiere usar sus propios cambios en una prioridad.IMPORTANTE: Como puede ver, los desarrolladores normales deberían preferir
rebase
y repetirlo todas las mañanas como ejercicios / café.ESCENARIO 2. Merging-sensei: Usted es un líder de equipo y desea fusionar otras ramas e impulsar un resultado combinado directamente a un maestro.
master
es una rama que cambiarás.Caso 1: el maestro es un rey Quiere fusionar una sucursal de terceros, pero
master
es una prioridad.feature
es una rama que tu superior hizo.Caso 2: los nuevos cambios son un rey Cuando su desarrollador senior lanzó un genial
feature
y desea sobrescribir el viejo s ** t en lamaster
rama.RECUERDE: Recordar a medianoche cuál elegir: SIEMPRE
master
esours
. Ytheirs
es algofeature
que ellos han hecho.fuente
Del
git checkout
uso de:Al resolver conflictos de fusión, puede hacerlo
git checkout --theirs some_file
ygit checkout --ours some_file
restablecer el archivo a la versión actual y las versiones entrantes respectivamente.Si lo ha hecho
git checkout --ours some_file
ogit checkout --theirs some_file
desea restablecer el archivo a la versión de combinación de 3 vías, puede hacerlogit checkout --merge some_file
.fuente