Je travaille activement sur un projet de deux personnes avec très peu de branches de fonctionnalités de longue date (la plus longue branche existante est de 3 semaines).
J'ai passé l'après-midi à essayer de comprendre la fuse contre la Rebase et les avantages et les inconvénients. J'ai fait des progrès et je prévois d'incorporer Rebase pour nettoyer mes engagements locaux avant de pousser à Github pour un examen de code. J'aime commettre souvent et j'ai des tests automatisés, il semble donc que l'argument principal contre la Rebase puisse introduire des bugs aux commissions rebasées n'est pas aussi pertinente. Bien que j'ai vu des arguments contre ce type de rebasage, cela semble moins controversé. Ma confusion consiste à rebaisser VS fusionnant une branche de fonctionnalité en maître après la révision du code est terminée. Je sais que personne d'autre d'autre s'appuie sur elle et que le processus d'examen du code a généré de nombreuses petites signes de syntaxe sans signification. Ces deux semblent suggérer de rebaisser.
Je crois comprendre que pour mon projet Rebase a l'avantage de garder l'histoire propre qui me permet de voir de meilleurs résumés dans Git blâment pourquoi un changement a été introduit. Il aide également à garder l'histoire linéaire, ce qui facilite l'utilisation de git bisect (il s'agit-il de l'histoire étant linéaire ou d'avoir que chaque commit soit complète et non intentionnelle). Il permet également aux correctifs de mon exemple actuel où j'ai oublié de renommer et d'éditer un fichier dans des commits distincts avant de soumettre une demande de traction, ce qui entraîne une grande différence inutile. Pour ce projet, aucun d'entre eux ne ressemble à des inconvénients changés par un jeu à l'utilisation du flux de travail GIT-MERGE (le codeBase ne peut tout simplement pas être suffisamment gros pour faire l'expérience des vrais inconvénients), mais ils seraient bien d'avoir s'il n'y a pas de gros inconvénients.
Les inconvénients que je vois sont que je ne suis pas un expert git et il semble beaucoup plus facile de réellement briser les choses avec Rebase qu'avec la fusion. Deuxièmement, nous faisons beaucoup de commentaires actifs sur les demandes de pull à Github et je suis hésitant à casser ou à perdre ces commentaires en recâblant et en changeant le SHA (à la seconde pensée, je ne pense pas que je ne pense pas "Je perdrez les commentaires, mais ils ne se réfèrent plus aux bonnes commettrices, donc je devrais chasser les commentations mentionnées par d'autres moyens). Troisièmement, il donne à l'illusion de chaque commit d'être une société complète et de travail logique. La réalité, j'aurai probablement toujours des commits qui sont partiellement cassés.
Dans cet article article À propos de la fusion vs Rebase, ils donnent les conseils suivants à propos de cette situation:
L'examen est effectué et prêt à être intégré à la branche cible. Toutes nos félicitations! Vous êtes sur le point de supprimer votre branche de fonctionnalité. Étant donné que d'autres développeurs ne seront pas rattrapés dans ces changements de ce point, c'est votre chance de désinfecter l'historique. À ce stade, vous pouvez réécrire l'histoire et plier les engagements originaux et ces "roudes de relations publiques" de Pesky et "fusion" s'engagent dans un petit ensemble de commits ciblés. Créer une fusion explicite pour ces commits est facultative, mais a une valeur. Il enregistre lorsque la fonctionnalité est diplômée à maîtriser.
Je suis très intéressé à savoir si mon analyse ci-dessus est sur la bonne voie. À l'heure actuelle, je m'appuyais avec prudence en utilisant Rebase comme décrit dans les conseils ci-dessus. Mais je suis même confus comment faire ce qu'ils suggèrent. Comment créer une fusion explicite? Est-ce que je fais une branche locale qui est une copie de feature
puis rebase -i
Sur cette branche pour que l'histoire ressemble à je veux et puis fusionner avec maître? Ou est-ce que je rebaste feature
directement sur maître, puis utilisez rebase -i
Squash s'engage comme approprié. Si cette approche est ce qu'ils suggèrent comment puis-je créer une fusion explicite à la fin?
La solution que j'ai décidée était la plus simple et gardée le plus d'avantages pour moi était de rebaser puis de fusionner. Après avoir utilisé GitHub pour aller d'avant en arrière sur la demande de traction et commettant quelques modifications mineures, il était temps de la fusionner dans la branche principale. Sur ma configuration locale, j'ai fait:
git pull
git checkout feature
git rebase -i HEAD~8 # combine small commits and separate file moving
git checkout master
git merge --no-ff feature # comment this with `close #<pull_request_number>`
git Push
Les avantages sont:
Les inconvénients sont:
Je ne sais pas si ceci est une approche recommandée ou un peu trop hacky et je devrais coller à l'un ou l'autre. Mais nous verrons si des problèmes découlent de cela. Très flexible à différentes suggestions d'autres personnes cependant.
Je vois que vous avez déjà répondu à la question avec votre propre réponse, mais j'ai toujours envie de partager cela.
Jusqu'à ce que vous appuyez sur le référentiel à distance, il n'a pas vraiment de problème si vous utilisez merge
ou rebase
. Vous avez déjà signalé vous-même, cela avec rebase
, la succursale Rails Look plus propre, car ils restent linéaires et ne s'étendent pas d'une manière qu'ils le font avec merge
.
De toute façon, en utilisant les deux rebase
et merge
vous êtes susceptible d'être obligé de réparer les conflits et que ces conflits peuvent et peuvent être complètement différents.
Par conséquent, si vous travaillez seul sur une succursale (cette branche ne peut naturellement pas être poussée naturellement au repo à distance tout simplement), je suggérerais de faire rebasing
avant la demande de traction initiale. Si la branche devrait rester sur le repo et si vous y travailliez à nouveau à l'avenir, merge
est la voie à suivre, car rebase
_ déstabiliserait l'histoire de la branche discutée et des développeurs différents pourraient avoir un code différent.