Comment obtenir un certain commit du projet GitHub

151

Je dois télécharger l'API Facebook depuis GitHub . Normalement, je clique simplement sur l'onglet "Téléchargements" pour télécharger le dernier code source. Dans ce cas, j'ai besoin d'un commit plus ancien: 91f256424531030a454548693c3a6ca49ca3f35a , mais je n'ai aucune idée de comment obtenir l'intégralité du projet à partir de ce commit ...

Est-ce que quelqu'un pourrait m'expliquer comment faire cela?

(BTW, je suis sur un mac. Je ne sais pas si cela fait une différence).

w00
la source
1
s'il vous plaît aussi voir stackoverflow.com/questions/13636559/ ... si vous avez "seulement" besoin du "code-instantané zippé".
Jean Fontaine

Réponses:

216

Tout d'abord, clonez le référentiel en utilisant git, par exemple avec:

git clone git://github.com/facebook/facebook-ios-sdk.git

Cela télécharge l'historique complet du référentiel, vous pouvez donc passer à n'importe quelle version. Ensuite, passez au référentiel nouvellement cloné:

cd facebook-ios-sdk

... et utilisez git checkout <COMMIT>pour passer au bon commit:

git checkout 91f25642453

Cela vous donnera un avertissement, puisque vous n'êtes plus sur une branche et que vous êtes directement passé à une version particulière. (Ceci est connu sous le nom d'état "HEAD détaché".) Comme il semble que vous souhaitiez uniquement utiliser ce SDK, plutôt que de le développer activement, ce n'est pas quelque chose dont vous devez vous inquiéter, à moins que vous ne souhaitiez le savoir en savoir plus sur le fonctionnement de git.

Mark Longair
la source
4
À ce stade, vous pouvez également git exportsi vous voulez simplement les fichiers.
Xeoncross
1
git checkout -q <commit#>fait taire l'avertissement stderr pendant la vérification de git.
Manavalan Gajapathy
Quand je fais git checkout 441b034635240bc873700473af3e98533e94a0b5, cela donne une erreur: fatal: la référence n'est pas un arbre: 441b034635240bc873700473af3e98533e94a0b5
ttb
135

Je ne sais pas si elle était là lorsque vous avez posté cette question, mais la meilleure et la plus simple façon de télécharger un commit est de cliquer sur l' onglet commits lors de la visualisation d'un référentiel. Ensuite, au lieu de cliquer sur le nom du commit, cliquez sur Parcourir le référentiel à ce stade dans le bouton historique avec le symbole <> à droite du nom / message du commit, et enfin sur le bouton Télécharger ZIP qui vient lorsque vous cliquez sur Cloner ou Bouton de téléchargement .

J'espère que cela vous aidera les gars.

Sivan
la source
3
C'est le seul moyen de récupérer les "commits perdus" qui sont des commits dont github a un historique, mais qui ont été effacés de la chronologie "officielle" de git. En utilisant cela, vous pouvez obtenir un instantané zip d'un commit qui a été rebasé dans l'oubli, pousser ce commit vers une nouvelle branche, récupérer cette branche dans un référentiel existant et la ramener à l'existence.
Ajax
@Ajax Ce n'est pas vrai. Vous pouvez toujours obtenir le sha en utilisant git reflog, puis vérifier le commit détaché
Aaron Brager
@AaronBrager bien sûr, reflog fonctionnera, SI vous êtes sur la même machine qui avait initialement eu le commit. L'OP connaît déjà le commit, donc ils n'auraient pas besoin de reflog et pourraient simplement vérifier directement. Cependant, je parle de cas où vous n'avez pas le commit localement, et ce n'est sur aucune des branches qui sont encore dans le repo public. Dans ces cas, github peut toujours avoir un enregistrement du commit, que vous pouvez télécharger sous forme de zip pour pouvoir récupérer ledit commit.
Ajax
@Ajax Ah, merci pour la clarification. Comme alternative, vous pouvez accéder à l' API GitHub ( api.github.com/repos/facebook/facebook-ios-sdk/events ) et créer une branche à partir du commit orphelin ( instructions ici )
Aaron Brager
Très agréable. +1 Je ne savais pas que vous pouviez interroger le reflog de github comme ça!
Ajax
27

La réponse de Sivan en gif entrez la description de l'image ici

1.Cliquez sur les commits dans github

2.Sélectionnez Parcourir le code sur le côté droit de chaque commit

3.Cliquez sur le zip de téléchargement, qui téléchargera le code source à ce moment de la validation

