J'ai été en utilisant git depuis quelques 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ée:
cloner le repo distant git checkout -b my_new_feature ..de travail et de commettre quelques trucs git rebase maître ..de travail et de commettre quelques trucs git rebase maître ..la finition de la fonction 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, c'est le flux de travail que j'ai commencé avec
clone distance repo créer my_new_feature direction sur la télécommande repo git checkout -b --piste my_new_feature origine/my_new_feature ..de travail, de valider, de les pousser à l'origine/my_new_feature git merge master (pour obtenir les quelques modifications que mon partenaire ajouté) ..de travail, de valider, de les pousser à l'origine/my_new_feature git merge master ..finition my_new_feature, pousser à l'origine/my_new_feature git checkout master git merge my_new_feature supprimer la branche distante supprimer la succursale locale
Il y a 2 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) à la distance de prise en pension.
Mon raisonnement pour la branche distante, c'est que je veux que mes travaillé sauvegardés comme je suis en train de travailler. Notre repo 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 2 années 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 ça fonctionne:
cloner le repo distant git checkout -b my_new_feature ..de travail et de commettre quelques trucs git rebase maître ..de travail et de commettre quelques trucs git rebase maître ..la finition de la fonction git checkout master git merge my_new_feature
En fait, notre flux de travail est un peu différent, comme nous avons tendance à faire de squash fusionne au lieu de matières premières fusions. 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:
cloner le repo distant git checkout -b my_new_feature ..de travail et de commettre quelques trucs git rebase maître ..de travail et de commettre quelques trucs git rebase maître ..la finition de la fonction git checkout master git merge --squash my_new_feature git commit -m "ajout my_new_feature" git branch-D my_new_feature
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.