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):
- J'ai deux branches: master et XBranch
- Il existe un fichier src/a.txt dans les deux. Son contenu est "ancien contenu"
- Dans XBranch je renommer src/a.txt en src/b.txt, en utilisant:
mv
,git rm
,git add
. 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 fairegit add src/b.txt
En maître que je fais:git rm src/a.txt
etgit commit
En maître, je modifier le contenu du fichier b.txt à "
New Content
- Dans maître et je
git add src/b.txt
git commit
- 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
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
@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
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