web-dev-qa-db-fra.com

Utiliser git stash save ou git commit pour les changements locaux?

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?

21
Balthier

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.

16
Oznerol256

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:

  • Ce sont leurs propres engagements. À l'exception du label, il n'y a pas de différence fondamentale entre le commit "stash" et un commit lié à un label de branche ou de tag. (Une étiquette de balise a la forme 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.)
  • La "pile" cachée1 est implémenté à l'aide de reflogs. Reflogs can expire — par défaut la plupart le font (après 30 ou 90 jours), et ceux de 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.

4
torek

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.

0
Jatin Malwal

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 ...

  1. Créer une branche fonctionnelle
  2. Faites autant de commits/sous-branches que nécessaire pour faire votre travail
  3. Lorsque vous êtes prêt à fusionner sans conserver cet historique, git-reset revient au commit d'origine où vous avez créé une branche. Toutes vos modifications sont désormais des modifications locales.
  4. Réengagez et fusionnez comme bon vous semble

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.)

0
Mark A. Donohoe