Fusion de 2 branches ensemble dans GIT

132

Je viens juste de commencer à utiliser GIT et je pense que c'est merveilleux, mais je suis un peu confus sur ce que fait la mergecommande.

Disons que nous avons un projet de travail dans la branche "A".

Je rentre chez moi, modifie cette branche et l'enregistre sous "B". Un autre programmeur modifie «A» et l'enregistre sous «C».

Existe-t-il un moyen de fusionner les deux branches «B» et «C» ensemble, puis de valider les modifications en tant que nouvelle branche, disons «D»?

Ou manque-t-il le point de «fusion»?

dingue
la source
pas besoin de «sauvegarder les modifications» dans une autre branche. travailler un A, puis fusionner ces différents A ensemble
tricoter
Je ne suis pas. A serait sur mon ordinateur local, dev1 aurait une copie de A sur son ordinateur et dev2 aurait une copie de A sur son ordinateur. Les deux développeurs apportent des modifications, comment fusionner ces modifications ensemble?
dotty
voir < kernel.org/pub/software/scm/git/docs/git-pull.html >. les développeurs doivent probablement pousser / télécharger leur référentiel quelque part en premier
knittl

Réponses:

197

merge est utilisé pour rapprocher deux (ou plus) branches.

un petit exemple:

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

donc maintenant il y a trois branches séparées (à savoir AB et C) avec des têtes différentes

pour récupérer les modifications de B et C vers A, vérifiez A (déjà fait dans cet exemple), puis utilisez la commande de fusion:

# create an octopus merge
$ git merge B C

votre historique ressemblera alors à ceci:

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

si vous souhaitez fusionner à travers les frontières du référentiel / ordinateur, jetez un œil à la git pullcommande, par exemple à partir du pc avec la branche A (cet exemple créera deux nouveaux commits):

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C
tricot
la source
cela signifie que les deux branches ont changé le même morceau de code. réparer les conflits, git add conflicting_filespuisgit commit
knittl
Dites que le fichier dans A contenait le mot "bonjour", le A l'a modifié en "HELLO" et B l'a modifié en "Hello world". Quel serait le résultat de la fusion de ces fichiers?
dotty
Oups, je veux dire que B l'a modifié et C l'a modifié.
dotty
soyez prudent avec le mot «modifier» qui signifie quelque chose de différent dans git (changer les commits existants). changer un fichier "bonjour" en "bonjour" d'un côté et "Hello World" de l'autre côté entraînera un conflit de fusion
knittl
19
@dotty: Bien que git semble souvent magique, il ne peut pas réellement lire dans vos pensées - si deux branches apportent deux modifications différentes au même contenu, seul un humain peut trouver comment les réconcilier. C'est ce qu'est un conflit de fusion.
Cascabel
48

Si vous souhaitez fusionner les modifications de SubBranch vers MainBranch

  1. vous devriez être sur MainBranch git checkout MainBranch
  2. puis exécutez la commande de fusion git merge SubBranch
Mohamed Shaban
la source
2
@luckytaxi: D'accord, parfois moins c'est plus
Marcelo Scofano
Puis-je annuler cela?
Yohanelly le
0

Cas: si vous devez ignorer la validation de fusion créée par défaut , procédez comme suit.

Dites, une nouvelle branche de fonctionnalité est extraite du maître ayant déjà 2 validations,

  • "Ajouté A", "Ajouté B"

Checkout a new feature_branch

  • "Ajouté C", "Ajouté D"

La branche de fonctionnalité ajoute ensuite deux commits ->

  • "Ajouté E", "Ajouté F"

entrez la description de l'image ici

Maintenant, si vous voulez fusionner les modifications de feature_branch avec master, restez git merge feature_branchassis sur le master.

Cela ajoutera tous les commits dans la branche master (4 dans master + 2 dans feature_branch = total 6) + un commit de fusion supplémentaire quelque chose comme 'Merge branch 'feature_branch''car le master est divergé .

Si vous avez vraiment besoin d'ignorer ces commits (ceux effectués dans FB) et d'ajouter toutes les modifications apportées à feature_branch en un seul commit comme 'Integrated feature branch changes into master', Run git merge feature_merge --no-commit.

Avec --no-commit, il effectue la fusion et s'arrête juste avant de créer un commit de fusion.Nous aurons toutes les modifications ajoutées dans la branche de fonctionnalité maintenant dans master et aurons une chance de créer un nouveau commit comme le nôtre.

Lisez ici pour en savoir plus: https://git-scm.com/docs/git-merge

kisHoR
la source