我能查看远程的reflog吗(不是远程引用)?

90

能够查看远程的reflog吗?也就是说,我想知道在另一台远程机器上运行git reflog的输出结果。

请注意,我不是在询问远程跟踪分支(如origin/master)的reflog;我问的是在另一台机器上reflog的输出结果。


3
如果你可以访问远程系统的文件系统(通常是裸仓库),你总是可以选择在那里运行git reflog。但通常情况下无法获得这样的访问权限。我有个习惯,在Git服务器上使用只读文件共享方式使其成为可能,以便能够在服务器端审查reflog。 - Anders Zommarin
4个回答

69

如果远程机器是一个github仓库的话,

  1. 首先使用Github的Events API来检索提交的SHA。
    curl https://api.github.com/repos/<owner>/<repo>/events

  2. 确定那个不再存在于任何分支中的孤立提交的SHA

  3. 接下来,使用Github的Refs API来创建一个指向孤立提交的新分支。

    curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"ref":"refs/heads/D-commit", "sha":"<orphan-commit-id>"}' https://api.github.com/repos/<owner>/<repo>/git/refs

在上述命令中用步骤2中确定的SHA替换<orphan-commit-id>

  1. 最后,将新创建的分支使用git fetch命令拉取到本地仓库中。
    从那里,您可以将提交合并回您的工作中。
写请求(步骤3)需要一个身份验证标头 - 但您也可以使用GitHub CLI工具的相应API客户端功能,例如:gh api repos/<owner>/<repo>/git/refs -X POST -F ref=refs/heads/D-commit -F sha=<orphan-commit-id> 查看本文以获取一个实际示例。

12
非常感谢!对于不太擅长使用命令行的人,您也可以绕过第三步,直接打开 https://github.com/<user>/<repo>/commits/<orphan-commit-id> ,并在“Tree:”下拉菜单中直接从其中创建一个新分支。然后就可以正常地获取它了。 - waldyrious
4
如果你收到了"message": "Not Found"的错误信息,这意味着你需要进行身份验证,例如通过传递一个access_token查询字符串。 - Andy Hayden
5
对我来说,追踪孤立提交ID的最简单方法是查看CircleCI(或[插入此处CI服务])上的最后一次构建。其中包含了该提交ID的SHA值。 - samjewell
4
这个答案似乎解决的问题与问题本身不同。它似乎解决了如何恢复一个已经无法从任何分支或标签中访问的提交,而问题是如何查看reflog -- 即分支或标签所指向的历史记录。 - Matt McClure
4
为了让未来的读者清楚,您需要在第3步的命令中添加“-u <github用户名>:<github个人访问令牌>”。 - Daniel Porteous
显示剩余9条评论

58
答案基本上是“不行”(除了那台机器),因为引用日志是某些引用名称的本地重新分配的日志。 实际上,每次运行 git update-ref -m msg <name> <target> 命令时,更新都被记录在本地:.git/logs/<name> 会添加一行内容。
$ git update-ref -m foo HEAD HEAD^
$ tail -1 .git/logs/HEAD
2418b6ba8fd0289933c9351260a272b8e410867f 8d945134b0cead535d66af29c8eb4228b5dc3763 [redacted] <[redacted]> 1334106483 -0600     foo

在这种情况下,在消息之前的东西(在本例中为foo)不是空格而是tab,我为了在stackoverflow上展示而将其展开。从概念上讲,移动分支指针的所有其他操作都会调用git update-ref来完成它(有些是shell脚本,实际上就是这样做的,而另一些则只是调用执行所有文件更新的C代码)...而.git/logs中的所有内容都构成了reflog。

如果底层的git://和/或ssh://协议中有让您访问reflog的功能,那么这将起作用,但据我所知并没有这样的功能。


9
在GitHub上,如果你在拉取已合并的分支之前不小心执行了git push --force命令,并且与此同时被合并的分支被删除了(是的,这种情况曾经发生在我身上),你可以查找已合并的拉取请求,然后转到Commits部分,例如:

enter image description here

然后进入最后一次提交并单击<>按钮(标题为“在历史记录中浏览存储库”)。
这将带您进入历史记录的“已删除”点。从这里,您可以:
  • 创建一个新分支,然后开启一个新的合并请求(如果变更来自另一个存储库,建议使用此方法)。
  • 开启一个新的合并请求(如果提交在您的存储库内,建议使用此方法)。

另一种解决方案是使用 git push --force-with-lease https://thoughtbot.com/blog/git-push-force-with-lease - Othmane El Kesri
1
对于Gitlab用户:您可以复制rebase之前最后一次提交的SHA ID,转到项目页面,单击存储库名称旁边的“+”图标,单击“新分支”,并粘贴最后一个提交ID。现在,您可以在本地检出此新分支或创建MR。 - Letik

2
您可以使用此命令查看远程引用日志:
git reflog refs/remotes/<remote name>/<branch name>

所以如果你的远程仓库叫做“origin”,而你的分支叫做“turtles”:

git reflog refs/remotes/origin/turtles

他们想要在远程机器上的reflog,而不是refs/remotes/* - Guildenstern
他们想要远程机器上的 reflog,而不是 refs/remotes/* - Guildenstern

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