J'ai modifié certains fichiers dans mon référentiel, mais je ne veux pas qu'ils soient rendus publics ou que je crée une branche temporaire pour les stocker. Je veux juste enregistrer ces modifications quelque part. Alors quelle commande est la meilleure:
git stash save "save message"
ou
git commit -am "save message"
?
Si j'utilise git commit
, est-il vrai que tous mes commits locaux seront poussés publiquement par un git Push
commande? Et si je veux simplement pousser un commit spécifique parmi eux?
Lorsque vous poussez, vous poussez toujours un commit spécifique (généralement le commit à la pointe de votre branche actuellement extraite). Cependant, comme le hachage du commit se compose en partie des validations sur lesquelles il se fonde (ses validations parentes), vous avez pour pousser également toutes les validations parentes. Et en poussant les validations parentales, vous devez également pousser leurs validations parentales et ainsi de suite. Ainsi, vous ne pouvez pousser que l'historique complet d'un commit spécifique.
Si vous créez un commit juste pour stocker quelque chose mais pas pour le pousser, vous devez vous assurer de ne jamais pousser ce commit, ni aucun commit sur la base de ce commit. Pour ce faire, après avoir effectué votre travail basé sur la validation temporaire, vous devez écraser la validation temporaire dans la nouvelle validation que vous créez pour la pousser.
En d'autres termes, oui, il est possible d'utiliser un commit pour un stockage privé temporaire. Cependant, il est beaucoup plus facile d'utiliser la fonction de dissimulation. En fait, la fonctionnalité est faite pour ce cas d'utilisation très.
Personnellement, je préfère aller directement dans les succursales privées (locales), mais les cachettes fonctionnent. Soyez conscient de deux choses au sujet des cachettes:
refs/tags/tag-foo
; une branche a la forme refs/tags/branch-foo
; et la validation de stockage stash unique est intitulée refs/stash
. Bien sûr, les étiquettes de branche ont également la fonctionnalité "se déplace automatiquement lorsque vous ajoutez des validations", mais si vous n'y ajoutez jamais plus de validations, elles ne se déplacent jamais, elles fonctionnent donc aussi bien pour enregistrer une seule validation.)refs/stash
non, mais vous pouvez changer cela avec les entrées de configuration - ainsi les validations de cache empilées peuvent également "expirer" (en même temps que l'entrée reflog expire). (Plus précisément, ils "deviennent collectables", mais cette distinction n'est pas utile s'ils sont partis. :-))L'intention avec les stashes est de sauver quelque chose à court terme. Si vous êtes déjà revenu à un repo tard et que vous avez trouvé un tas de cachettes, toutes nommées "WIP on branch", ce n'est pas amusant d'essayer de les comprendre.
Les autres fonctionnalités/bugs :-) stash
fournissent sont:
git stash branch
vous permet de changer d'avis après coup et de transformer une cachette en branche. Donc, si le "court terme" s'avère être un problème (vous alliez le réparer cet après-midi mais maintenant il a été repoussé pendant au moins un mois), vous pouvez tout simplement transformer la cachette en branche après tout.git stash apply [--index]
fera de son mieux pour "refaire" le changement appliqué dans la branche courante. Avec --index
il essaiera de restaurer indépendamment les modifications par étapes et par étapes. (Il y a des cas où cela est impossible, cependant.)git stash pop
supprime automatiquement la référence de sauvegarde pour vous. Malheureusement, il le fait même si vous avez l'intention d'utiliser git stash pop --index
et omis le --index
partie. Il est facile de perdre une partie de votre état (par étapes vs non par étapes) si vous utilisez pop
. Si vous utilisez apply
, et plus tard drop
une fois que vous êtes sûr d'avoir tout récupéré comme vous le vouliez, vous pouvez éviter ce problème.Notez que git stash branch
implique --index
: la branche nouvellement créée aura des modifications échelonnées et non échelonnées restaurées telles qu'elles étaient lorsque vous avez fait le git stash
. (La branche dérivera du commit sur lequel vous étiez lorsque vous avez fait le git stash
, aussi.) Validez les modifications (git add
- plus si vous le souhaitez, ou en tant que deux commits séparés, ou autre) et procédez comme si vous aviez créé une branche privée en premier lieu.
1La partie expirable de la pile se compose de tous les masques autres que stash@{0}
, dans git stash list
production.
Je vous suggère d'utiliser l'outil de masquage pour cela. Voilà pourquoi est-il ici. Vous pouvez cacher vos modifications et les ajouter ultérieurement à votre code. Il y a beaucoup plus de fonctionnalités que vous pouvez utiliser avec git stash. Voici le lien http://git-scm.com/book/en/Git-Tools-Stashing
Je vous suggère de parcourir une fois la documentation de git ici . Lisez également à propos de l'outil. Après cela, vous deviendrez certainement le maître de git.
Je fais les choses un peu différemment. Pour moi, les cachettes sont plus pour des économies rapides, pas pour le travail quotidien, car elles ne sont pas (facilement) granulaires dans ce que vous pouvez réellement ranger. (c'est-à-dire si j'ai 20 fichiers modifiés et que je veux créer deux stashes de dix chacun, ce n'est pas facile à faire.)
C'est pourquoi je veux que mes changements quotidiens soient engagés dans une branche réelle, bien que temporaire, uniquement pour mon usage personnel afin que je puisse inclure des notes et d'autres de mon travail au fur et à mesure. Check-ins quotidiens, expériences, etc. Fondamentalement, les choses que je ne veux pas veulent pousser au repo final.
Lorsque je suis dans un état où je suis prêt à valider le référentiel principal, j'utilise la commande "soft reset" sur la validation à partir de laquelle je me suis ramifié. Cela remet toutes mes modifications validées par la branche temporaire en tant que modifications actuelles sur cette validation d'origine sans aucun de mes antécédents de travail quotidiens.
Je crée ensuite une nouvelle branche pour ces "nouveaux" changements et je peux soit les valider tous en même temps, soit la diviser en plusieurs validations si cela a du sens (c'est-à-dire une pour le back-end, une autre pour le front- fin des trucs, un autre pour les ressources, etc.)
Quand j'ai fini, je me retrouve avec une branche sympa, nouvelle et propre avec une histoire qui a du sens pour les autres développeurs, libre de mes notes quotidiennes, et prête à fusionner et repousser dans le repo principal. Ensuite, je peux supprimer mes branches temporaires et passer à la tâche suivante.
Donc pour récapituler ...
Un autre avantage est que je peux réellement pousser les branches temporaires vers le référentiel distant afin que je puisse travailler à partir de plusieurs emplacements que vous ne pouvez pas faire avec une cachette. N'oubliez pas que lorsque vous avez terminé, nettoyez les choses hors du serveur pour garder la navigation sur le repo propre. (Certains peuvent soutenir que techniquement les commits sont toujours là, juste détachés, ce qui est vrai, mais les branches sont légères en GIT, et d'une certaine manière, cela devient un autre filet de sécurité pour ne pas perdre de travail car vous pouvez récupérer un commit détaché si vraiment nécessaire.)