Supposons que j'ai 5 commits locaux. Je veux en pousser seulement 2 vers un référentiel centralisé (en utilisant un flux de travail de style SVN). Comment puis-je faire cela?
Cela n'a pas fonctionné:
git checkout HEAD~3 #set head to three commits ago
git push #attempt push from that head
Cela finit par pousser les 5 commits locaux.
Je suppose que je pourrais faire git reset pour réellement annuler mes commits, suivi de git stash puis de git push - mais j'ai déjà écrit des messages de commit et des fichiers organisés et je ne veux pas les refaire.
Mon sentiment est qu'un drapeau passé pour pousser ou réinitialiser fonctionnerait.
Si cela aide, voici ma configuration git
[ramanujan:~/myrepo/.git]$cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://server/git/myrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
la source
master~3
. Toute référence au commit "up to" souhaité est également valide, commeHEAD~3
ouHEAD~~~
, ou le SHA spécifique, ou une balise qui étiquette ce commit.git push
...)master
pour le côté distant du refspec, commegit push origin tocommit:newbramch
Ce que je fais, c'est travailler sur une branche locale appelée «travail». Cette branche contient tous les commits temporaires (comme les solutions de contournement ou les options de construction privées ou autre) que je n'ai pas l'intention de pousser vers le référentiel en amont. Je travaille loin sur cette branche, puis quand je veux engager je passe à la branche principale, écrémer les commits appropriés que je ne veux engager, puis pousser maître.
Après avoir transféré les modifications de l'amont dans ma branche principale, je
git checkout work
etgit rebase master
. Cela réécrit tous mes changements locaux pour être à la fin de l'histoire.J'utilise actuellement
git svn
avec ce workflow, donc mon opération "push" impliquegit svn dcommit
. J'utilise égalementtig
qui est une belle visionneuse de référentiel d'interface graphique en mode texte, pour sélectionner les commits appropriés à maîtriser.la source
work
branche. Ensuite, vous fusionnez des branches spécifiquesmaster
afin de ne pas perdre leur historique. Lorsque vous travaillez avecwork
, vous fusionnez toutes vos branches dans celui-ci. C'est plus de frais généraux, mais cela peut valoir la peine dans certains cas.Par défaut, git-push pousse toutes les branches. Lorsque vous faites ceci:
Vous vous déplacez vers une HEAD détachée (vous n'êtes sur aucune branche) puis vous poussez toutes les branches, y compris le maître local (qui est toujours là où il était) vers le maître distant.
La solution manuelle est:
Si vous trouvez que le comportement par défaut de pousser toutes les branches est déroutant (et dangereux!), Ajoutez ceci à votre ~ / .gitconfig:
Ensuite, seule la branche sur laquelle vous vous trouvez est poussée. Dans votre exemple (une tête détachée), vous auriez reçu ce message d'erreur, plutôt que de pousser accidentellement les mauvais commits:
la source
Réponse courte:
git push <latest commit SHA1 until you want commits to be pushed>
Exemples:
git push fc47b2
git push HEAD~2
Longue réponse:
Les validations sont liées ensemble comme une chaîne avec un mécanisme parent / enfant. Ainsi, pousser un commit pousse également tous les commits parents à ce commit qui n'était pas connu du distant. Ceci est implicitement fait lors de
git push
la validation actuelle: toutes les validations précédentes sont également poussées car cette commande est équivalente àgit push HEAD
.Ainsi, la question pourrait être réécrite dans Comment pousser un commit spécifique et ce commit spécifique pourrait être HEAD ~ 2, par exemple.
Si les commits que vous souhaitez pousser ne sont pas consécutifs, il vous suffit de les réorganiser avec un
git rebase -i
avant le push spécifique .la source
1) Utilisez "git rebase" pour réorganiser vos commits, si vous le souhaitez.
Cette commande affichera quelque chose comme ça dans votre éditeur (j'utilise vim)
2) Réorganisez vos commits selon votre choix par simple copier-coller. Supposons que le nouvel ordre soit
choisissez 9781434 commitE
choisissez c3d4961 commitC
choisissez 4791291 commitA
choisissez aa1cefc commitD
choisissez a2bdfbd commitB
Apportez ces modifications dans votre éditeur et appuyez sur ctrl + O (writeOut)
Ou vous pouvez également utiliser
Vous pouvez vérifier la nouvelle séquence avec
3) Maintenant, utilisez
Si une seule branche à distance (origine) et une à local (maître), utilisez simplement
Cela poussera commitB et commitD.
la source