Existe-t-il un moyen de stocker uniquement mes modifications par étapes? Le scénario avec lequel je rencontre des problèmes est lorsque j'ai travaillé sur plusieurs bogues à un moment donné et que j'ai plusieurs modifications non mises en scène. J'aimerais pouvoir mettre en scène ces fichiers individuellement, créer mes fichiers .patch et les ranger jusqu'à ce que le code soit approuvé. De cette façon, quand il est approuvé, je peux ranger toute ma session (en cours), faire apparaître ce bogue et pousser le code.
Suis-je en train de mal faire ça? Suis-je en train de mal comprendre comment git peut fonctionner de différentes manières pour simplifier mon processus?
Réponses:
Oui, c'est possible avec DOUBLE STASH
git stash --keep-index
. Cette commande créera une cachette avec TOUTES vos modifications (par étapes et non par étapes ), mais laissera les modifications par étapes dans votre répertoire de travail (toujours à l'état par étapes).git stash push -m "good stash"
"good stash"
contient uniquement des fichiers intermédiaires .Maintenant, si vous avez besoin de fichiers non organisés avant le stockage, appliquez simplement le premier stockage ( celui créé avec
--keep-index
) et vous pouvez maintenant supprimer les fichiers que vous avez stockés"good stash"
.Prendre plaisir
la source
-u
commutateur.git stash apply --index
option d' utilisation des changements d'unstages . Cela va essayer de garder votre état non (par étapes). Il est maintenant plus facile de supprimer les modifications indésirables de l'arborescence de travail.Avec le dernier git, vous pouvez utiliser l'
--patch
optionEt git vous demandera chaque modification de vos fichiers à ajouter ou non dans la cachette.
Vous venez de répondre
y
oun
Alias UPD pour DOUBLE STASH :
Vous pouvez maintenant mettre en scène vos fichiers, puis exécuter
git stash-staged
.En conséquence, vos fichiers intermédiaires seront enregistrés dans la cachette .
Si vous ne souhaitez pas conserver les fichiers intermédiaires et que vous souhaitez les placer dans la réserve. Ensuite, vous pouvez ajouter un autre alias et exécuter
git move-staged
:la source
-u|--include-untracked
option degit-stash
J'ai fait un script qui ne cache que ce qui est actuellement mis en scène et laisse tout le reste. C'est génial quand je commence à faire trop de changements sans rapport. Il vous suffit de mettre en scène ce qui n'est pas lié au commit souhaité et de le cacher.
(Merci à Bartłomiej pour le point de départ)
la source
Voici un simple doublure:
Et pour ajouter un message simplement:
la source
Pour accomplir la même chose ...
git commit -m 'temp'
git add .
git stash
git reset HEAD~1
Boom. Les fichiers dont vous ne voulez pas sont cachés. Les fichiers que vous souhaitez sont tous prêts pour vous.
la source
Dans ce scénario, je préfère créer de nouvelles branches pour chaque problème. J'utilise un préfixe temp / donc je sais que je peux supprimer ces branches plus tard.
Mettez en scène les fichiers qui corrigent bug1 et validez-les.
Vous pouvez ensuite sélectionner les commits dans les succursales respectives et soumettre une demande de tirage.
la source
Pourquoi ne commettez-vous pas la modification pour un certain bogue et ne créez-vous pas de correctif à partir de cette validation et de son prédécesseur?
Ensuite, pour créer les correctifs appropriés, utilisez
git format-patch
:Cela va créer deux fichiers:
0001-fix-bug-123.patch
et0002-fix-bug-321.patch
Ou vous pouvez créer des branches distinctes pour chaque bogue, de sorte que vous pouvez fusionner ou rebaser les correctifs de bogue individuellement, ou même les supprimer, s'ils ne fonctionnent pas.
la source
git stash --keep-index
est une bonne solution ... sauf qu'il ne fonctionnait pas correctement sur les chemins qui ont été supprimés, ce qui a été corrigé dans Git 2.23 (Q3 2019)Voir commit b932f6a (16 juil.2019 ) par Thomas Gummerer (
tgummerer
) .(Fusionné par Junio C Hamano -
gitster
- en commit f8aee85 , 25 juil.2019 )la source
Cacher uniquement l'index (changements échelonnés) dans Git est plus difficile qu'il ne devrait l'être. J'ai trouvé que la réponse de @ Joe fonctionnait bien, et en ai transformé une variante mineure en cet alias:
Il pousse à la fois la mise en scène et les changements dans Unstaged une planque temporaire, laissant le seul mis en scène des changements. Il pousse ensuite les modifications par étapes dans la cachette, qui est la cachette que nous voulons conserver. Les arguments passés à l'alias, tels que ceux
--message "whatever"
qui seront ajoutés à cette commande stash. Enfin, il fait apparaître la cachette temporaire pour restaurer l'état d'origine et supprimer la cachette temporaire, puis «supprime» finalement les modifications stockées du répertoire de travail via une application de patch inverse.Pour le problème opposé de ne cacher que les modifications non mises en scène (alias
stash-working
), consultez cette réponse .la source
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.
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.
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.Imaginons que quelqu'un d'autre engage E & F sur master pendant que vous attendez l'examen.
Une fois votre code approuvé, vous pouvez le rebaser sur master en procédant comme suit:
Cela se traduira par les éléments suivants:
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:
Voici ce que vous verrez lorsque vous tapez
git rebase -i master bug1
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.
Alors oui, écraser est un peu pénible, mais je le recommanderais toujours à une utilisation intensive des cachettes.
la source
git checkout master; git checkout -b bug2
peut être raccourcigit checkout -b bug2 master
. La même chose s'applique àgit checkout bug1; git rebase master; git checkout master; git merge bug1
, qui est identique àgit rebase master bug1; git push . bug1:master
(accordé, l'push
astuce n'est pas évidente)D'après vos commentaires à la réponse de Mike Monkiewicz, je suggère d'utiliser un modèle plus simple: utilisez des branches de développement régulières, mais utilisez l'option squash de la fusion pour obtenir un seul commit dans votre branche principale:
L'avantage de cette procédure est que vous pouvez utiliser le flux de travail git normal.
la source
Après avoir créé un alias:
Ici
git diff
renvoie la liste des--staged
fichiers--name-only
Et puis nous passons cette liste comme
pathspec
à lagit stash
virgule.De
man git stash
:la source
Pour élaguer une modification accidentelle, en particulier la suppression de plusieurs fichiers, procédez comme suit:
en d'autres termes, rangez la merde et jetez-la avec la cachette.
Testé dans git version 2.17.1
la source