Comment éviter l'enfer de fusion-commit sur GitHub / BitBucket

101

Nous nous retrouvons avec beaucoup de commits comme celui-ci dans notre repo:

Merge branch 'master' of bitbucket.org:user/repo

Cela se produit chaque fois qu'un développeur synchronise son fork local avec le référentiel de niveau supérieur.

Y a-t-il un moyen d'éviter que cet enfer de fusion-commit n'encombre tout le journal du dépôt? Peut-on les éviter lors du lancement des pull-requests d'une manière ou d'une autre?

Je sais que je peux faire git rebase si cela est fait uniquement dans ma VM locale, y a-t-il une équivalence dans l'interface utilisateur de GitHub / BitBucket?

Comment faites-vous ça?

Niklas9
la source

Réponses:

136

Rebase des branches d'objets avant la fusion

Si vous souhaitez éviter les validations de fusion, vous devez vous assurer que toutes les validations sont rapides. Pour ce faire, assurez-vous que votre branche de fonctionnalités se rebase proprement sur votre ligne de développement avant une fusion comme ceci:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase a également beaucoup d'indicateurs, y compris le rebasage interactif avec l' -iindicateur, mais vous n'en aurez peut-être pas besoin si vous gardez les choses aussi simples que possible et que vous souhaitez conserver tout l'historique de votre branche lors d'une fusion.

Utilisez le --ff-onlydrapeau

En plus du rebasage, l'utilisation de l' --ff-onlyindicateur garantira que seules les validations à avance rapide sont autorisées. Un commit ne sera pas effectué s'il s'agissait plutôt d'un commit de fusion. La page de manuel de git-merge (1) dit:

--ff uniquement

Refusez de fusionner et de quitter avec un statut différent de zéro à moins que le HEAD actuel ne soit déjà à jour ou que la fusion puisse être résolue en avance rapide.

Todd A. Jacobs
la source
1
C'est une excellente réponse. J'utilise rebase aussi souvent que possible. Cependant, je ne connaissais pas l'indicateur --ff-only. Plutôt cool!
Leo Correa
3
Merci pour le rebase et les conseils --ff-only. Cependant, comme indiqué dans ma question, comment puis-je faire cela dans l'interface utilisateur de GitHub / BitBucket?
Niklas9
3
@Niklas Je suis sûr que vous devrez recourir à la CLI pour faire ce que vous voulez. GitHub n'expose pas toute la puissance de Git; juste un sous-ensemble de ses fonctionnalités plus une valeur ajoutée graphique et de réseautage social. Bonne chance!
Todd A. Jacobs
3
Une chose à noter avec ce processus est qu'avant de fusionner la branche de rubrique (feature / foo) dans master, vous feriez mieux de git pull origin master (si vous utilisez une télécommande), pour vous assurer que la branche master est à jour . Si des mises à jour ont été trouvées, assurez-vous de rebaser à nouveau master sur la branche de rubrique avant de le fusionner à nouveau dans master.
chikamichi
19
@CodeGnome ne l'appelle pas «recourir» à l'interface de ligne de commande ... en réalité, vous devriez avertir de «recourir» à l'interface utilisateur!
Droogans
9

"Todd A. Jacobs" déjà mentionné "rebase" est le concept ici. C'est juste une façon plus détaillée de faire les choses.

Disons que vous êtes sur la branche principale

$ git branch
  * master

Vous voulez faire un correctif, alors créez un «fixbranch» qui est dérivé du master

$ git checkout -b fixbranch

Peut-être auriez-vous travaillé pendant quelques jours sur cette branche et eu quelques commits.

Le jour où vous vouliez pousser vos commits vers le repo principal central! Commander le maître et obtenir les dernières modifications du repo principal central

$ git checkout master
$ git pull origin master

Rebase votre fixbranch avec le maître pour avoir un historique propre et résoudre les conflits le cas échéant dans le dépôt local lui-même.

$ git checkout fixbranch
$ git rebase master

Maintenant, fixbranch est à jour avec le maître central, laissez-moi fusionner fixbranch dans la branche master

 $ git checkout master
 $ git merge fixbranch

J'ai fini! laissez-moi pousser le maître local vers le maître central

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Kondal Kolipaka
la source
J'apprécie cette réponse.
lasec0203