如何从GitHub项目中获取特定提交

210

我需要从GitHub下载Facebook API。通常,我只需单击“Downloads”选项卡即可下载最新源代码。但在这种情况下,我需要一个旧的提交:91f256424531030a454548693c3a6ca49ca3f35a,但我不知道如何从该提交获取整个项目...

有人可以告诉我如何做吗?

(顺便说一句,我用的是Mac电脑,不知道是否有任何区别)。


2
如果您“只需要”“zipped-snapshot-code”,请参阅https://dev59.com/hWYr5IYBdhLWcg3wfKP_。 - Jean Fontaine
12个回答

283

首先,使用git克隆存储库,例如:

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

这将下载完整的代码仓库历史记录,这样你就可以切换到任何版本。接下来,进入新克隆的代码仓库:

cd facebook-ios-sdk

使用 git checkout <COMMIT> 命令切换到正确的提交记录:

git checkout 91f25642453

这会给你一个警告,因为你不再处于分支上,而是直接切换到了特定版本。(这被称为“游离 HEAD”状态。)既然你似乎只想使用这个 SDK,而不是积极开发它,那么除非你有兴趣了解 git 的更多工作原理,否则你不需要担心这个问题。


4
如果你只想要文件,你也可以使用 git export - Xeoncross
1
git checkout -q <commit#> 在 git checkout 过程中静默警告 stderr。 - Manavalan Gajapathy
1
当我执行 git checkout 441b034635240bc873700473af3e98533e94a0b5 命令时,会出现以下错误:fatal: reference is not a tree: 441b034635240bc873700473af3e98533e94a0b5。 - ttb
@Xeoncross:“git:'export'不是git命令。” - Cardinal System
只是一个提醒,git clone git://blar 并不会下载完整的历史记录。它只会下载活跃分支的历史记录。这在 Git 中是非常微妙的差别。 - WORMSS

166

我不知道在您发布这个问题时是否有这个选项,但下载提交的最佳和最简单方法是在浏览存储库时单击commits选项卡。然后,不要单击提交名称,而是单击带有<>符号的提交名称/消息右侧的在历史上查看此版本库的位置按钮,最后单击Clone or Download按钮时显示的Download ZIP按钮。

希望能对大家有所帮助。


