Quel est L'équivalent Git des commandes TFS shelve / unshelve? cherry-pick?
J'ai trouvé que les commandes shelve/unshelve dans TFS sont très pratiques et très simples à utiliser. Quel est L'équivalent dans Git ?
Voici le scénario dans TFS:
- j'ai fait des changements dans le coffre
- je range : le jeu de modifications est enregistré sur le serveur (avec une étiquette) et je récupère la source avant les modifications
- je travaille dans le coffre
- Quelqu'un peut décompresser : obtenir le changement dans son espace de travail
Je sais qu'il y a un appel de commande cherry-pick mais Je ne suis pas sûr du flux de travail et si elle correspond au besoin.
3 réponses
Ce que vous décrivez est similaire à git stash
, sauf qu'avec git vous avez votre propre référentiel (pas seulement un seul sur un serveur), vous seul pouvez récupérer ce changement.
, L'idée générale est:
# do some stuff
vim foo/bar.c
# stash away your changes
git stash
# do some other things...
# retrieve your changes
git stash pop
Si vous voulez que quelqu'un d'autre ait accès à ce changeset, vous voudriez plutôt le valider dans une branche de travail:
# make yourself a branch
git checkout -b temp-featureA
# commit to it
git add foo/bar.c; git commit
# now you push this branch (or they could just fetch straight from you)
git push origin temp-featureA
# Now, in someone else's repo:
# Fetch updates
git fetch origin
# Make a branch tracking the remote branch
git branch temp-featureA origin/temp-featureA
# Either check it out:
git checkout temp-featureA
# or cherry-pick it, to apply the changes somewhere else:
git cherry-pick temp-featureA
# or, if it's multiple commits, rebase it!
git rebase --onto my-branch start-of-featureA temp-featureA
Ce que vous voulez faire est accompli avec de vieilles ramifications dans git.
À Partir de une belle StackOverflow réponse par JaredPar:
Le rayonnage est un moyen d'enregistrer toutes les modifications sur votre boîte sans vous enregistrer. Les modifications sont conservées sur le serveur.
Ceci est analogue à commettre une branche et à la pousser vers un serveur dans git.
Comment le faire:
Disons que vous travaillez sur la branche" master " et que vous décidez de implémentez la fonctionnalité X. Vous commencez bien, mais votre patron vous dit que la fonctionnalité Y doit être implémentée dès que possible. Phil dans le cube suivant sur les volontaires pour terminer la fonctionnalité X pendant que vous faites la fonctionnalité Y. voici ce que vous faites:
Créez une nouvelle branche et passez-y:
$ git checkout -b feature-x
Validez vos modifications:
$ git add filethatyouchanged.cc
$ git commit -m 'partial implementation of feature X'
Poussez-le vers un serveur que Phil peut voir:
$ git push origin feature-x
Retournez à la branche master (qui n'a pas changé):
$ git checkout master
Vous voudrez peut-être aussi créer de manière proactive une nouvelle branche pour la fonctionnalité Y:
$ git checkout -b feature-y
Phil peut maintenant tirer vers le bas votre fonction X travail et ramasser où vous l'avez laissé:
phil$ git fetch origin
phil$ git checkout -t origin/feature-x
Git stash est un peu similaire, sauf que c'est limité à votre arbre de travail.
Dans un DVCS, pour réaliser ce type de flux de travail, vous devez:
- validez vos modifications actuelles dans une nouvelle branche
- extraire la branche d'origine où vous pouvez continuer, sans aucune des modifications que vous avez introduites (mais validées dans la nouvelle branche)
- pousser cette nouvelle branche à un repo NU
- permettre à un autre développeur de tirer cette nouvelle branche et de la fusionner avec la sienne actuelles de la direction générale.
Une autre façon serait de laisser l'autre développeur récupérer votre branche (où vous avez commis cet ensemble spécial de modifications), et cherry-pick it, mais ce n'est pas recommandé, car les commits cherry-picked sont difficiles à suivre.