Comment puis-je pousser un commit spécifique sur une télécommande, et non des commits précédents?

j'ai fait plusieurs s'engage sur différents dossiers, mais jusqu'à présent, je voudrais pousser mon dépôt distant d'une validation.

est-ce possible?

671
demandé sur JohnAllen 2010-07-12 20:07:13

6 réponses

pousser via un commit, vous pouvez écrire:

git push <remotename> <commit SHA>:<remotebranchname>

pourvu que <remotebranchname> existe déjà sur la télécommande. (Si ce n'est pas le cas, vous pouvez utiliser git push <remotename> <commit SHA>:refs/heads/<remotebranchname> pour l'autocréer.)

si vous voulez pousser une commit sans pousser les commits précédents, vous devez d'abord utiliser git rebase -i pour ré-ordonner les commits.

MODIFIER

pour une description plus complète de ce qu'il faut faire, consultez la réponse de Samuel: https://stackoverflow.com/a/27907287/889213

, les Références:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/
845
répondu Geoff Reedy 2017-08-14 15:23:30

essayé la solution proposée:

git push <remotename> <commit SHA>:<remotebranchname>

comme ceci:

git push origin 712acff81033eddc90bb2b45e1e4cd031fefc50f:master

dans mon cas maître était 5 commits en avant et je voulais juste pousser mon dernier commit mais le ci-dessus a fini par pousser tous mes changements jusqu'à et y compris le commit nommé. Il me semble que la méthode de sélection pourrait être une meilleure approche pour cette utilisation.

125
répondu Sam M 2010-12-23 03:40:54

les autres réponses manquent sur les descriptions de réorganisation.

git push <remotename> <commit SHA>:<remotebranchname>

poussera un seul commit, mais ce commit doit être le plus ancien de votre local, non poussé, commits, à ne pas confondre avec le top, le first, ou le tip commit, qui sont toutes des descriptions ambiguës à mon avis. La validation doit le plus ancien de vos commits, c'est à dire le plus éloigné de votre dernier commit. Si ce n'est pas le plus ancien commit, alors tous les commits de votre plus ancien, local, SHA non poussé vers le SHA spécifié sera poussé. Pour réordonner l'utilisation de commits:

git rebase -i HEAD~xxx

après avoir réorganisé la propagation, vous pouvez la pousser en toute sécurité vers le dépôt distant.

pour résumer, j'ai utilisé

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

pour pousser un seul commit à ma branche master distante.

, les Références:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git /

voir aussi:

  1. git: Dupliquer s'Engage Après Rebase Suivie par Pull
  2. git: Pousser Unique s'Engage, de Réorganisation avec rebase, Dupliquer s'Engage
47
répondu Samuel 2017-05-23 11:47:29

je suggère d'utiliser git rebase -i ; déplacez le commit que vous voulez pousser vers le haut des commits que vous avez fait. Ensuite, utilisez git log pour obtenir le SHA de la propagation rebasée, vérifiez-le, et poussez-le. Le rebase aura fait en sorte que tous les autres commits soient maintenant les enfants de celui que vous avez poussé, donc les futures pushs fonctionneront très bien aussi.

25
répondu Walter Mundt 2010-07-13 11:04:17

Cherry-pick fonctionne mieux par rapport à toutes les autres méthodes tout en poussant une commit spécifique.

La façon de le faire est:

créer une nouvelle branche -

git branch <new-branch>

mettre à jour votre nouvelle branche avec votre branche d'origine -

git fetch

git rebase

ces actions feront en sorte que vous avez exactement la même chose que votre origine a.

choisissez le sha id que vous voulez faire push -

git cherry-pick <sha id of the commit>

vous pouvez obtenir le sha id en exécutant

git log

Pousser à l'origine -

git push

Exécuter gitk de voir que tout à l'air de la même manière que vous vouliez.

18
répondu David 2013-10-16 23:26:18

je crois que vous devriez" revenir en arrière " à ce commit et ensuite le pousser. Ou vous pouvez cherry-pick un commit dans une nouvelle branche, et pousser cela à la branche sur la prise en compte à distance. Quelque chose comme:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}
8
répondu Josh K 2010-07-12 16:12:42