Question Comment puis-je pousser un commit spécifique vers un commit distant, et non antérieur?


J'ai fait plusieurs validations sur des fichiers différents, mais jusqu'à présent je voudrais pousser vers mon dépôt distant uniquement un commit spécifique.

Est-ce possible?


654
2017-07-12 16:07


origine


Réponses:


Pousser à travers un engagement donné, vous pouvez écrire:

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

à condition de <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 un commit sans pour autant en poussant les commits précédents, vous devez d'abord utiliser git rebase -i pour réorganiser les commits.

MODIFIER

Pour une description plus complète de ce qu'il faut faire, vérifiez 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/

829
2017-07-12 16:27



J'ai essayé la solution suggérée:

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

comme ça:

git push origin 712acff81033eddc90bb2b45e1e4cd031fefc50f:master

Dans mon cas, le maître était 5 commits en avant et je voulais juste pousser mon dernier commit mais ce qui précède a fini par pousser tous mes changements jusqu'à et y compris le commit nommé. Il me semble que la méthode du choix de cerise pourrait être une meilleure approche pour cette utilisation.


123
2017-12-22 19:30



Les autres réponses manquent sur les descriptions de réordonnancement.

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

va pousser un seul commit, mais ce commit doit être le plus ancien de vos commit locaux, non-push, à ne pas confondre avec le top, le premier, ou le tip-commit, qui sont toutes des descriptions ambiguës à mon avis. Le commit doit être le plus ancien de vos commit, c'est-à-dire le plus éloigné de votre commit le plus récent. Si ce n'est pas le commit le plus ancien, alors tous les commit de votre SHA le plus ancien, local et non poussé vers le SHA spécifié seront poussés. Pour réorganiser l'utilisation des validations:

git rebase -i HEAD~xxx

Après avoir réorganisé le commit, vous pouvez le 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

pousser une seule validation vers ma branche maître 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 également:

  1. git: validations en double après la reconfiguration locale suivie par le pull
  2. git: Pousser des validations uniques, Réorganiser avec rebase, Commits en double

45
2018-01-12 17:12



Je suggère d'utiliser git rebase -i; déplacez le commit que vous voulez pousser au début des validations que vous avez faites. Ensuite, utilisez git log pour obtenir le SHA du commit rebasé, vérifiez-le et appuyez dessus. Le rebasage fera en sorte que tous vos autres commits sont maintenant des enfants de celui que vous avez poussé, donc les poussées futures fonctionneront bien aussi.


25
2017-07-13 11:04



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

La façon de faire est:

Créer une nouvelle branche -

git branch <new-branch>

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

git fetch

git rebase

Ces actions s'assureront que vous avez exactement les mêmes choses que votre origine.

Cherry-pick le sha id que vous voulez faire pousser -

git cherry-pick <sha id of the commit>

Vous pouvez obtenir le sha id en exécutant

git log

Poussez-le à votre origine -

git push

Courir gitk pour voir que tout a l'air comme tu le voulais.


18
2017-10-16 23:07



Je crois que tu devrais "revenir" à ce commit et le pousser. Ou vous pourriez cherry-pickun commit dans une nouvelle branche, et le pousser à la branche sur le repo distant. Quelque chose comme :

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}

8
2017-07-12 16:12