¿`Git merge -s ours` supera a las fusiones normales?

En git , ¿cuál sería el comportamiento esperado si tengo un compromiso que se fusionó en dos twigs utilizando diferentes estrategias de fusión, y luego fusionar esas dos twigs juntas?

Quiero saber qué cambios reales de las twigs terminan en la twig resultante, y por qué.

Estoy específicamente interesado en el comportamiento de git merge -s ours comparación con los commit fusionados normalmente.

Hice un experimento rápido, y en este ejemplo simplificado, la twig que tiene una confirmación omitida (como en "aparece en los loggings, pero los parches se omiten") debido a la git merge -s ours siempre gana git merge -s ours (que es el comportamiento que yo quiero), pero no estoy seguro si puedo confiar en eso (suponiendo que no haya más ediciones potencialmente conflictivas en las mismas líneas en el file).

 $ git init Initialized empty Git repository in /sandbox/foo/.git/ $ echo "qwerty"> foo.txt $ git add foo.txt $ git commit -m "Initial commit" [master (root-commit) 1f58b74] Initial commit 1 file changed, 1 insertion(+) create mode 100644 foo.txt $ git checkout -b CLEAN_SLATE Switched to a new branch 'CLEAN_SLATE' $ git checkout -b FEAT_BRANCH_A Switched to a new branch 'FEAT_BRANCH_A' $ git checkout -b FEAT_BRANCH_B Switched to a new branch 'FEAT_BRANCH_B' $ git checkout -b ODD_COMMIT_BRANCH Switched to a new branch 'ODD_COMMIT_BRANCH' $ echo "asdf">> foo.txt $ git add -u $ git commit -m "Odd commit" [ODD_COMMIT_BRANCH ba8aab3] Odd commit 1 file changed, 1 insertion(+) $ git checkout FEAT_BRANCH_A Switched to branch 'FEAT_BRANCH_A' $ # skip over odd commit in branch A $ git merge -m "Merge -s ours of ODD_COMMIT_BRANCH" -s ours ODD_COMMIT_BRANCH Merge made by the 'ours' strategy. $ # include odd commit in branch B $ git checkout FEAT_BRANCH_B Switched to branch 'FEAT_BRANCH_B' $ git merge -m "Normal merge of ODD_COMMIT_BRANCH" ODD_COMMIT_BRANCH Updating 1f58b74..ba8aab3 Fast-forward (no commit created; -m option ignonetworking) foo.txt | 1 + 1 file changed, 1 insertion(+) $ git checkout master Switched to branch 'master' $ # experiment one: First merge A, then B $ git merge -m "Merge FEAT_BRANCH_A" FEAT_BRANCH_A Updating 1f58b74..0c15b0c Fast-forward (no commit created; -m option ignonetworking) $ git log --graph --oneline * 0c15b0c Merge -s ours of ODD_COMMIT_BRANCH |\ | * ba8aab3 Odd commit |/ * 1f58b74 Initial commit $ cat foo.txt qwerty $ git merge -m "Merge FEAT_BRANCH_B" FEAT_BRANCH_B Already up-to-date. $ git log --graph --oneline * 0c15b0c Merge -s ours of ODD_COMMIT_BRANCH |\ | * ba8aab3 Odd commit |/ * 1f58b74 Initial commit $ cat foo.txt qwerty $ # gives qwerty, so A wins. $ # experiment two: First merge B, then A $ git reset --hard CLEAN_SLATE HEAD is now at 1f58b74 Initial commit $ git merge -m "Merge FEAT_BRANCH_B" FEAT_BRANCH_B Updating 1f58b74..ba8aab3 Fast-forward (no commit created; -m option ignonetworking) foo.txt | 1 + 1 file changed, 1 insertion(+) $ git log --graph --oneline * ba8aab3 Odd commit * 1f58b74 Initial commit $ cat foo.txt qwerty asdf $ git merge -m "Merge FEAT_BRANCH_A" FEAT_BRANCH_A Updating ba8aab3..0c15b0c Fast-forward (no commit created; -m option ignonetworking) foo.txt | 1 - 1 file changed, 1 deletion(-) $ git log --graph --oneline * 0c15b0c Merge -s ours of ODD_COMMIT_BRANCH |\ | * ba8aab3 Odd commit |/ * 1f58b74 Initial commit $ cat foo.txt qwerty $ # still gives qwerty, so A still wins. $ 

En su segundo experimento, la razón por la cual FEAT_BRANCH_A "gana" tiene poco que ver con ours estrategia de fusión; la combinación es un avance rápido , por lo que las diferencias entre las twigs no se consideran en absoluto.

Si realiza la fusión final con --no-ff para forzar una combinación de tres vías en lugar de un avance rápido, el tree resultante es el mismo, pero el motivo por el que obtiene el mismo tree merece un examen más detallado. La fusión-base para la combinación de tres vías es ba8aab3 Odd commit (que también es HEAD ) y git observa que la diferencia entre ba8aab3 y FEAT_BRANCH_A es:

 diff --git a/foo.txt b/foo.txt index 0a93b8c..19f0805 100644 --- a/foo.txt +++ b/foo.txt @@ -1,2 +1 @@ qwerty -asdf 

Esta diferencia se debe a que utilizó la estrategia ours en un momento anterior, pero git no lo sabe porque no se registra la información sobre qué estrategia se utilizó para producir una confirmación de fusión. FEAT_BRANCH_A solo "gana" en tu experimento porque así es como se ve la diferencia de tres vías en git.

Para resumir: siempre puede confiar en el comportamiento de -s ours cuando usa inmediatamente esa estrategia. Si realiza una combinación normal en tres direcciones, el resultado depende de lo que diga la diferencia, y un avance rápido será un avance rápido (a less que se suprima con --no-ff ).

Para ver los cambios fusionar está trabajando con, do git diff A...B y git diff B...A (tres puntos). Eso mostrará la diferencia entre B (resp. A ) y la base de fusión. Cómo se produjo la fusión base es irrelevante. Su estrategia de fusión determina cómo se concilian las diferencias actuales, y ese es el final de su propia relevancia. Si comtesting su gráfico contra las diferencias simétricas que deberían ayudar a comprender los resultados.