web-dev-qa-db-fra.com

Comment puis-je pousser un commit spécifique sur une commande à distance et non précédente?

J'ai effectué plusieurs commits sur différents fichiers, mais je souhaite jusqu'ici envoyer à mon référentiel distant uniquement un commit spécifique.

Est-ce possible?

764
Robert23

Pour pousser jusqu'à un commit, vous pouvez écrire:

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

à condition 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 le créer automatiquement.)

Si vous voulez envoyer une validation sans en appuyant sur les validations précédentes, vous devez d’abord utiliser git rebase -i pour réorganiser les validations.

986
Geoff Reedy

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 avait 5 commits d'avance et je voulais juste pousser mon dernier commit, mais ce qui précède a fini par pousser toutes mes modifications jusqu'à et y compris le commit nommé. Il me semble que la méthode du choix des cerises pourrait être une meilleure approche pour ce cas d'utilisation.

142
Sam M

Les autres réponses manquent dans les descriptions de réorganisation.

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

poussera un seul commit, mais ce commit doit être le plus ancien de vos commits locaux, non poussés, à ne pas confondre avec le commit le plus haut, le premier ou le tip, qui sont tous des descriptions ambiguës à mon avis. Le commit a besoin du plus ancien de vos commits, c’est-à-dire le plus éloigné de votre dernier commit. Si ce n'est pas la plus ancienne des validations, toutes les validations de votre plus ancien SHA local, non poussé, sur le SHA spécifié seront poussées. Pour réorganiser les commits, utilisez:

git rebase -i HEAD~xxx

Après avoir réordonné le commit, vous pouvez le transférer en toute sécurité dans le référentiel distant.

Pour résumer, j'ai utilisé

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

pousser un seul commit vers ma branche maître distante.

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: les commandes dupliquées sont remises après une refonte locale suivie de l'extraction
  2. git: Pushing Single Commits, Réorganisation avec rebase, Duplicate Commits
66
Samuel

Je suggérerais d'utiliser git rebase -i; déplacez le commit que vous voulez pousser au sommet des commits que vous avez effectués. Ensuite, utilisez git log pour obtenir le SHA du commit à rebasement, extrayez-le et appuyez dessus. Le rebase veillera à ce que tous vos autres commits soient maintenant des enfants de celui que vous avez poussé, ainsi les poussées futures fonctionneront bien aussi.

25
Walter Mundt

Cherry-pick fonctionne 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 Origin -

git fetch

git rebase

Ces actions feront en sorte que vous ayez exactement les mêmes éléments que votre origine.

Sélectionnez le sha id que vous voulez faire. Push -

git cherry-pick <sha id of the commit>

Vous pouvez obtenir le sha id en lançant

git log

Poussez-le à votre origine -

git Push

Exécutez gitk pour voir que tout a l’air que vous souhaitiez.

20
David

Je crois que vous devriez "git revenir" à cette commettre et ensuite pousser. Ou vous pouvez cherry-pick une validation dans une nouvelle branche et le transmettre à la branche du référentiel distant. Quelque chose comme:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git Push Origin {branch}
11
Josh K