1330 votes

Git push rejetée après un rebasage de direction générale de la fonction

OK, je pensais que c'était un simple git scénario, ce qui me manque?

J'ai un master de la branche et un feature de la branche. Je fais un peu de travail sur master, certains sur feature, puis un peu plus sur l' master. Je me retrouve avec quelque chose comme ceci (ordre lexicographique implique ordre de commits):

A--B--C------F--G  (master)
       \    
        D--E  (feature)

Je n'ai pas de problème à l' git push origin master pour garder la télécommande master mise à jour, ni avec git push origin feature (lorsque sur feature) afin de maintenir une sauvegarde à distance pour mon feature de travail. Jusqu'à maintenant, nous sommes bons.

Mais maintenant je veux rebase feature sur le haut de la F--G s'engage sur le master, donc j' git checkout feature et git rebase master. Encore bonne. Maintenant, nous avons:

A--B--C------F--G  (master)
                 \
                  D'--E'  (feature)

Problème: le moment, je veux faire un backup de la nouvelle relocalisée feature ramifiée avec git push origin feature, le push est rejeté car l'arbre a changé en raison de l'année de référence. Ce ne peut être résolu avec l' git push --force origin feature.

Je déteste l'aide d' --force sans en être sûr j'en ai besoin. Donc, ai-je besoin? Le rebasage nécessairement impliquer que le prochain push devrait être --forceful?

Cette branche n'est pas partagée avec les autres devs, donc je n'ai aucun problème de facto avec l'forcé de pousser, je ne vais pas perdre toutes les données, la question est plus conceptuel.

1004voto

KL-7 Points 14154

Le problème est qu' git push suppose que la distance peut être rapidement transmis à votre succursale locale, c'est-à qui toute la différence entre le local et le distant de branches locales d'avoir quelques nouvelles s'engage à la fin comme ça:

Z--X--R         <- origin/some-branch (can be fast-forwarded to Y commit)
       \        
        T--Y    <- some-branch

Lorsque vous effectuez git rebase s'engage D et E sont appliqués à la nouvelle base, et les nouveaux commits sont créés. Cela signifie que, après rebase vous avez qch comme ça:

A--B--C------F--G--D'--E'   <- feature-branch
       \  
        D--E                <- origin/feature-branch

Dans cette situation branche à distance ne peut pas être rapidement transmis aux locaux. Bien que, théoriquement, la branche locale peuvent être fusionnés en distance (évidemment vous n'en avez pas besoin dans ce cas), mais en tant que git push n'effectue qu'une avance rapide fusionne il jette et de l'erreur.

Et ce qu' --force option n'est tout simplement ignorant de l'état de la branche à distance et réglage à la livraison, vous êtes la poussant. Donc, git push --force origin feature-branch simplement remplacements origin/feature-branch locale feature-branch.

À mon avis, la relocalisation branches sur master et la force de les repousser à distance référentiel est ok aussi longtemps que vous êtes le seul qui fonctionne sur cette branche.

22voto

Mark Longair Points 93104

Une solution à ce problème est de faire ce que msysGit du rebasage de fusion script n' - après le rebase, de fusion de l'ancien chef de l' feature avec -s ours. Vous vous retrouvez avec la validation graphique:

A--B--C------F--G (master)
       \         \
        \         D'--E' (feature)
         \           /
          \       --
           \    /
            D--E (old-feature)

... et votre pression d' feature sera une avance rapide.

En d'autres termes, vous pouvez le faire:

git checkout feature
git branch old-feature
git rebase master
git merge -s ours old-feature
git push origin feature

(Pas testé, mais je pense que c'est à droite...)

18voto

Bill Door Points 2561

D'autres ont répondu à votre question. Si vous rebase une succursale, vous aurez besoin de force pour pousser la branche.

Rebase et un référentiel commun en général, ne pas obtenir le long. C'est la réécriture de l'histoire. Si d'autres personnes sont à l'aide de la succursale ou ont ramifiée à partir de cette branche alors cela va être très désagréable.

En général, cela fonctionne bien pour les locaux de gestion de la direction générale. À distance de gestion de la direction générale fonctionne mieux avec de l'explicite fusionne (--no-ff).

Nous avons également éviter la fusion de master dans une branche. Au lieu de cela, nous rebase au maître, mais avec un nouveau nom de la branche e.g l'ajout d'un suffixe de version). Cela évite le problème de la relocalisation dans l'espace de stockage partagé.

17voto

JAR.JAR.beans Points 2142

Il peut ou ne peut pas être le cas qu’il n’y a qu’un seul développeur sur cette branche, qui est maintenant (après le rebasage) pas en ligne avec l’origine ou la fonction.

Comme tel, je suggère d’utiliser la séquence suivante :

Oui, nouvelle branche, cela devrait résoudre ce problème sans une--force, je pense que généralement c’est un inconvénient majeur de git.

10voto

bouke Points 3328

Quel est le problème avec un git merge master sur le feature de la branche? Cela permettra de préserver le travail que vous aviez, tout en gardant à part de la canalisation principale de la branche.

A--B--C------F--G
       \         \
        D--E------H

Edit: Ah désolé de ne pas avoir lu votre énoncé du problème. Vous aurez besoin de la force que vous avez effectué une rebase. Toutes les commandes qui modifient l'histoire aura besoin de l' --force argument. C'est un failsafe pour vous éviter de perdre le travail (le vieux - D et E serait perdu).

Si vous avez effectué une git rebase qui fait l'arbre (bien que partiellement masqués D et E n'êtes plus dans une branche nommée):

A--B--C------F--G
       \         \
        D--E      D'--E'

Ainsi, lors de la tentative de pousser votre nouveau feature de la branche (avec D' et E' ), vous perdez D et E.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X