Dans une tentative d'atteindre git nirvana, je passe la journée à apprendre à tirer parti du rebase pour les situations où je fusionne actuellement.
Lorsque j'exécute ce que je considère comme un flux git 101 (que je précise ci-dessous), je dois le faire push --force
lorsque je repousse mes modifications à l'origine.
Je ne suis pas le seul - je sais que c'est un terrain couvert (voir 1 , 2 , 3 , 4 , 5 ), et je comprends les raisons techniques pour lesquelles une force est nécessaire. Mon problème est le suivant: il y a beaucoup (beaucoup) d'entrées de blog chantant les louanges du rebase et comment cela a changé leur vie (voir 1 , 2 , 3 , 4 pour en énumérer quelques-uns), mais aucun d'entre eux ne mentionne ce qui push --force
fait partie de leur flux. Cependant, presque toutes les réponses aux questions de stackoverflow existantes disent des choses comme "ouais, si vous voulez rebaser, vous devez utiliser push --force
".
Compte tenu du nombre et de la religiosité des partisans du rebase, je dois croire que l'utilisation de `` push --force '' n'est pas une partie inhérente d'un flux de rebase, et que si l'on doit souvent forcer leurs poussées, ils font quelque chose de mal. .
push --force
est une mauvaise chose .
Alors, voici mon flux. De quelle manière pourrais-je obtenir les mêmes résultats sans force?
Exemple simple
Deux branches:
- v1.0 - une branche de publication, ne contient que des correctifs
- master - tout pour la prochaine version majeure.
J'ai quelques correctifs et quelques commits pour la prochaine version.
J'aimerais incorporer les correctifs dans mon master afin qu'ils ne soient pas perdus pour la prochaine version. Pré-illumination, je voudrais simplement:
git checkout master
git merge v1.0
Mais maintenant j'essaye
git checkout master
git rebase v1.0
Alors maintenant je suis ici:
Temps pour:
git push
Pas de dé.
la source
@CodeGnome a raison. Vous ne devez pas rebaser master sur la branche v1.0 mais branche v1.0 sur master, cela fera toute la différence.
Créez une nouvelle branche qui pointe vers la v1.0, déplacez cette nouvelle branche au-dessus de master, puis intégrez la nouvelle version des patchs V1.0 à la branche master. Vous vous retrouverez avec quelque chose comme:
Cette façon d'utiliser rebase est recommandée par la documentation officielle de git .
Je pense que vous avez raison
git push --force
: vous ne devriez l'utiliser que si vous avez fait une erreur et poussé quelque chose que vous ne vouliez pas.la source
master
et negit checkout my-branch; git rebase master; git checkout master; git merge my-branch
Vous devez forcer le push si vous rebasez et que vous avez déjà publié vos modifications, non?
J'utilise rebase tout un tas, mais je publie soit sur quelque chose de privé où une poussée forcée n'a pas d'importance (par exemple: mon propre clone sur GitHub, dans le cadre d'une pull request), soit je rebase avant de pousser pour la première fois.
C'est le cœur du flux de travail où vous utilisez le rebase, mais ne forcez pas beaucoup le push: ne publiez pas les choses tant qu'elles ne sont pas prêtes, ne rebasez pas après avoir poussé.
la source
rebase
nouvelles modifications apportées à votre branche de rubrique, mais lorsque vous avez terminé les modifications de cette branche, vousmerge
retournez la branche dans la branche de développement principale.Je pense qu'il existe un bon cas d'utilisation pour ce modèle de rebase-puis-force-push qui n'est pas le résultat d'une erreur de poussée: travailler vous-même sur une branche de fonctionnalités à partir de plusieurs emplacements (ordinateurs). Je fais cela souvent, car je travaille parfois au bureau sur mon ordinateur de bureau, et parfois à la maison / site client sur mon ordinateur portable. J'ai besoin de rebaser de temps en temps pour suivre la branche principale et / ou pour rendre les fusions plus propres, mais j'ai aussi besoin de pousser de force lorsque je quitte une machine pour aller travailler sur une autre (où je tire). Fonctionne comme un charme, tant que je suis le seul à travailler sur la branche.
la source
Voici ce que j'utilise (en supposant que le nom de votre branche est foobar ):
la source
git
n'est pas sans personnalitégit merge -s ours origin/<branch>
était ce qui l'a arrangé pour noustl; dr fusionne avec les branches partagées, rebase avec des branches individuelles.
--force-with-lease
est une alternative plus sûre à la force et devrait vous aider à atteindre ledit nirvana git sans la nature destructrice de la force.Une règle générale que j'ai vue travailler pour les flux de travail de diverses équipes est d'utiliser
merge
pour les branches partagées (c'est-à-dire, maître ou développement) et à utiliserrebase
lorsque vous travaillez sur votre propre branche de fonctionnalités. Voici un cycle de vie typique d'une branche de fonctionnalitésUne version anglaise simple de ce que nous avons fait ici:
force-with-lease
La 4ème étape est VRAIMENT importante et l'une des principales raisons pour lesquelles j'ai commencé à préconiser l'utilisation du rebase.
force-with-lease
vérifie la télécommande pour voir si de nouveaux commits ont été ajoutés. Si tongit push
s'avère que vous êtes destructeur, cela ne poussera pas!J'espère que cela donne à quelqu'un plus de confiance pour utiliser le rebase.
la source