Yo tenía una cosa interesante usar git, preguntaba si alguien podría explicar a mí para que yo pueda entender mejor.

Cuando se realiza una combinación de varias ramas (a,B),

git merge A B

falla como no-avance rápido, mientras que

git merge B A

funcionado bien. ¿Por qué sería?

  • Qué tipo de conflictos sacaste? Creo que en general esto va a ser porque el cambio realizado por B hizo Una más fáciles de combinar, por ejemplo, Un tratado de parche de un archivo que no existe hasta que se cambió de nombre a ese nombre en B.

1 Comentario

  1. 47

    Supongamos que a es una estricta directo niño de la rama actual. A continuación, supongamos que B es un estricto directo niño de Un.

    El pulpo a la mezcla, que los procesos de jefes dado como argumentos de izquierda a derecha, de forma incremental con respecto al árbol de, pero de forma independiente con respecto al índice de se realiza correctamente sin conflicto si se trata de aplicar la B y, a continuación, Un, pero se encuentra con un conflicto si se hace la conversión.

    Como por la git-merge manual, sección COMBINACIÓN de ESTRATEGIAS:

    octopus
       This resolves cases with more than two heads, but refuses to do a
       complex merge that needs manual resolution.
    

    Por ejemplo:

     ~                 $ git init testdir && cd testdir && echo "This is C" > myfile
     Initialized empty Git repository in /home/huitseeker/testdir/.git/
    
     ~/testdir         $ git add myfile && git commit -m "C" 
     [master (root-commit) f0c8c82] C
      1 files changed, 1 insertions(+), 0 deletions(-)
      create mode 100644 myfile
    
     ~/testdir(master) $ git checkout -b "A" && echo "This is A1" > myfile
     Switched to a new branch 'A'
     ~/testdir(A)      $ git commit -m "A1" myfile
     [A ac5b51c] A1
      1 files changed, 1 insertions(+), 1 deletions(-)
    
     ~/testdir(A)      $ git checkout -b "B" && echo "This is B1" >> myfile
     Switched to a new branch 'B'
     ~/testdir(B)      $ git commit -m "B1" myfile
     [B 5bc838c] B1
      1 files changed, 1 insertions(+), 0 deletions(-)
    
     ~/testdir(B)      $ git checkout master
     Switched to branch 'master'
     ~/testdir(master) $ git merge B A
     Fast-forwarding to: B
     Already up-to-date with A
     Merge made by octopus.
      myfile |    3 ++-
      1 files changed, 2 insertions(+), 1 deletions(-)
    
     ~/testdir(master) $ git reset --hard HEAD^^^
     HEAD is now at f0c8c82 C
     ~/testdir(master) $ git merge A B
     Fast-forwarding to: A
     Fast-forwarding to: B
     error: Entry 'myfile' would be overwritten by merge. Cannot merge.
     Merge with strategy octopus failed.
    
     ~/testdir(master) $ cat myfile
     This is A1
    

    De hecho, cuando el avance rápido a Una, la etiqueta de maestro no ha sido empujado hacia adelante, a pesar de que el árbol tiene.

     ~/testdir(master) $ git status
     # On branch master
     # Changes to be committed:
     #   (use "git reset HEAD <file>..." to unstage)
     #
     #  modified:   myfile
     #
    

    Si, mirando el código de lo que el pulpo a la integración, puedo hacerlo manualmente (mirar arriba para los hash):

     ~/testdir(master) $ git reset --hard f0c8c82
     HEAD is now at f0c8c82 C     
     ~/testdir(master) $ git read-tree -u -m f0c8c82 ac5b51c
     ~/testdir(master) $ git read-tree -u -m f0c8c82 5bc838c
     error: Entry 'myfile' would be overwritten by merge. Cannot merge.
    

    En la otra dirección (merge B A), ahora, si nos fijamos de nuevo en el código de combinación de pulpo, intenta detectar la rama en la que estamos tratando de agregar ya está en el árbol (segunda case de la for bucle). De hecho, en la combinación de Una, se ve ac5b51c (un.k.una. Una cabeza) es el ancestro común de a y B, y aborta sin hacer el segundo read-tree.

    Este comportamiento es coherente con la nueva versión de git : a pesar de que me he dicho a v. 1.3.1, este todavía está sucediendo con mi versión.

     ~/testdir(master) $ git --version
     git version 1.7.5.4
    

    tl;dr : usted quiere que su pulpo a la combinación de las ramas para tocar distintos archivos

    • Su vínculo realmente no se explica a qué te refieres directa de aguas arriba. Mi mejor conjetura es que te refieres a la combinación sería un fast-forward, es decir, B es un «estricto directo de aguas arriba» de Un medio que es un ancestro de B. En ese caso, su ejemplo no funciona. En el primer caso, las uniones son avanza, y todo es bueno, y en el segundo caso, el primero es un avance rápido y el segundo es ya fusionado y, por tanto, un no-op, no es una causa de conflictos.
    • Tienes razón, yo estaba extremadamente impreciso. He editado mi respuesta para reflejar sus comentarios, agrega el crucial indicación de que el pulpo no se actualiza la cabeza índice entre las aplicaciones de combinación, y se incluye un ejemplo mínimo.
    • Impresionante, ahora que es una respuesta.
    • Enlace a codesearch.google.com está muerto (404).

Dejar respuesta

Please enter your comment!
Please enter your name here