Comment choisir parmi une branche distante?


135

J'ai du mal à effectuer une sélection. Sur ma machine locale, je suis actuellement sur ma branche "master". Je veux sélectionner un commit d'une autre branche, nommée "zebra". La branche "zebra" est une branche distante.

Donc, git status:

# On branch master
nothing to commit (working directory clean)

Ok, maintenant j'essaye de choisir le commit que je veux:

git cherry-pick xyz
fatal: bad object xyz

où "xyz" est la signature du commit qui m'intéresse, qui s'est produit sur la branche "zebra".

Donc, la première question évidente est, pourquoi ne peut-il pas trouver le commit auquel je fais référence? Je ne comprends pas vraiment comment cela fonctionne en premier lieu pour être honnête. Est-ce que git stocke quelque chose comme une base de données de commits localement dans mon répertoire de travail, pour toutes les autres branches? Lors de l'exécution de la commande cherry-pick, va-t-il rechercher cette base de données locale pour trouver le commit dont je parle?

Puisque "zebra" est une branche distante, je pensais que je n'ai pas ses données localement. J'ai donc changé de branche:

git checkout zebra
Switched to branch 'zebra'

Alors maintenant, sur ma machine locale, je peux voir que les fichiers du répertoire reflètent correctement l'état de zebra. Je reviens en maître, j'essaye à nouveau de faire un tri (en espérant que les données de validation sont disponibles maintenant), mais j'obtiens le même problème.

J'ai un malentendu fondamental sur ce qui se passe ici, toute aide serait formidable.


2
conceptuellement, tout semble correct. êtes-vous sûr d'utiliser le hachage correct (signature comme vous l'appelez) du commit? essayez 'git show <hash>' pour vérifier.
0xc0de

Salut, oui positif - mes deux branches sont sur github, et je peux les utiliser pour trouver les pages de commit de cette façon. Si je comprends bien, l'état de ma machine localement est tel que git ne peut pas trouver le hachage de 'zebra' dans le contexte de 'master'. Dois-je en quelque sorte lui dire que le «zèbre» existe aussi localement?
user291701

oh et faire 'git show xyz' donne la même erreur "fatal: bad object". (et je remplace xyz par le hachage correct).
user291701

Et pour clarifier, je peux utiliser mon hachage 'xyz' pour regarder le commit sur github sans problème, comme: " github.com/me/test/commit/xyz ".
user291701

Réponses:


195

Puisque "zebra" est une branche distante, je pensais ne pas avoir ses données localement.

Vous avez raison de ne pas avoir les bonnes données, mais vous avez essayé de les résoudre de la mauvaise manière. Pour collecter des données localement à partir d'une source distante, vous devez utiliser git fetch. Quand vous l'avez fait, git checkout zebravous êtes passé à quel que soit l'état de cette branche la dernière fois que vous avez récupéré. Alors récupérez d'abord la télécommande:

# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz


1
J'ai essayé cette approche pour choisir un correctif en amont sur Github et il s'est avéré que le hachage extrait était différent de celui sur Github. Par conséquent, j'ai dû vérifier, obtenir le hachage et le sélectionner.
DustWolf

1
Il manque vraiment ici une option pour passer remote en cherry-pick comme: git cherry-pick <remote> <hash>
Jared

a bien fonctionné après avoir récupéré la branche distante. Merci :)
Adeel

oui a fonctionné après avoir récupéré pour moi aussi. Plus d'informations sur git cherry-pick sont disponibles sur atlassian.com/git/tutorials/cherry-pick
Satheesh M

12

Juste comme un addendum à la réponse acceptée par OP:

Si vous rencontrez des problèmes avec

fatal: bad object xxxxx

c'est parce que vous n'avez pas accès à ce commit. Ce qui signifie que vous n'avez pas ce dépôt stocké localement. Ensuite:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

Où xxxxxxx est le hachage de validation souhaité.


hmm quand j'ai déjà ajouté le repo sans l'indicateur amont?
Gobliins

10

Ajout d'un dépôt distant (sous la forme "foo") à partir duquel nous voulons effectuer une sélection

$ git remote add foo git://github.com/foo/bar.git

Va chercher leurs branches

$ git fetch foo

Répertoriez leurs commits (cela devrait lister tous les commits dans la récupération foo)

$ git log foo/master

Choisissez le commit dont vous avez besoin

$ git cherry-pick 97fedac

5

Après avoir fusionné une branche de développement avec master, je supprime généralement la branche de développement. Cependant, si je veux sélectionner les commits dans la branche de développement, je dois utiliser le hachage de validation de fusion pour éviter l'erreur "mauvais objet".


3

Vous devez d'abord extraire les données de la branche sur votre disque local.

Ce qui se passe, c'est que vous essayez de choisir de la branche-a à la branche-b, où vous êtes actuellement sur la branche-b, mais la copie locale de la branche-a n'est pas encore mise à jour (vous devez effectuer un pull sur git les deux branches en premier).

étapes:
- git checkout branch-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- git cherry-pick <hash>

sortie:
[branch-b <hash>] données de journal
Auteur: Auteur <Auteur
1 fichier modifié, 1 insertion (+), 3 suppressions (-)


1

J'ai eu cette erreur renvoyée après avoir utilisé l'ID de validation à partir d'un onglet d'ID de validation de demande de tirage. Ce commit a ensuite été écrasé et fusionné. Dans la demande d'extraction github, recherchez ce texte: "a fusionné le commit xxxxxxx dans ..." au lieu d'essayer d'utiliser les identifiants de validation depuis l'onglet des validations.


1

Le commit doit être présent dans votre local, vérifiez en utilisant git log.

Si le commit n'est pas présent, essayez git fetchde mettre à jour le local avec la dernière télécommande.


0

Cela peut également être facilement réalisé avec SourceTree:

  • consultez votre branche principale
  • ouvrez l'onglet "Journal / Historique"
  • localisez le commit xyz et faites un clic droit dessus
  • cliquez sur "Fusionner ..."

terminé :)


Ceci est une erreur. Parce que maintenant, vous fusionnez la tête de master dans zebra au lieu de juste sélectionner les commits.
Chef Pharaoh

0

Si vous avez récupéré, mais que cela se produit toujours, ce qui suit peut être une raison.

Il peut arriver que le commit que vous essayez de choisir n'appartienne plus à aucune branche. Cela peut se produire lorsque vous rebasez.

Dans ce cas, au repo distant:

  1. git checkout xxxxx
  2. git checkout -b temp-branch

Ensuite, dans votre repo, récupérez à nouveau. La nouvelle branche sera récupérée, y compris ce commit.


0

J'ai résolu ce problème en allant sur la branche avec le commit que je veux choisir.

git checkout <branch With Commit To Cherry-Pick>

utiliser le journal pour trouver le hachage de validation

git log

lorsque vous avez trouvé votre hachage couper et coller sur le bloc-notes. si vous utilisez la commande, faites défiler vers le haut pour obtenir le hachage, puis vérifiez la branche dans laquelle vous souhaitez placer le commit.

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

enfin appeler cherry-pick depuis git (note) -x consiste à ajouter votre message cherry-pick à l'original. "Lors de l'enregistrement du commit, ajoutez une ligne qui dit" (cherry pick from commit…) "au message de commit d'origine afin d'indiquer à quel commit ce changement a été choisi."

git cherry-pick -x <your hash commit to add to the current branch>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.