使用哈希值获取Git中的特定提交

45

Git允许从任意给定的远程和引用中获取,例如

git fetch <remote-url> <reference>

这样可以使得那些提交的内容可用,而无需添加远程或创建分支。

然而这仅适用于引用,如分支名称或标签,而不适用于特定的哈希值,因此对于那些没有被直接引用的提交也不起作用。

是否有一种方法可以从远程获取特定的提交?


1
我建议您更改已接受的答案以反映当前的真实情况。https://dev59.com/TWYq5IYBdhLWcg3wkRi_#62463160 - Jules G.M.
1
@JulesG.M. 感谢您的通知! - Maic López Sáenz
4个回答

52

今天我尝试了:

git fetch origin <commit-hash>

它运行得非常好!(git版本2.20.1)

只需确保 <commit-hash> 是完整的引用即可。


一个问题,当我们使用哈希值获取时,它是否也会更新分支引用? - Jay Joshi
1
不,它只是将提交带到本地。然后你可以对其进行操作。(例如,你可以git checkout它,git cherry-pick它,或者git show它) 参见:https://dev59.com/TWYq5IYBdhLWcg3wkRi_#70381400 - crgarridos
如果只有短的提交哈希值,该怎么办?https://dev59.com/l672oIgBc1ULPQZFsQhf 表明需要已经获取过了,但这是个进退两难的局面。 - Noel Yap

18

查看 "从远程 Git 存储库中拉取特定提交":
使用 Git 2.5(2015 年 7 月),您可以执行以下操作:

git fetch --depth=1 <a/remote/repo.git> <full-lenght SHA1>
git cat-file commit $SHA1

如果SHA1可以从远程仓库的任一分支末端“到达”,那么您就可以获取它。

注意事项:

  • 您需要一个Git 2.5远程仓库服务器,该服务器将处理uploadpack.allowReachableSHA1InWant配置(您需要将该配置设置为true,以允许单个提交提取)。
  • 正如crgarridos答案所示,您需要完整的SHA1,并且不能使用git rev-parse,因为您没有所有提交,正如Jim Hurne评论中指出的那样。

就像其他答案中所述,确保$SHA1是完整长度的引用。 - mkurz
1
@mkurz 是的,我已经编辑了我的答案,包括使用 git rev-parse,从而确保我将始终使用完整长度的SHA1。 - VonC
不幸的是,如果您只想获取单个提交,那么git rev-parse只有在您已经获取了所有远程提交时才能可靠地工作,而这显然不是您所拥有的。 - Jim Hurne
@JimHurne 很好的观点,谢谢。我已经相应地编辑了答案。 - VonC

9

不可以。根据手册,git fetch需要refspec,最简单的形式是一个ref,而裸的SHA-1并不是一个ref。也就是说,提交必须在远程上有一个名称(分支、标签)才能够被fetch


7
截至2021年,这个说法已不再正确。请参考@crgarridos的回答:https://dev59.com/TWYq5IYBdhLWcg3wkRi_#62463160 - Jules G.M.

1

git fetch [remote] [sha] && git checkout FETCH_HEAD可以让你检出一个远程仓库中的提交记录,即使该提交记录尚未合并(比如在Gerrit环境中)。

或者,如果你想要挑选它,可以使用git fetch [remote] [sha] && git cherry-pick FETCH_HEAD

示例:

  • git fetch origin d8a9a9395bb0532a0498f800e38ef5e60dfb173f && git checkout FETCH_HEAD
  • git fetch origin d8a9a9395bb0532a0498f800e38ef5e60dfb173f && git cherry-pick FETCH_HEAD

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