2010-06-10 9 views
3

Il semble qu'il est suggéré que nous puissions nous engager souvent à garder trace des changements intermédiaires de code que nous avons écrits ... comme sur hginit.com, en utilisant Mercurial ou Git. Cependant, disons que si nous travaillons sur un projet, nous commettons souvent des fichiers. Maintenant, pour une raison ou pour une autre, le manager veut qu'une partie de la fonctionnalité sorte, donc nous devons faire un push, mais j'ai entendu dire que sur Mercurial ou Git, il n'y a aucun moyen de pousser des fichiers individuels ou un dossier ... est poussé ou rien n'est poussé. Donc, soit nous devons restaurer tous ces fichiers que nous ne voulons pas pousser, soit nous ne devons jamais nous engager avant que nous ne les repoussions - juste après la validation, nous poussons?Est-il bon de commettre des fichiers souvent si vous utilisez Mercurial ou Git?

Répondre

11

La meilleure façon de gérer ce (si vous utilisez Mercurial, Git ou tout autre système de contrôle de révision) est de se assurer est fait sur les branches de votre travail qui correspondent à ces « parties de caractéristiques ». S'il y a même une petite chance qu'une partie du travail doive être libérée indépendamment des autres travaux, devrait avoir sa propre branche depuis le début.

Cela vous donne la possibilité de pousser juste la « partie de la fonction », et est beaucoup mieux adapté dans le cas où la « partie de fonction » et une autre « partie de la fonction » contiennent tous deux changements au même fichier.

La bonne chose sur l'utilisation Mercurial ou Git est ici que la gestion de ces branches est trivial, de sorte que le coût pour créer et utiliser les (même si elles se révèlent ne pas être nécessaire) est minime.

Maintenant, vous ne pouvez pas toujours tout prévoir. Si vous finissez coincé dans la situation que vous décrivez, cependant, il est facile de sortir de. Disons que vous avez 100 changesets localement (pas encore sur le serveur) et que vous voulez juste pousser le contenu actuel de 1 fichier. Créez un clone du référentiel sur lequel vous travaillez à la révision du serveur, copiez le fichier , validez, validez et réintégrez le fichier. Dans Mercurial cela ressemblerait à quelque chose comme ce qui suit:

$ cd ~/project 
$ hg clone http://server/project/trunk trunk-oops 
$ cp trunk/shouldve-branched trunk-oops/shouldve-branched 
$ cd trunk-oops; hg addrem; hg ci -m "We need to organize better!"; hg push 
$ cd ../trunk; hg fetch ../trunk-oops 
+0

puis rmdir camion-oops? Sur PC, la dernière fois que je "hg clone" et "hg update", c'était comme 500MB, donc si je fais l'étape (2) ci-dessus (le clone hg), ça ne sera pas très gros sur le PC? (assurez-vous juste de ne pas faire "hg update" sinon il va tirer les données de 500Mo?) –

+2

Si l'espace est un souci (ou même s'il ne l'est pas), cloner localement. Mercurial va créer des liens durs afin que l'espace supplémentaire ne soit pas consommé. hg clone -rSERVER_REVISION_HASH trunk tronc-oops –

+0

Qu'est-ce que tout cela sur le clonage? Je sais que Mercurial n'est pas identique à git, mais vous pourriez sûrement créer une autre branche, pick-up/rebase (ou l'analogue hg) pour obtenir ce que vous vouliez et pousser (alors prenez soin de la branche originale, mais vous devez). – Cascabel

4

Développer sur les branches.

Possède une branche de publication et des branches d'entités. Fusionner dans chaque entité dès qu'elle devient disponible.

3

Il est recommandé de s'engager souvent. Dans votre cas, il semble que vous deviez commencer à étiqueter et/ou à ramifier plus souvent.

1

Pour élargir et à clarifier ce que les autres ont dit: commettre souvent et flexible pousser ne sont pas mutuellement exclusifs.

Vous voulez planifier à l'avance, et faire vos commits de sorte que vous serez en mesure de s'adapter. Cela signifie deux choses: vous devez vous assurer que vous vous engagez vraiment souvent, et vous devez vous connecter fréquemment (comme dans git). Si vos commits sont petits, il sera plus facile de les réorganiser plus tard si vous avez besoin de regrouper sélectivement une partie de votre travail. Et si vos branches sont bien organisées, vous pouvez déjà avoir une branche qui correspond exactement à ce que vous voulez pousser.

Comparez ces deux:

One branch, few commits: 

- A1 - B1 - C1 - B2 - A2 - B3 - C3 (master) 

Many branches, many commits: 

    M1 - M2 (master) 
/
o - A1 - A2 - A3 - A4 - A5 - A6 (topicA) 
|\ 
| B1 - B2 - B3 - B4 - B5 - B6 - B7 (topicB) 
\ 
C1 - C2 - C3 - C4 - C5 (topicC) 

Maintenant, si vous voulez libérer l'un de ces trois sujets en l'état, tout ce que vous devez faire est de le fusionner à maîtriser et pousser! Si vous voulez libérer la moitié de topicA, et que cette moitié est prise en charge dans les commits A1, A3, A4 et A6, tout ce que vous avez à faire est de rebaser topicA pour placer ces quatre commits en premier, fusionner le dernier en master, et pousser. Le reste de la rubrique A (A2 et A5) peut traîner pour un travail ultérieur.

M1 - M2 ------------- X (master) 
/     /
o - A1 - A3' - A4' - A6' - A2' - A5' (topicA) 

(COMMIT notée A1' , ... car avec git, un deux commits avec le même contenu, mais les parents sont différents commits en fait différents.)