So erhalten Sie ein bestimmtes Commit aus dem GitHub-Projekt


151

Ich muss die Facebook-API von GitHub herunterladen . Normalerweise klicke ich einfach auf die Registerkarte "Downloads", um den neuesten Quellcode herunterzuladen. In diesem Fall benötige ich ein älteres Commit: 91f256424531030a454548693c3a6ca49ca3f35a , aber ich habe keine Ahnung, wie ich das gesamte Projekt aus diesem Commit erhalten kann ...

Kann mir bitte jemand sagen, wie das geht?

(Übrigens bin ich auf einem Mac. Ich weiß nicht, ob das einen Unterschied macht.)


1
Bitte lesen Sie auch stackoverflow.com/questions/13636559/…, wenn Sie "nur" den "Zipped-Snapshot-Code" benötigen.
Jean Fontaine

Antworten:


216

Klonen Sie zunächst das Repository mit git, z. B. mit:

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

Dadurch wird der vollständige Verlauf des Repositorys heruntergeladen, sodass Sie zu einer beliebigen Version wechseln können. Wechseln Sie als Nächstes in das neu geklonte Repository:

cd facebook-ios-sdk

... und verwenden git checkout <COMMIT>, um zum richtigen Commit zu wechseln:

git checkout 91f25642453

Das gibt Ihnen eine Warnung, da Sie sich nicht mehr in einem Zweig befinden und direkt zu einer bestimmten Version gewechselt sind. (Dies wird als "losgelöster HEAD" -Zustand bezeichnet.) Da es so klingt, als ob Sie dieses SDK nur verwenden möchten, anstatt es aktiv zu entwickeln, müssen Sie sich darüber keine Sorgen machen, es sei denn, Sie möchten es herausfinden mehr darüber, wie git funktioniert.


4
An dieser Stelle können Sie auch, git exportwenn Sie nur die Dateien wollen.
Xeoncross

1
git checkout -q <commit#>bringt stderr beim git checkout zum stumm.
Manavalan Gajapathy

Wenn ich git checkout 441b034635240bc873700473af3e98533e94a0b5 mache, gibt dies einen Fehler aus: fatal: Referenz ist kein Baum: 441b034635240bc873700473af3e98533e94a0b5
ttb

135

Ich weiß nicht, ob es dort war, als Sie diese Frage gestellt hatten, aber der beste und einfachste Weg, ein Commit herunterzuladen, besteht darin, beim Anzeigen eines Repositorys auf die Registerkarte Commits zu klicken . Anstatt auf den Commit-Namen zu klicken, klicken Sie an dieser Stelle in der Verlaufsschaltfläche mit dem Symbol <> rechts neben dem Festschreibungsnamen / der Festschreibungsnachricht auf das Repository durchsuchen und schließlich auf die Schaltfläche ZIP herunterladen , die beim Klicken auf Klonen oder angezeigt wird Download- Button.

Ich hoffe es hilft euch.


3
Dies ist die einzige Möglichkeit, "verlorene Commits" wiederherzustellen, bei denen es sich um Commits handelt, von denen Github eine Geschichte hat, die jedoch aus der "offiziellen" Git-Zeitleiste gelöscht wurden. Auf diese Weise können Sie einen Zip-Snapshot eines Commits abrufen, der in Vergessenheit geraten ist, dieses Commit in einen neuen Zweig verschieben, diesen Zweig in ein vorhandenes Repo holen und ihn wieder in die Existenz aufnehmen.
Ajax

@ Ajax Das stimmt nicht. Sie können den sha immer noch verwenden git reflogund dann das getrennte Commit
auschecken

@AaronBrager sicher, Reflog wird funktionieren, wenn Sie sich auf demselben Computer befinden, auf dem das Commit ursprünglich ausgeführt wurde. Das OP kennt das Commit bereits, sodass es kein Reflog benötigt und einfach direkt auschecken kann. Ich spreche jedoch von Fällen, in denen Sie das Commit nicht lokal haben und es sich nicht in Filialen befindet, die sich noch im öffentlichen Repo befinden. In diesen Fällen verfügt github möglicherweise noch über eine Aufzeichnung des Commits, die Sie als Zip herunterladen können, um das Commit wiederherzustellen.
Ajax

@ Ajax Ah, danke für die Klarstellung. Alternativ können Sie die GitHub-API ( api.github.com/repos/facebook/facebook-ios-sdk/events ) aufrufen und einen Zweig aus dem verwaisten Commit erstellen ( Anweisungen hier )
Aaron Brager

Sehr schön. +1 Ich wusste nicht, dass du Githubs Reflog so abfragen kannst!
Ajax

27

Sivans Antwort in GIF Geben Sie hier die Bildbeschreibung ein

1.Klicken Sie auf Commits in Github

2.Wählen Sie Code durchsuchen auf der rechten Seite jedes Commits

