2016-12-10 2 views
2

Avoir un doute basique sur la dérivation git et fusionner. Une branche peut-elle être fusionnée sans aucune modification dans le maître. Si oui, qu'arrive-t-il aux changements de delta qui existent entre maître et branche. Est-ce que cela sera remplacé par les changements de branche maître. Reportez-vous au scénario ci-dessous:Comment fusionner la branche sans changement dans la branche master dans git?

J'ai deux branches master et BugBranch.

ÉTAPE 1:

C--B--A (master) 
     | 
     X (branch) 

prit une branche de maître dit BugBranch. Maintenant, j'ai un fichier TestMerge.java.

public static void main(String[] args){ 
... 
... 
callSomeMethod(); 
    switch(decision) 
    { 
    case A: 
     do_something 
     break; 
    case B: 
     do_something 
     break; 
    } 
} 

Donc, à l'étape 1, le maître et BugBranch ont la même apparence.

ÉTAPE 2: Le fichier (TestMerge) est modifié dans master comme ci-dessous. (Juste enlevé le commutateur)

public static void main(String[] args){ 
... 
... 
callSomeMethod(); 
} 

C--B--A--1 (master) 
     | 
     X  (branch) 

ÉTAPE 3: Le problème est lorsque je tente de fusionner la branche avec le maître. Attendez-vous à un conflit de fusion dans le fichier, car il existe un delta à coup sûr et que vous voulez conserver les changements dans BugBranch. Mais la chose étrange est que, il est remplacé par le maître change.

Nous avons essayé les commandes ci-dessous

git checkout maître

git fusion BugBranch

C'est vraiment déroutant!

+0

Avez-vous fait des changements avec ce fichier sur BugBranch? – chaoluo

+2

Il n'y a pas de deltas dans Git. Chaque commit est un instantané complet du répertoire de travail. Et la branche est seulement un pointeur à commettre, notant plus. Donc, si vous venez de ramifier 'master', alors il n'y a pas de' X', la branche 'BugBranch' pointera sur 'A'. Et quand vous fusionnez commit 'A' dans commit' 1', c'est non-op, puisque commit 'A' fait déjà partie de l'historique pour commit' 1'. – PetSerAl

+0

Avez-vous fait un changement sur la branche 'X' (le BugBranch)? – axiac

Répondre

2

Une branche Git est simplement un pointeur sur un commit. La branche X dans vos points de questions à commettre A et pour de nombreuses opérations Git, X peut être utilisé au lieu de A et vice versa et vous obtenez le même résultat. Ce n'est que par sa création qu'une branche Git ne produit aucun changement dans le référentiel. Tant que vous ne modifiez pas les fichiers et que vous ne les validez pas, la branche ne diverge pas de sa branche source (master dans votre cas).

Vous modifiez certains fichiers et validés sur master (commit 1). Si vous n'avez rien changé et que vous ne commettez rien sur la branche X, il pointe toujours vers le commit A qui se trouve dans l'historique de la branche 1 (en fait, c'est son parent).

Lorsque vous voulez engager branche X dans la branche master, Git détecte que la branche X est dans le passé de la branche master; à partir de master, si Git saute plusieurs fois d'un commit à un de ses parents il peut atteindre le commit pointé par la branche X (qui est le commit A).

Cela signifie que la branche X ne contient rien qui ne figure pas déjà dans la branche master. En d'autres termes, il n'y a rien à fusionner et Git vous informe de cette situation avec le message "Déjà à jour".

D'autre part, si vous souhaitez fusionner master en X, parce que master est dans l'avenir de X, Git transforme l'opération de fusion dans une opération « avance rapide ». Cela signifie qu'il ne crée pas un nouveau commit de fusion inutile et pousse simplement la branche X (la branche que vous fusionnez) vers l'avant jusqu'à atteindre le commit master (la branche à partir de laquelle vous avez fusionné).

Vous pouvez forcer Git à créer un commit de fusion en utilisant l'indicateur --no-ff dans la ligne de commande git merge mais, sauf pour des situations vraiment exceptionnelles, vous n'avez aucune raison de le faire. Il produit un commit qui n'introduit aucune modification dans les fichiers.

+0

Oui - non-ff dit aussi ** Déjà à jour **. Donc, fondamentalement, il ne sert à rien de fusionner ces deux branches, puisque les deux sont identiques? – shashantrika

+0

Cela dépend de la direction de la fusion ('X' dans' master' ne produit rien de nouveau, 'master' dans' X' devrait avancer rapidement 'X' vers' master'). Utilisez ['git branch -v'] (https://git-scm.com/docs/git-branch) pour savoir si les deux branches pointent vers le même commit. Ou mieux essayer un client GUI Git et inspecter visuellement la situation. – axiac