Suraj K Thomas
la source
Bonjour suraj pouvez-vous s'il vous plaît me dire comment vous avez créé le gif de votre écran?
Rahul Satal
utilisez le lecteur de temps rapide pour enregistrer une vidéo de l'écran.Faites la conversion de la vidéo en gif en utilisant n'importe quel outil disponible .Google it. @ Rahul Satal
Suraj K Thomas
1
Merci @SurajKThomas pour le gif
Sivan
10

Pour simplement télécharger un commit en utilisant la forme courte SHA1 à 7 chiffres, procédez comme suit:

Exemple de travail:

https://github.com/python/cpython/archive/31af650.zip  

La description:

 `https://github.com/username/projectname/archive/commitshakey.zip`

Si vous avez la clé de hachage longue 31af650ee25f65794b75d4dfefed6fe4758781c1, récupérez simplement les 7 premiers caractères 31af650. C'est la valeur par défaut pour GitHub.

user1767754
la source
8

Le moyen le plus simple que j'ai trouvé pour récupérer un commit perdu (qui n'existe que sur github et pas localement) est de créer une nouvelle branche qui inclut ce commit.

  1. Ouvrez le commit (URL comme: github.com/org/repo/commit/long-commit-sha)
  2. Cliquez sur "Parcourir les fichiers" en haut à droite
  3. Cliquez sur le menu déroulant "Tree: short-sha ..." en haut à gauche
  4. Tapez un nouveau nom de branche
  5. git pull la nouvelle succursale jusqu'au local
Jeff
la source
Cette réponse est plus générale que celle acceptée. J'ai rencontré cette situation où le commit que je voulais déjà a disparu sur la branche master, et Github ne gardera pas tous les commits sur des branches non existantes. Donc, cette approche créera une nouvelle branche à partir de ce commit sur Github et le rendra extractible.
Qi Luo
Cela m'a permis de récupérer un commit (avec le SHA d'origine intact) à partir d'un fork supprimé dont j'ai fait un PR. Après avoir créé un nouveau fork, j'ai ouvert le commit PR sur le dépôt en amont puis j'ai fait "parcourir les fichiers". J'ai ensuite copié cette URL et remplacé le nom d'utilisateur par le mien. Puis cliqué sur le menu déroulant Tree: et créé une nouvelle branche dans mon fork. A très bien fonctionné!
Allen Luce
2

Le titre de la question est ambigu.

Id2ndR
la source
1

En plus de la réponse acceptée:

Pour voir les hachages, vous devez utiliser la commande suggérée "git checkout hash ", vous pouvez utiliser git log. Cependant, en fonction de vos besoins, il existe un moyen plus simple que de copier / coller des hachages.

Vous pouvez utiliser git log --onelinepour lire de nombreux messages de validation dans un format plus compressé.

Disons que vous voyez cette liste en une ligne des commits avec un minimum d'informations et des hachages partiellement visibles:

hash111 (HEAD -> master, origin/master, origin/HEAD)
hash222 last commit
hash333 I want this one
hash444 did something
....

Si vous le souhaitez last commit, vous pouvez utiliser git checkout master^. Le ^vous donne le commit avant le maître. Alors hash222.

Si vous voulez le n-ième dernier commit, vous pouvez utiliser git checkout master~n. Par exemple, utiliser git checkout master~2vous donnera le commit hash333.

Benjamin Basmaci
la source
0

Au lieu de naviguer dans les commits, vous pouvez également appuyer sur la ytouche ( Aide Github , Raccourcis clavier ) pour obtenir le "permalien" de la révision / validation actuelle.
Cela changera l'URL de https://github.com/<user>/<repository>(master / HEAD) à https://github.com/<user>/<repository>/tree/<commit id>.

Afin de télécharger le commit spécifique, vous devrez recharger la page à partir de cette URL, de sorte que le Clone or Downloadbouton pointe vers le "snapshot" https://github.com/<user>/<repository>/archive/<commit id>.zip au lieu du dernier https://github.com/<user>/<repository>/archive/master.zip.

manipuler
la source
0

Essayez la séquence de commandes suivante:

$ git fetch origin <copy/past commit sha1 here>
$ git checkout FETCH_HEAD
$ git push origin master
Md. Rana
la source
-1

Si vous voulez aller avec un certain commit ou voulez coder un certain commit, vous pouvez utiliser la commande ci-dessous:

git checkout <BRANCH_NAME>
git reset --hard  <commit ID which code you want>
git push --force

Exemple:

 git reset --hard fbee9dd 
 git push --force
Shubham Verma
la source
2
C'est dangereux, il est plus logique de cloner le
dépôt