2010-06-23 5 views
6

j'avoir une confusion au sujet d'un comportement git particulier:git renommage/supprimer la confusion

Voici les étapes et de la situation (la liste des commandes sont également donnés plus tard):

  1. J'ai deux branches: master et XBranch
  2. Il existe un fichier src/a.txt dans les deux. Son contenu est "ancien contenu"
  3. Dans XBranch je renommer src/a.txt en src/b.txt, en utilisant: mv, git rm, git add.
  4. Dans le maître renommer le fichier a.txt. Pendant que je l'ai fait commettre git rm src/a.txt mais il a oublié de faire git add src/b.txt En maître que je fais: git rm src/a.txt et git commit

  5. En maître, je modifier le contenu du fichier b.txt à "New Content

  6. Dans maître et je git add src/b.txtgit commit
  7. En maître que je fais: git merge XBranch

Le fichier des conflits src/de B.txt, ce qui est tout à fait un compréhensible. Mais le contenu est "Old Content". Pourquoi?

Pourquoi pas est-il quelque chose comme:

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

Liste des commandes:

[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 

Répondre

6

Il y a un conflit, mais pas sur le contenu du fichier . Il s'agit du arbre contenu.

  • Dans un arbre, le répertoire case2 (en master), il y a un nouveau fichierb.txt
  • dans le même répertoire (en XBranch), il y a un rebaptisés fichier a.txt => b.txt

Lorsque vous résolvez le conflit, vous choisissez un fichier ou le autre (pas une ligne dans le fichier). D'où le "Vieux Contenu" dans le fichier résultant.


L'OP ajoute dans les commentaires:

Mais alors comment est logiquement différente de la situation suivante:

  1. ajouter un fichier a.txt dans master avec "Contenu ancien" et le commettre.
  2. J'ajoute un fichier a.txt dans XBranch avec "Nouveau contenu" et validez-le. Je fusionne XBranch en master. Cette fois, il montre les deux contenus dans ce fichier!

Cette fois-ci, les deux arbres (le répertoire affaire2 dans les branches master et XBranch) référence un fichier nouveaua.txt: son contenu se fondre, avec la résolution des conflits . Avant, il y avait un conflit entre un a.txt (renommé comme b.txt) et un nouveaub.txt: les deux fichiers ne peuvent pas exister dans la même branche, un choix (de fichier, pas de contenu du fichier) a être fabriqué.

Dans l'étape 4 de ma question, si je fais « git rm » et « git add » dans un seul commettras, il fonctionne comme je le pense! Je ne comprends pas cela maintenant. Comment puis-je prédire quand le fichier aura les deux contenus? Quand il aura juste le contenu de XBranch et quand aura-t-il juste le contenu de master?

Cela signifie que:

  • au lieu de fusionner XBranch (a.txt rebaptisés comme b.txt) à master engager avec une nouvelle b.txt de l'étape 6 (conflit d'arbre),
  • vous fusionneriez XBranch (a.txt renommé en b.txt) avec le maître du nouveau étape 4 (a.txtégalement renommé en tant que b.txt): même contenu d'arborescence, mais différent contenu blob: conflit de lignes.

Cela dit, l'OP pense toujours qu'il doit y avoir un bug:

+0

Mais alors comment est logiquement différente de la situation suivante : 1. J'ajoute un fichier a.txt en master avec "Old Content" et le valide. 2. J'ajoute un fichier a.txt dans XBranch avec "Nouveau contenu" et le valide. 3. Je fusionne XBranch en master. Cette fois, il montre les deux contenus dans ce fichier! – Sabya

+0

@Sabya: cette fois, les deux arbres (le répertoire 'case2' dans les branches' master' et 'XBranch') font référence à un * nouveau * fichier' a.txt': son contenu est fusionné, avec la résolution des conflits. Avant, il y avait un conflit entre un ** 'a.txt' ** (renommé comme' b.txt') et un nouveau '' b.txt' **: les deux fichiers ne peuvent pas exister dans la même branche, un choix (du fichier, pas du contenu du fichier) a dû être fait. – VonC

+0

A l'étape 4 de ma question, si je fais "git rm" et "git add" dans un seul commit, cela fonctionne comme je l'espère! Je ne comprends pas cela maintenant. Comment puis-je prédire quand le fichier aura les deux contenus? Quand il aura juste le contenu de XBranch et quand aura-t-il juste le contenu de master? – Sabya