/ / Comment puis-je gérer la fusion et le rebasage en git? - git, merge, rebase

Comment puis-je gérer la fusion et le rebasage en git? - git, merge, rebase

Je suis le but de rebase. Ça me semble logique. Fondamentalement, j'ai une branche sur laquelle je travaille et je suis prêt à le mettre dans la branche principale. l'histoire en désordre.

Voici ce que nous faisons.

  1. Créer une branche de fonctionnalité
  2. Ajoutez un tas de commits lorsque nous construisons la fonctionnalité
  3. Fusionner périodiquement la branche principale dans la branche d'entités (afin d'éviter une fusion douloureuse au bout du compte)
  4. Lorsque tout est terminé, fusionnez la branche d'entités dans le fichier maître.

Le problème que je vois est que périodiquementla fusion de master dans la branche de fonctions pose des problèmes lors du rebasage, car je dispose maintenant d'un ensemble de vérifications de branches principales entre mes checkins de fonctionnalités.

Quel est le bon flux de travail ici? Où les commads suivantes entrent-elles en jeu:

  • Git rebase -i Head ^ #
  • git rebase master
  • git fusion master
  • git-rerere
  • git reset --hard HEAD ^

Réponses:

5 pour la réponse № 1

Vous ne devez fusionner avec / du maître qu'une seule fois, aufin de vie de la branche. L'idée d'une branche de fonctionnalité / sujet est qu'il ne contient que des modifications pertinentes pour la fonctionnalité; vous perdez cela lorsque vous fusionnez à plusieurs reprises avec le maître. (Vous pouvez lire ce que Junio ​​Hamano, le mainteneur de git, parle des branches.)

Vous pouvez faire une fusion "pratique" que vous allez jeter et utiliser git-rerere pour que Git enregistre automatiquement vos résolutions de fusion, de sorte qu'elles puissent être réutilisées lorsque vous êtes vraiment prêt à fusionner. Voir http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html pour le fond et le tutoriel. C'est vraiment cool parce que cela vous permet de faire le travail de fusion sans le valider de manière explicite, puis de récupérer ce travail "comme par magie" lorsque vous êtes vraiment prêt à créer la fusion. Ainsi, au lieu d'une grosse fusion douloureuse à la fin, vous pouvez faire une série de fusions intermédiaires plus petites, en espérant qu'elles soient plus simples. Grosso modo:

# Enable rerere
git config --global rerere.enabled 1
# Start a feature branch
git checkout -b feature
# Hack hack hack
git commit
git commit
# Practice merge
git merge master
# ...then throw the merge commit away, the work is saved by rerere
git reset --hard HEAD^
# Hack hack hack
git commit
# Really merge to master, reusing any saved work from rerere
git checkout master
git merge feature
git branch -d feature

Voir également http://progit.org/2010/03/08/rerere.html pour un autre tutoriel.

Vous pouvez également périodiquement rebaser votre branche de sujet au-dessus de master et ensuite faire une fusion à la fin.

Pour faire face à une situation comme celle dans laquelle vous vous trouvez actuellement, avec une branche de sujet (par exemple, nommer feature) qui a une série de fusions du principal mixteavec divers commits en cours, l'approche la plus simple serait de faire une fusion écrasée pour produire un arbre de travail "fusionné", puis créer un nouvel commit (ou une série de commits) sur main. Par exemple:

git checkout master
git merge --squash feature
git commit

Cela produira un seul commit qui représente l'état de l'arbre en tête d'entité, fusionné en master.

Bien sûr, vous pouvez aussi faire une fusion régulière pour master pour ce changement, laissant l'histoire de désordre de feature présent, et juste travailler plus proprement dans le futur. par exemple, simplement

git checkout master
git merge feature

et avance.


3 pour la réponse № 2

Si vous allez vous rebaser (ce que je vous suggèredo), puis ne jamais fusionner à partir de master. Un workflow de rebase est basé sur l’idée qu’une branche de sujet est constituée du chemin de la nouvelle entité à la nouvelle et rien d’autre. nouvelle fonctionnalité déplacer avec elle.

Lorsque vous êtes enfin prêt à modifier les modifications, vous disposez de deux options principales:

  1. Rebase contre master une dernière fois, puis faites unefusion rapide normale qui amène essentiellement tous les commits de votre branche dans le master un par un. Ceci permet de conserver un historique plus granulaire, mais si les commits intermédiaires ont cassé la construction, vous pouvez préférer les écraser. organiser ces commits.

  2. Utilisez merge --squash pour créer un seul commit dans master contenant toutes les modifications de branche.


0 pour la réponse № 3

Si vous « allez rebasage la branche de toute façon, juste rebasage chaque fois que vous voulez « fusionner » les changements dans. Vous ne » avez pas à rebasage + courge jusqu'à ce que vous "êtes prêt à « fusionner » cette branche en maître.


0 pour la réponse № 4

Je crois que la réponse courte est la suivante:

utilisation git merge --squash si:

si vous avez une branche technique et que vous tirezà partir d'une autre branche dans cette branche lorsque vous travaillez, par exemple, vous basculez vers la fonctionnalité et exécutez périodiquement le maître de fusion git pour fusionner dans la branche principale. Ou vous tirez ou poussez cette branche à d'autres ou à un repo central comme github.

utilisation git rebase si:

si vous avez une branche technique que vous ne poussez pas ou ne transférez pas vers d'autres, et que vous ne fusionnez pas une autre branche périodiquement, comme décrit ci-dessus