Lorsque je travaille sur une branche de fonctionnalité, j'ai tendance à vouloir nettoyer les validations dans la branche à l'aide d'une rebase interactive avant que mon travail ne soit examiné et intégré dans la branche principale.
Pendant le développement de la fonctionnalité, je souhaite transférer mon travail intermédiaire vers le référentiel distant comme mesure de sauvegarde. C'est-à-dire lorsque mon disque dur tombe en panne, je ne veux pas que toute ma branche de fonctionnalités soit perdue.
Cependant, cela conduit au fait que je dois souvent faire un git push --force
au référentiel distant après un rebase, une action qui est généralement mal vue. Ou comme le dit la page github liée:
Étant donné que la modification de votre historique de validation peut rendre les choses difficiles pour tous les autres utilisateurs du référentiel, il est considéré comme une mauvaise pratique de rebaser les validations lorsque vous avez déjà poussé vers un référentiel.
Existe-t-il une politique (généralement acceptée) qui résout ce conflit?
Pourquoi ce n'est pas un double de Est-ce que le git "Golden Rule of Rebasing" est si essentiel?
Ma question ici demande une politique pour résoudre le conflit entre vouloir sauvegarder votre travail dans le référentiel distant et rebaser votre travail , tandis que l'autre question essaie de nier qu'il y a un conflit et demande pourquoi certaines personnes pensent que le conflit existe, et demande donc pourquoi "il est essentiel" de ne pas pousser les rebases de force?
Réponses:
La question clé à vous poser:
Si vous supprimez votre branche de fonctionnalité distante après la fusion dans Master, vous perdez déjà l'historique. En supposant que vous écrasiez / rebasiez la branche avant de faire votre fusion / RP, vous perdiez cet historique. Tout ce que votre poussée de force fait dans ce cas vous permet d'utiliser github comme sauvegarde.
La situation dans laquelle vous souhaitez conserver l'historique et ne pas forcer la poussée est si votre branche distante persiste après avoir été fusionnée et n'existe pas seulement pendant une période temporaire.
Il semble que vous ayez plusieurs personnes poussant simultanément vers cette branche. Cela signifie que vous vous souciez de l'historique de la branche.
Ce que vous pourriez faire à la place pour votre travail intermédiaire est de créer un fork de cette branche. Vous pouvez pousser à cela, puis rebaser toutes vos validations en une seule validation avant la fusion, donc lorsque vous les fusionnez dans votre branche de fonctionnalité, vous n'avez qu'une seule validation (avec l'historique rebasé de votre branche entière).
la source
featurebranch-local
) puis faire un développement actif sur cette branche, avec autant de validations que vous le souhaitez. Une fois que vous souhaitez fusionner, écrasez ces validations, puis fusionnez-les dans la fonctionnalité. Fondamentalement, il suffit de faire du développement dans une branche temporaire réelle, puis de compresser / fusionner dans votre fonctionnalité.develop-feature
branche "privée" . Bien sûr, le caractère privé est purement conventionnel et n'est imposé par rien, mais peut faire partie d'une politique, surtout si certaines conventions de dénomination de branche sont introduites pour cela. (Peut-être que je suis trop anxieux en ce moment, peut-être pas :) La combinaison avec--force-with-lease
ne peut pas faire de mal, mais ne devrait pas être invoquée, comme indiqué dans mon autre article.J'énumère ici quelques possibilités qui me viennent à l'esprit.
Toujours rebaser sur une nouvelle branche
Lorsque vous
some-feature
avez une branche en désordre , rebasez-la sur une nouvelle branche. Par exempleEnsuite, ont
some-feature-rebase
révisé et intégré.Problème: Un gros inconvénient est que, à proprement parler, vous avez besoin d'une nouvelle branche pour chaque rebase. (Vous pouvez avoir plusieurs rebases si vous apportez des modifications après une révision de code, par exemple)
Utilisation
git push --force-with-lease
Je viens d'apprendre l'
git push --force-with-lease
alternative àgit push --force
laquelleProblème : cela semble améliorer directement la situation où nous utilisons juste
--force
, mais il y a toujours quelques mises en garde, notamment lorsque je fais ungit fetch
au lieu d'ungit pull
, qui met à jour nos branches locales en amont,--force-with-lease
en pensant qu'aucune modification non fusionnée n'a été apportée sur la télécommande branche.la source