Est-il absolument nécessaire de travailler sur plusieurs bugs à la fois? Et par «à la fois», je veux dire «avoir des fichiers modifiés pour plusieurs bogues en même temps». Parce que sauf si vous en avez absolument besoin, je ne travaillerais que sur un bogue à la fois dans votre environnement. De cette façon, vous pouvez utiliser les branches locales et rebaser, ce que je trouve beaucoup plus facile que de gérer une stash / stage complexe.
Disons que le maître est au commit B. Maintenant, travaillons sur le bug # 1.
git checkout -b bug1
Vous êtes maintenant sur branch bug1. Apportez quelques modifications, validez, attendez la révision du code. C'est local, donc vous n'affectez personne d'autre, et cela devrait être assez facile de créer un patch à partir de git diffs.
A-B < master
\
C < bug1
Vous travaillez maintenant sur bug2. Aller Retour à maître avec git checkout master
. Faire une nouvelle branche, git checkout -b bug2
. Apportez des modifications, validez, attendez la révision du code.
D < bug2
/
A-B < master
\
C < bug1
Imaginons que quelqu'un d'autre engage E & F sur master pendant que vous attendez l'examen.
D < bug2
/
A-B-E-F < master
\
C < bug1
Une fois votre code approuvé, vous pouvez le rebaser sur master en procédant comme suit:
git checkout bug1
git rebase master
git checkout master
git merge bug1
Cela se traduira par les éléments suivants:
D < bug2
/
A-B-E-F-C' < master, bug1
Ensuite, vous pouvez pousser, supprimer votre branche locale bug1, et c'est parti. Un bogue à la fois dans votre espace de travail, mais en utilisant des branches locales, votre référentiel peut gérer plusieurs bogues. Et cela évite une danse de scène / stash compliquée.
Réponse à la question de ctote dans les commentaires:
Eh bien, vous pouvez revenir à la sauvegarde pour chaque bogue et ne travailler qu'avec un seul bogue à la fois. Au moins cela vous évite le problème de la mise en scène. Mais après avoir essayé cela, je trouve personnellement cela gênant. Les cachettes sont un peu désordonnées dans un graphique de journal git. Et plus important encore, si vous bousillez quelque chose, vous ne pouvez pas revenir en arrière. Si vous avez un répertoire de travail sale et que vous ouvrez une cachette, vous ne pouvez pas "annuler" cette fenêtre. Il est beaucoup plus difficile de bousiller les commits déjà existants.
Alors git rebase -i
.
Lorsque vous rebasez une branche sur une autre, vous pouvez le faire de manière interactive (indicateur -i). Lorsque vous faites cela, vous avez la possibilité de choisir ce que vous voulez faire avec chaque commit. Pro Git est un livre génial qui est également en ligne au format HTML, et a une belle section sur le rebasage et le squash:
http://git-scm.com/book/ch6-4.html
Je vais voler leur exemple textuellement pour plus de commodité. Imaginez que vous avez l'historique de validation suivant et que vous souhaitez rebaser et écraser bug1 sur master:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
Voici ce que vous verrez lorsque vous tapez git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Pour écraser toutes les validations d'une branche vers le bas en une seule validation, conservez le premier commit comme "pick" et remplacez toutes les entrées "pick" suivantes par "squash" ou simplement "s". Vous aurez également la possibilité de modifier le message de validation.
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
Alors oui, écraser est un peu pénible, mais je le recommanderais toujours à une utilisation intensive des cachettes.