2010-06-23 26 views
6

I que tiene una confusión acerca de un comportamiento git en particular:git renombrar/eliminar la confusión

A continuación se presentan los pasos y situación (la lista de comandos también se dan más adelante):

  1. Tengo dos ramas: master y XBranch
  2. Hay un archivo src/a.txt en ambos. Su contenido es "Contenido anterior"
  3. En XBranch cambio el nombre de src/a.txt a src/b.txt, usando: mv, git rm, git add.
  4. En el principal, cambie el nombre del archivo a.txt. Durante cometer hice git rm src/a.txt, pero se olvidó de hacer git add src/b.txt En maestra que hago: git rm src/a.txt y git commit

  5. en el maestro, puedo editar el contenido del archivo a b.txt "New Content

  6. En maestra que hago y git add src/b.txtgit commit
  7. En maestra que hago: git merge XBranch

el archivo conflictos src/B.txt, lo cual es perfectamente ONU comprensible Pero el contenido es "Old Content". ¿Por qué?

Por qué no es algo así como:

<<<<<<< HEAD 
New Content 
======= 
Old content 
>>>>>>> XBranch 

Lista de comandos:

[email protected] d:/merge_temp/test/case2 
$ mkdir source 

[email protected] d:/merge_temp/test/case2 
$ git init 
Initialized empty Git repository in d:/merge_temp/test/case2/.git/ 

[email protected] d:/merge_temp/test/case2 (master) 
$ mkdir src 

[email protected] d:/merge_temp/test/case2 (master) 
$ vi src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ cat src/a.txt 
Old Content 

[email protected] d:/merge_temp/test/case2 (master) 
$ git add src/ 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master (root-commit) 148500e] added src/a.txt 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git branch XBranch 

[email protected] d:/merge_temp/test/case2 (master) 
$ git checkout XBranch 
Switched to branch 'XBranch' 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ mv src/a.txt src/b.txt 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git rm src/a.txt 
rm 'src/a.txt' 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git add src/b.txt 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git commit 
[XBranch b3ff8fa] changed a.txt to b.txt in XBranch 
1 files changed, 0 insertions(+), 0 deletions(-) 
rename src/{a.txt => b.txt} (100%) 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git checkout master 
Switched to branch 'master' 

[email protected] d:/merge_temp/test/case2 (master) 
$ mv src/a.txt src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git rm src/a.txt 
rm 'src/a.txt' 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master bfeaecb] removed src/a.txt 
1 files changed, 0 insertions(+), 1 deletions(-) 
delete mode 100644 src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ vi src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ cat src/b.txt 
New Content 

[email protected] d:/merge_temp/test/case2 (master) 
$ git add src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master 2361d5e] changed content of b.txt 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git merge XBranch 
CONFLICT (rename/delete): Rename src/a.txt->src/b.txt in XBranch and deleted in HEAD 
Automatic merge failed; fix conflicts and then commit the result. 

[email protected] d:/merge_temp/test/case2 (master|MERGING) 
$ cat src/b.txt 
Old Content 

Respuesta

6

hay un conflicto, pero no sobre el archivo contenido. Se trata del contenido árbol.

  • En un árbol, el directorio case2 (en el maestro), hay un archivo b.txt
  • nueva en el mismo directorio (en XBranch), hay una renombró archivo a.txt => b.txt

Cuando resuelve el conflicto, de hecho está eligiendo un archivo o el otro (no una línea dentro del archivo). De ahí el "Contenido antiguo" en el archivo resultante .


El PO se suma en los comentarios:

Pero entonces, ¿cómo lógicamente se diferencia de la siguiente situación:

  1. agregar un archivo a.txt en master con "contenido antiguo" y cometerlo
  2. Agrego un archivo a.txt en XBranch con "Nuevo contenido" y lo confirmo.
  3. Combino XBranch en master. ¡Esta vez muestra ambos contenidos en ese archivo!

Esta vez, los dos árboles (el directorio case2 en ramas master y XBranch) referencia a un archivo nuevo a.txt: su contenido quedan fusionadas, la resolución de conflictos . Antes, había un conflicto entre una a.txt ( rebautizada como b.txt) y una nueva b.txt: ambos archivos no pueden existir en la misma rama , una opción (de archivo, no de contenido de archivo) tenía hacerse.

En el paso 4 de mi pregunta, si lo hago "git rm" y "git add" en un solo cometen, funciona como espero! No lo entiendo ahora. ¿Cómo puedo predecir cuándo el archivo tendrá ambos contenidos? Cuando solo tendrá el contenido de XBranch y cuándo tendrá el contenido de master?

Esto significa que:

  • en lugar de combinar XBranch (a.txt renombró como b.txt) a master cometer con un nuevo b.txt de la etapa 6 (conflicto de árbol),
  • se fusionaría XBranch (a.txt renombrado como b.txt) con el maestro del nuevo paso 4 (a.txttambién se le cambió el nombre a como b.txt): mismo contenido de árbol, pero diferente contenido de blobs: conflicto de líneas.

Dicho esto, el OP todavía piensa que no debe haber un error:

+0

Pero entonces, ¿cómo lógicamente se diferencia de la siguiente situación : 1. Agrego un archivo a.txt en el maestro con "Contenido antiguo" y lo confirmo. 2. Agrego un archivo a.txt en XBranch con "Nuevo contenido" y lo confirmo. 3. Combino XBranch en el maestro. ¡Esta vez muestra ambos contenidos en ese archivo! – Sabya

+0

@Sabya: esta vez, ambos árboles (el directorio 'case2' en las ramas' master' y 'XBranch') hacen referencia a un * nuevo * archivo' a.txt': su contenido se fusiona, con resolución de conflictos. Antes, había un conflicto entre ** ** a.txt' ** (renombrado como 'b.txt') y un nuevo **' b.txt' **: ambos archivos no podían existir en la misma rama, una elección (de archivo, no de contenido de archivo) tuvo que hacerse. – VonC

+0

En el paso 4 de mi pregunta, si hago "git rm" y "git add" en una sola confirmación, ¡funciona como espero! No entiendo eso ahora. ¿Cómo puedo predecir cuándo el archivo tendrá ambos contenidos? ¿Cuándo solo tendrá el contenido de XBranch y cuándo tendrá el contenido de master? – Sabya