6
这是唯一的方法来恢复“丢失的提交”,这些提交在 github 中有历史记录,但被从“官方” git 时间轴中抹去了。使用此方法,您可以获取一个已经被淹没的提交的 zip 快照,将该提交推送到一个新分支,将该分支抓取到一个现有的存储库中,再将其挑选出来重新出现。 - Ajax
1
@Ajax 这不是真的。你仍然可以使用 git reflog 获取 sha,然后检出分离的提交。 - Aaron Brager
1
@AaronBrager 确实,如果您在最初有该提交的同一台机器上,reflog将起作用。 OP已经知道提交,因此他们不需要reflog,可以直接检出。 但是,我正在谈论的是在本地没有该提交,并且没有任何仍在公共存储库中的分支的情况。 在这些情况下,github仍可能记录有提交的记录,您可以将其下载为zip文件以恢复该提交。 - Ajax
@Ajax 啊,谢谢澄清。作为替代方案,您可以访问 GitHub API(https://api.github.com/repos/facebook/facebook-ios-sdk/events),并从孤立的提交中创建一个分支([这里有说明](https://objectpartners.com/2014/02/11/recovering-a-commit-from-githubs-reflog/))。 - Aaron Brager
非常好。+1 我不知道你可以像那样查询Github的reflog! - Ajax
这是最好的解决方案。 - iamtheasad

43

Sivan在gif中的回答:输入图像描述

1. 在github上点击“commits”

2. 选择每个提交的右侧的“浏览代码”

3. 点击“下载zip”,将会下载该次提交时的源代码


你好 Suraj,你能告诉我你如何创建屏幕的 GIF 吗? - Rahul Satal
1
使用Quick Time Player录制屏幕视频。使用任何可用的工具将视频转换为GIF。在Google上搜索相关工具。@Rahul Satal - Suraj K Thomas
1
感谢@SurajKThomas提供的gif。 - Sivanand Kheti

16

要仅下载包含7位SHA1短格式的提交,请执行以下操作:

工作示例:

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

描述:

 `https://github.com/username/projectname/archive/commitshakey.zip`
如果你拥有长哈希键“31af650ee25f65794b75d4dfefed6fe4758781c1”,只需获取前7个字符“31af650”。这是GitHub的默认设置。

11

我发现找回仅仅存在于GitHub上而没有本地备份的遗失提交(commit)最简单的方法是创建一个包含该提交的新分支。

  1. 打开该提交(url类似:github.com/org/repo/commit/长sha码)
  2. 点击右上角的“浏览文件”(Browse Files)
  3. 点击左上角的下拉菜单“Tree: 短sha码…”
  4. 输入新分支名称
  5. git pull 将新分支下载到本地

这个答案比被采纳的那个更通用。我遇到了这样一种情况:我想要提交的已经在主分支上消失了,而且Github不会保留不存在的分支上的每个提交。因此,这种方法将从该提交在Github上创建一个新分支,并使其可拉取。 - Qi Luo
这让我能够从已删除的 fork 中恢复一个提交(原始 SHA 保持不变),该提交是我从中发起 PR 的。创建了一个新的 fork 后,我在上游 repo 上打开了 PR 提交,然后点击“浏览文件”。然后我复制了那个 URL 并将用户名替换为我的用户名。然后点击 Tree: 下拉菜单,在我的 fork 中创建了一个新分支。效果非常好! - Allen Luce

10

请尝试以下命令序列:

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

4
如果提交仍然存在于Github上,但PR已被压缩合并且原始分支已被删除,那么这绝对是我见过的最好的答案。 - WORMSS
1
请注意,您似乎需要完整的提交 sha1,而不是缩写 sha1。 - Eric Cousineau

4

除了浏览提交记录外,你也可以按下 y 键 (Github 帮助文档, 键盘快捷键) 来获取当前版本/提交的“永久链接”。
这将把 URL 从 https://github.com/<user>/<repository> (master / HEAD) 更改为 https://github.com/<user>/<repository>/tree/<commit id>

为了下载特定的提交,您需要从该URL重新加载页面,这样 Clone or Download 按钮就会指向 "快照" 的地址 https://github.com/<user>/<repository>/archive/<commit id>.zip,而不是最新的 https://github.com/<user>/<repository>/archive/master.zip


1
对于标签,请使用 https://github.com/<user>/<repository>/archive/refs/tags<Tag>.zip - SePeF

4

问题标题存在歧义。


3
如果您想使用特定的提交版本或获取其代码,则可以使用以下命令:
git checkout <BRANCH_NAME>
git reset --hard  <commit ID which code you want>
git push --force

例子:

 git reset --hard fbee9dd 
 git push --force

2
这很危险,最好的做法是克隆仓库并检出一个版本。 - user1767754

1
作为对已接受答案的补充:
要查看哈希值,您需要使用建议的命令“git checkout hash”,您可以使用git log。但是,根据您的需求,有一种比复制/粘贴哈希更简单的方法。
您可以使用git log --oneline以更紧凑的格式阅读许多提交消息。
假设您看到了这个一行列表,其中包含最少信息和部分可见哈希:
hash111 (HEAD -> master, origin/master, origin/HEAD)
hash222 last commit
hash333 I want this one
hash444 did something
....

如果你想要获取“最后一次提交”,可以使用命令git checkout master^。符号^会给你主分支之前的提交,所以得到的是hash222
如果你想要获取倒数第n次提交,可以使用命令git checkout master~n。例如,使用git checkout master~2会给你提交hash333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接