De Git et rebase vs fusion questions

J'ai été en utilisant Git maintenant pour un couple de mois sur un projet avec un autre développeur. J'ai plusieurs années d'expérience avec SVN, donc je suppose que je vous apporte un lot de bagages à la relation.

J'ai entendu dire que Git est excellent pour le branchement et la fusion, et jusqu'à présent, je n'ai juste pas le voir. Bien sûr, la ramification est mort simple, mais quand j'essaie de fusionner, tout va en enfer. Maintenant, j'y suis habitué depuis le SVN, mais il me semble que j'ai juste échangé l'un sous la normale système de gestion de versions pour un autre.

Mon partenaire me dit que mes problèmes viennent de mon désir de fusion de bon gré mal gré, et que je devrais être à l'aide de rebase au lieu de fusionner dans de nombreuses situations. Pour exemple, voici le flux de travail qu'il s'est fixés:

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature
git checkout master
git merge my_new_feature

Essentiellement, créer une branche, TOUJOURS rebase de maître à la direction générale, et de la fusion de la branche master. Important à noter est que la branche reste toujours local.

Ici est le flux de travail que j'ai commencé avec

clone remote repository
create my_new_feature branch on remote repository
git checkout -b --track my_new_feature origin/my_new_feature
..work, commit, push to origin/my_new_feature
git merge master (to get some changes that my partner added)
..work, commit, push to origin/my_new_feature
git merge master
..finish my_new_feature, push to origin/my_new_feature
git checkout master
git merge my_new_feature
delete remote branch
delete local branch

Il y a deux différences essentielles (je pense): j'utilise de la fusion de toujours au lieu de relocalisation, et je pousse ma branche (et ma branche s'engage), sur le dépôt distant.

Mon raisonnement pour la branche distante, c'est que je veux que mon travail sauvegardé comme je suis en train de travailler. Notre dépôt est automatiquement sauvegardé et peut être restaurée si quelque chose va mal. Mon portable n'est pas, ou pas complètement. Donc, j'ai hate d'avoir le code sur mon ordinateur portable qui n'est pas en miroir à un autre endroit.

Mon raisonnement pour la fusion au lieu de rebase est que l'opération de fusion semble être la norme, et cela semble être une fonctionnalité avancée. Mon sentiment est que ce que je suis en train de faire n'est pas une configuration plus avancée, de sorte que cela ne devrait pas être nécessaire. J'ai même pas lu la nouvelle Pragmatique de Programmation livre sur Git, et ils couvrent de fusion de manière approfondie et à peine mention de rebase.

De toute façon, je suivais mon flux de travail sur un récent de la branche, et quand j'ai essayé de l'intégrer à maîtriser, tout est allé en enfer. Il y avait des tonnes de conflits avec des choses qui ne devrait pas avoir d'importance. Les conflits juste fait aucun sens pour moi. Il m'a fallu une journée pour tout régler, et finalement abouti à un obligé de pousser le maître, depuis que mon maître a tous les conflits résolus, mais la distance n'était toujours pas satisfait.

Qu'est-ce que la "bonne" flux de travail pour quelque chose comme ça? Git est censée faire le branchement et la fusion de super-facile, et je ne suis pas le voir.

Mise à jour 2011-04-15

Cela semble être un très populaire en question, alors j'ai pensé que je mettrais à jour avec mes deux ans d'expérience puisque j'ai d'abord demandé.

Il s'avère que l'origine de flux de travail est correcte, au moins dans notre cas. En d'autres termes, c'est ce que nous faisons et cela fonctionne:

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git checkout master
git merge my_new_feature

