web-dev-qa-db-fra.com

Rebaser et qu'entend-on par rebaser les commits poussés

On dit souvent que vous ne devriez pas rebaser les commits que vous avez déjà poussés. Quel pourrait être le sens de cela?

103
Hemant Kumar

Le livre ProGit a un bonne explication .

La réponse spécifique à votre question se trouve dans la section intitulée " Les dangers de la refonte". Une citation de cette section:

Lorsque vous rebasez des éléments, vous abandonnez les validations existantes et créez-en de nouvelles similaires mais différentes. Si vous envoyez des commits quelque part et que d'autres les abaissent et fondent leur travail sur eux, puis vous réécrivez ces commits avec git rebase et relancez-les de nouveau, vos collaborateurs devront alors fusionner leur travail et les choses deviendront désordonnées lorsque vous essaierez. ramène leur travail dans le tien.

Mise à jour:
D'après votre commentaire ci-dessous, il semble que vous rencontriez des difficultés avec votre flux de travail Git. Voici quelques références qui peuvent aider:

78
Tim Henigan

Pour comprendre cela, nous devons comprendre un peu le fonctionnement de git. Un référentiel git est une arborescence, où ses nœuds sont des commits. Voici un exemple de référentiel très simple: When you fork

il comporte quatre commits sur la branche maître et chaque commise a un ID (dans ce cas, a, b, c et d). Vous remarquerez que d est actuellement le dernier commit (ou HEAD) de la branche master. enter image description here

Ici, nous avons deux branches: master et my-branch. Vous pouvez voir que maître et ma branche contiennent tous les deux les commits a et b, mais ils commencent à diverger: maître contient c et d, tandis que ma-branche contient e et f. b est dit être la "base de fusion" de my-branch par rapport au maître - ou plus communément, juste la "base". Cela a du sens: vous pouvez voir que ma branche était basée sur une version précédente de master.

Supposons donc que ma branche soit devenue obsolète et que vous souhaitiez la mettre à jour avec la dernière version de master. En d'autres termes, ma-branche doit contenir c et d. Vous pouvez effectuer une fusion, mais cela entraîne que la branche contient des commits de fusion étranges qui rendent l'examen de la demande d'extraction beaucoup plus difficile. Au lieu de cela, vous pouvez faire une rebase.

enter image description here

Lorsque vous rebasez, git trouve la base de votre branche (dans ce cas, b), trouve tous les commits entre cette base et HEAD (dans ce cas, e et f), et joue ces commits sur le HEAD de la branche sur laquelle vous vous rebassez (dans ce cas, maître). Git crée en fait de nouveaux commits qui représentent l'apparence de vos modifications sur le maître: dans le diagramme, ces commits sont appelés e ′ et f ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ′ ‘f ′ ′ f ′ f ′ ′ f ′ f ′ f‘ fable ".

Lorsque de nombreuses personnes travaillent simultanément sur un projet, les demandes d'extraction peuvent rapidement disparaître. Une demande d'extraction "obsolète" est une demande qui n'est plus à jour avec la ligne de développement principale et doit être mise à jour avant de pouvoir être fusionnée dans le projet. La principale raison pour laquelle les demandes d'extraction deviennent obsolètes est due à des conflits: si deux demandes d'extraction modifient des lignes similaires dans le même fichier et qu'une demande d'extraction est fusionnée, la demande d'extraction non fusionnée sera désormais en conflit. Parfois, une demande d'extraction peut devenir obsolète sans conflit: les modifications apportées à un fichier différent de la base de code nécessitent des modifications correspondantes de votre demande d'extraction pour se conformer à la nouvelle architecture, ou bien la branche a été créée lorsqu'une personne a accidentellement fusionné des tests unitaires défaillants avec branche maîtresse. Quelle que soit la raison, si votre demande d'extraction est devenue obsolète, vous devrez redéfinir votre branche sur la dernière version de la branche principale avant de pouvoir la fusionner.

231
pseudoCoder

Rebasing réécrit l'histoire. Si personne ne connaît cette histoire, alors c'est très bien. Si, toutefois, cette histoire est connue publiquement, la réécriture de l’histoire dans Git fonctionne exactement comme elle le fait dans le monde réel: vous avez besoin d’un complot.

Les conspirations sont vraiment difficiles à maintenir ensemble, de sorte que vous feriez mieux d'éviter de rebasonner les succursales publiques en premier lieu.

Notez qu'il existe sont exemples de complots réussis: la branche pu du référentiel git de Junio ​​C. Hamano (le référentiel officiel du Git SCM) est fréquemment rebasonnée. La façon dont cela fonctionne est que pratiquement tout le monde qui utilise pu est également abonné à la liste de diffusion des développeurs Git, et le fait que la branche pu soit rebasée est largement annoncé sur la liste de diffusion et sur Git. site Internet.

66
Jörg W Mittag

Une base modifie l’historique de votre référentiel. Si vous appuyez sur les engagements dans le monde, c'est-à-dire que vous les mettez à la disposition des autres, et que vous modifiez ensuite votre vision de l'historique des engagements, il devient difficile de travailler avec quiconque possède votre ancien historique.

Rebase considéré comme nuisible est un bon aperçu, je pense.

6
dsolimano