git renommer/supprimer la confusion
Je avoir une confusion au sujet d'un particulier git comportement:
Voici les étapes et de la situation (la liste des commandes sont également donné plus tard):
- J'ai deux branches: le maître et XBranch
- Il y a un fichier src/a.txt dans deux d'entre eux. C'est le contenu qui est "Contenu"
- Dans XBranch-je renommer src/a.txt pour src/b.txt à l'aide de:
mv
,git rm
,git add
. -
En maître renommer le fichier a.txt. Au cours de commettre je n'ai
git rm src/a.txt
mais oublié de le fairegit add src/b.txt
En master, je n':git rm src/a.txt
etgit commit
-
En master, j'ai modifier le contenu du fichier b.txt "
New Content
- En maître, je ne
git add src/b.txt
etgit commit
- En maître, je n':
git merge XBranch
Le fichier src/b.txt les conflits, ce qui est parfaitement compréhensible.
Mais le contenu est "Old Content
". Pourquoi?
Pourquoi pas est quelque chose comme:
<<<<<<< HEAD
New Content
=======
Old content
>>>>>>> XBranch
Liste de Commandes:
sabya@SABYA-PC d:/merge_temp/test/case2
$ mkdir source
sabya@SABYA-PC d:/merge_temp/test/case2
$ git init
Initialized empty Git repository in d:/merge_temp/test/case2/.git/
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ mkdir src
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ vi src/a.txt
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ cat src/a.txt
Old Content
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git add src/
sabya@SABYA-PC 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
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git branch XBranch
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git checkout XBranch
Switched to branch 'XBranch'
sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
$ mv src/a.txt src/b.txt
sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
$ git rm src/a.txt
rm 'src/a.txt'
sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
$ git add src/b.txt
sabya@SABYA-PC 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%)
sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
$ git checkout master
Switched to branch 'master'
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ mv src/a.txt src/b.txt
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git rm src/a.txt
rm 'src/a.txt'
sabya@SABYA-PC 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
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ vi src/b.txt
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ cat src/b.txt
New Content
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git add src/b.txt
sabya@SABYA-PC 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
sabya@SABYA-PC 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.
sabya@SABYA-PC d:/merge_temp/test/case2 (master|MERGING)
$ cat src/b.txt
Old Content
OriginalL'auteur Sabya | 2010-06-23
Vous devez vous connecter pour publier un commentaire.
Il y a un conflit, mais pas sur le fichier de contenu. Il s'agit de la
arbre contenu.
case2
répertoire (en master), il y a un nouveau fichierb.txt
a.txt => b.txt
Lorsque vous êtes en train de résoudre le conflit, vous êtes en effet de choisir un fichier ou l'
d'autres (pas une ligne dans le fichier). D'où le "Contenu" dans la
fichier.
L'OP ajoute dans les commentaires:
Ce temps, les deux arbres (le case2 répertoire dans les branches
master
etXBranch
)référence à un nouveau fichier
a.txt
: son contenu sont fusionnés, avec des conflitsla résolution. Avant, il y avait un conflit entre une
a.txt
(renommé comme
b.txt
) et un nouveau b.txt: les deux fichiers ne peuvent pas exister dans lala même branche, un choix (de fichier, pas de fichier de contenu) ont dû être effectués.
Qui signifie que:
XBranch
(a.txt
rebaptiséb.txt
) àmaster
commettreavec un nouveau
b.txt
à partir de l'étape 6 (conflit d'arbre),XBranch
(a.txt
rebaptiséb.txt
) avec le maître de la nouvelleétape 4 (
a.txt
également renommé commeb.txt
): même contenu de l'arbre, mais différentscontenu blob: conflit de lignes.
Cela étant dit, l'OP considère toujours qu'il doit y avoir un bug:
Remarque: Git 2.18 (T2 2018) les changements que la détection de conflit, avec un rapport de fusion récursive.
Voir s'engager 6e7e027 (19 Avril 2018) par Élie Newren (
newren
).cette fois, les deux arbres (le
case2
répertoire dans les branchesmaster
etXBranch
) de référence d'un fichiera.txt
: son contenu sont fusionnés, avec la résolution de conflit. Avant, il y avait un conflit entre unea.txt
(rebaptiséb.txt
) et un nouveaub.txt
: les deux fichiers ne peuvent pas exister dans la même branche, un choix (de fichier, pas de fichier de contenu) ont dû être effectués.Dans l'étape 4 de ma question, si je fais "git rm" et "git add" dans un seul commit, il fonctionne comme prévu! Je ne comprends que maintenant. Comment puis-je prévoir quand le fichier aura à la fois des contenus? Quand il va juste avoir le contenu de XBranch et quand il ont juste le contenu de maître?
signifie que, au lieu de les fusionner
XBranch
(a.txt
rebaptiséb.txt
) à master s'engager avec unb.txt
à partir de l'étape 6 (conflit d'arbre), vous pouvez fusionnerXBranch
(a.txt
rebaptiséb.txt
) avec le maître de la nouvelle étape 4 (a.txt
aussi renommé queb.txt
): même contenu de l'arbre, mais différent contenu blob: conflit de lignes.J'ai signalé ce git liste de diffusion. Une personne à partir de là dit que cela pourrait être un bug. Le contenu des deux fichiers présents dans ce cas peut être un comportement attendu.
OriginalL'auteur VonC