En fait, notre flux de travail est un peu différent, comme nous avons tendance à ne squash fusionne au lieu de matières premières fusions. (Remarque: C'est controversé, voir ci-dessous.) Cela nous permet de transformer l'ensemble de notre branche en un seul commit sur le master. Puis nous supprimer notre branche. Cela nous permet logiquement de la structure de notre engage sur le maître, même s'ils sont un peu en désordre sur l'une de nos succursales. Donc, c'est ce que nous faisons:

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git checkout master
git merge --squash my_new_feature
git commit -m "added my_new_feature"
git branch -D my_new_feature

De Squash de Fusion Controverse - Comme plusieurs commentateurs l'ont souligné, le squash de fusion permettra de jeter toute l'histoire sur votre branche. Comme son nom l'indique, il écrase tous les commits vers le bas en un seul. Pour les petites fonctionnalités, cela fait sens car il condense en un seul paquet. Pour plus de fonctionnalités, il est probablement pas une bonne idée, surtout si vos commits sont déjà atomique. Il s'agit vraiment de préférence personnelle.

Github et Bitbucket (d'autres?) Pull requests - Dans le cas où vous vous demandez comment fusionner/rebase se rapporte à Tirer les Demandes, je vous recommande de suivre toutes les étapes ci-dessus jusqu'à ce que vous êtes prêt à fusionner à maîtriser. Au lieu de saisir manuellement la fusion avec git, vous venez d'accepter le PR. Notez que cela ne fera pas une courge de fusion (au moins pas par défaut), mais non de squash, non-fast-forward est la fusion de la convention dans la Demande d'extraction de la communauté (autant que je sache). Plus précisément, il fonctionne comme ceci:

clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git push # May need to force push
...submit PR, wait for a review, make any changes requested for the PR
git rebase master
git push # Will probably need to force push (-f), due to previous rebases from master
...accept the PR, most likely also deleting the feature branch in the process
git checkout master
git branch -d my_new_feature
git remote prune origin

J'ai appris à aimer Git et ne veux plus jamais retourner à SVN. Si vous avez de la peine, il suffit de coller avec elle et à la fin vous allez voir la lumière au bout du tunnel.

  • Malheureusement, la nouvelle Pragmstic Programmation livre est écrit à partir de l'utilisation de Git tout en continuant à penser SVN, et dans ce cas, il a de vous avoir induit en erreur. Dans Git, git rebase garde les choses simples quand ils peuvent être. Votre expérience peut vous dire que votre flux de travail ne fonctionne pas dans Git, pas que Git n'a pas de travail.
  • Je ne recommanderais pas de squash de la fusion dans ce cas, comme il enregistre aucune information sur ce qui est fusionné (tout comme svn, mais pas de mergeinfo ici).
  • L'amour de la note au bas, j'ai eu une expérience similaire de lutte avec Git, mais maintenant des difficultés à imaginer de ne pas l'utiliser. Merci pour l'explication finale aussi, a beaucoup aidé avec rebase compréhension
  • Après avoir fini la fonctionnalité, ne devriez-vous pas rebase une dernière fois avant de les fusionner new_feature de maître?
  • Votre flux de travail perd toute commettre l'histoire de l'supprimé branche 🙁
  • Ce post peut aider: stackoverflow.com/a/9204499/631619
  • vous devriez également ajouter la mise à jour comme sa propre réponse plutôt qu'une modification à la question.
  • Je souhaite que je pourrais +1, vous avez plus de... Votre dernière mise à jour à faire écrasé fusionne est ce que je cherchais et ce que je pense est absent de la plupart des modèles de ramifications (tels que nvie.com/posts/a-successful-git-branching-model). En gardant un nettoyer l'historique de tout les bugs est CONSIDÉRABLEMENT plus inducive à la propreté de l'histoire que de voir chaque commit sur une branche. Si ceux-ci sont importants, casser la branche en petits morceaux...
  • dans vos exemples de code, quelle est la différence entre la finition de la fonction" et de "travail et de s'engager"? Quand vous dites que l'arrivée de la fonctionnalité, voulez-vous dire de ne rien faire? Finition fonctionnalité peut signifier "faire plus de travail", auquel cas vous commettre. mais s'engager n'est pas mentionné. "Terminer la fonctionnalité" peut-être redondant et confus. si la fonctionnalité est fini, alors cela signifie que nous pouvons juste faire la prochaine étape. donc il faut juste parler de la prochaine étape, ne pas oublier une étape qui n'a pas besoin de quelque chose à faire, si c'est ce qu'il signifie.
  • À votre point d'origine au sujet de vouloir vos modifications sauvegardées sur le serveur au lieu de seulement localement, avez-vous venez de donner à ce sujet? Est-il un moyen de pousser les modifications apportées à un "travail" de la branche, puis déplacez-les vers un "fini" de la direction de la rebase et de squash?
  • Je ne fais que répondre sur le "Squash Fusion Controverse"::: il Pense que les deux formes de communication. 1) Sur la branche, des notes personnelles, peut-être un "wip presque terminé" ou "modifications après l'assurance qualité" ou "testing nouvel algorithme". Notes que c'est juste des ordures trois-quatre semaines en bas de la route.::: 2) la Communication avec les autres concepteurs et les gestionnaires. Lorsque sur la branche master, c'est mieux avec un message clair, par exemple "Demande de nouveau mot de passe lien mis en œuvre". Simple et direct
  • "Github et Bitbucket (d'autres?) Pull requests" Ne PAS utiliser des outils comme GitHub ou Bitbucket de la courge. Soyez prudent en utilisant automatique de squash ou IntelliJ même. La raison? Eh bien... Tous vos messages en cours sera ajouté au message. Comme je l'ai dit dans le commentaire ci-dessus: Deux formes de communication. Réécrire le message de dire clairement ce que vous avez fait dans une courte phrase.

InformationsquelleAutor Micah | 2009-01-19