68 votes

git rebase et git push : non EXPRES avant, pourquoi l’utiliser ?

J’ai une branche qui devrait être disponible aux autres contributeurs et qui doit constamment rester à jour avec le maître.

Malheureusement, chaque fois que je fais « git rebase » et puis essayez de pousser, il se traduit par « avancer non EXPRES » message et l’avortement de pousser. La seule façon de pousser ici consiste à utiliser l’option--force. Cela signifie-t-il que je dois utiliser « git merge » au lieu de relocalisation si ma direction est devenue publique et d’autres sont travaillent ?

100voto

gahooa Points 38006

Quelques notes sur la façon de git fonctionne (non technique):

Lorsque vous rebase, git prend la commet en question, et "engage à nouveau" sur le dessus de la propre histoire. Ceci pour éviter que les histoire de montrer:

Description: tree -> mywork -> merge -> mywork -> merge -> mywork -> merge
Commit SHA1: aaaa -> bbbb   -> cccc  -> dddd   -> eeee  -> ffff   -> gggg

Après cela, il peut ressembler à ceci (ou similaire):

Description: tree -> rebase
Commit SHA1: aaaa -> hhhh

Le problème est que le nouveau commit que vous essayez de repousser n'est PAS un descendant de l'engager sur le bout de la branche que vous pousser à.

Maintenant, vous savez que la même info est dans le commet, mais git est responsable non seulement d'écraser ceux qui s'engage là-bas (bbbb-gggg dans l'exemple ci-dessus).


Partagé Des Pensions De Modèle

Si vous utilisez un référentiel partagé, puis des choses comme ça peut faire très déroutant. Laissez-moi vous expliquer pourquoi. Dire qu'un autre développeur tiré vers le bas de la branche, et ils ont engage aaaa -> gggg dans leur branche. Ensuite ils font un commit iiii

En attendant, vous relocalisée et forcé à pousser, entraînant l'arbre à ressembler à ceci:

Description: tree -> rebase
Commit SHA1: aaaa -> hhhh

Lorsque le développeur essaie de le pousser, il obtient un "non-fast forward" message. Quand il le fait d'une fusion, les deux histoires sont RELIÉS ensemble, et de vous retrouver avec un désordre

Quelque chose comme ceci (en désordre):

Description: tree -> rebase -> mywork -> merge -> mywork -> merge -> mywork -> merge -> devwork -> merge 
Commit SHA1: aaaa -> hhhh   -> bbbb   -> cccc  -> dddd   -> eeee  -> ffff   -> gggg -> iiii    -> jjjj

EN d'autres termes, si les autres sont en tirant ET en poussant, il est préférable que vous vous en tenez à git merge, ou ÉVITER de POUSSER jusqu'à ce que après le rebase (et seulement rebase votre travail).


Visible Publiquement Référentiel Modèle

Vous êtes peut-être l'aide d'un autre (plus gittish) modèle où vous voulez juste les gens à être en mesure de tirer de votre pension. Dans ce cas, la commande git push --force n'est pas trop mauvais, parce qu'alors ils peuvent faire face à garder avec elle. Ils peuvent rebase leurs modifications pour être au top de vos modifications avant de donner leurs correctifs pour vous. Il empêche votre pension à partir de l'obtention de tout foiré.

Cependant, il peut y avoir une meilleure façon pour vous. git push --miroir

À partir de http://www.kernel.org/pub/software/scm/git/docs/git-push.html

Au lieu de nommer chaque ref pousser, spécifie que toutes les refs en vertu de $GIT_DIR/refs/ (ce qui inclut, mais sans s' pas limité à refs/heads/, refs/remotes/, et refs/tags/) en miroir, sur le dépôt distant. Local nouvellement créé refs sera poussé à l'extrémité distante, localement mise à jour refs sera force de mises à jour sur l'extrémité distante, et a supprimé les références seront être supprimé à partir de l'extrémité distante. Cette est la valeur par défaut si la configuration option à distance..miroir.


Une des grandes choses au sujet de git , c'est qu'il est très flexible et permet de nombreux différents types de flux de travail. Mais c'est de la vraie force réside dans le fait que c'est un modèle distribué, donc je crois que le plus de retour sur investissement peut être récolté en l'utilisant de cette façon.

2voto

Val Points 985

Non, cela est parfaitement légal avec les dépôts publics et peut-être même souhaitable de garder l'histoire à l'aise. Il suffit de garder à l'esprit que vous ne devez pas utiliser rebase de réécrire l'histoire à distance publiés s'engage. C'est, cela ne peut être appliqué à votre propre local, s'engage à ce que vous n'avez jamais publié. Vous utilisez git rebase pour placer vos commits sur le dessus d'eux lors de l'extraction et puis, peut-être, de les ajuster. Une autre raison que vous risquez de recevoir un tel message, c'est que la direction générale vous pousser à a été mis à jour et vous avez besoin de synchroniser -- fetch et rebase vos commits sur le dessus de ce que vous avez récupéré.

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