3.Klicken Sie auf Download-Zip, um den Quellcode zum Zeitpunkt des Commits herunterzuladen


Hallo suraj, kannst du mir bitte sagen, wie du das GIF deines Bildschirms erstellt hast?
Rahul Satal

Verwenden Sie den Quick Time Player, um ein Video des Bildschirms aufzunehmen. Konvertieren Sie das Video mit einem beliebigen verfügbaren Tool in GIF. Google it. @ Rahul Satal
Suraj K Thomas

1
Danke @SurajKThomas für das GIF
Sivan

10

Um einfach ein Commit mit der 7-stelligen SHA1-Kurzform herunterzuladen, gehen Sie wie folgt vor:

Arbeitsbeispiel:

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

Beschreibung:

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

Wenn Sie den langen Hash-Schlüssel haben 31af650ee25f65794b75d4dfefed6fe4758781c1, holen Sie sich einfach die ersten 7 Zeichen 31af650. Dies ist die Standardeinstellung für GitHub.


8

Der einfachste Weg, ein verlorenes Commit wiederherzustellen (das nur auf Github und nicht lokal vorhanden ist), besteht darin, einen neuen Zweig zu erstellen, der dieses Commit enthält.

  1. Öffnen Sie das Commit (URL wie: github.com/org/repo/commit/long-commit-sha)
  2. Klicken Sie oben rechts auf "Dateien durchsuchen"
  3. Klicken Sie oben links auf das Dropdown-Menü "Tree: short-sha ..."
  4. Geben Sie einen neuen Filialnamen ein
  5. git pull die neue Niederlassung nach lokal

Diese Antwort ist allgemeiner als die akzeptierte. Ich bin auf die Situation gestoßen, dass das gewünschte Commit bereits in der Hauptniederlassung verschwunden ist und Github nicht alle Commits in nicht vorhandenen Zweigen beibehalten wird. Dieser Ansatz wird also einen neuen Zweig aus diesem Commit für Github erstellen und ihn ziehbar machen.
Qi Luo

Auf diese Weise konnte ich ein Commit (mit intaktem Original-SHA) von einem gelöschten Fork wiederherstellen, von dem aus ich eine PR durchgeführt habe. Nachdem ich einen neuen Fork erstellt hatte, öffnete ich das PR-Commit im Upstream-Repo und führte dann "Dateien durchsuchen" durch. Ich habe dann diese URL kopiert und den Benutzernamen durch meinen eigenen ersetzt. Klicken Sie dann auf das Dropdown-Menü Baum: und erstellen Sie einen neuen Zweig in meiner Gabel. Hat super funktioniert!
Allen Luce

2

Der Fragentitel ist nicht eindeutig.


1

Als Ergänzung zur akzeptierten Antwort:

Um die Hashes anzuzeigen, müssen Sie den vorgeschlagenen Befehl "git checkout hash " verwendengit log . Je nachdem, was Sie benötigen, gibt es jedoch einen einfacheren Weg als das Kopieren / Einfügen von Hashes.

Sie können git log --onelineviele Commit-Nachrichten in einem komprimierteren Format lesen.

Nehmen wir an, Sie sehen dies als einzeilige Liste der Commits mit minimalen Informationen und nur teilweise sichtbaren Hashes:

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

Wenn Sie möchten last commit, können Sie verwenden git checkout master^. Das ^gibt dir das Commit vor dem Master. Also hash222.

Wenn Sie das n-te letzte Commit möchten, können Sie verwenden git checkout master~n. Wenn Sie beispielsweise verwenden git checkout master~2, erhalten Sie das Commit hash333.


0

Anstatt durch die Commits zu navigieren, können Sie auch die yTaste ( Github-Hilfe , Tastaturkürzel ) drücken , um den "Permalink" für die aktuelle Revision / Commit zu erhalten.
Dadurch wird die URL von https://github.com/<user>/<repository>(master / HEAD) in geändert https://github.com/<user>/<repository>/tree/<commit id>.

Um das spezifische Commit herunterzuladen, müssen Sie die Seite von dieser URL neu laden, damit die Clone or DownloadSchaltfläche auf den "Snapshot" https://github.com/<user>/<repository>/archive/<commit id>.zip anstatt auf den neuesten zeigt https://github.com/<user>/<repository>/archive/master.zip.


0

Versuchen Sie die folgende Befehlssequenz:

$ git fetch origin <copy/past commit sha1 here>
$ git checkout FETCH_HEAD
$ git push origin master

-1

Wenn Sie mit einem bestimmten Commit arbeiten oder einen bestimmten Commit codieren möchten, können Sie den folgenden Befehl verwenden:

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

Beispiel:

 git reset --hard fbee9dd 
 git push --force

2
Dies ist gefährlich, es ist sinnvoller, das Repo zu klonen und eine Version
auszuchecken
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.