Github是否会记住提交ID?

8
几天来,我一直在重写Scrollback项目的install.sh文件。由于我是唯一一个在本地工作的人,我不断地提交修改同一个提交,并偶尔推送到我的分支主干上(请忽略最佳实践,我是独自工作的)。
期间我记得给某人发了封电子邮件,展示了我完成一半的工作,网址为https://github.com/sindhus/scrollback/blob/8d8f7f414383499c2ab6fec586b4c9665a41c7aa/install.sh 现在由于一些混乱,我在本地丢失了我的工作(想象一下rm -rf),我记得在此之前已经推送了。所以在某个时刻,GitHub看到了我的rebase提交ID的install.sh。
正如您可以看到的那样,上面的URL允许我通过提交ID访问这个blob。然而,由于同一仓库被强制推送,我无法在本地访问它。
我的问题是如何让Github显示文件的所有提交ID?无论路径如何,都要显示该文件的所有可能已知的ID。如果必须使用他们的API,我不介意,但我想深入了解一些思路。
谢谢!
4个回答

21
我的问题是如何让GitHub显示文件的所有提交ID。如果您偶尔进行强制推送(git push --force),那么提交8d8f7已被替换为具有不同SHA的更新的提交。这意味着8d8f7现在仅在GitHub存储库的reflog中引用,只有GitHub支持可以让您访问它。克隆存储库将不会在克隆存储库的本地历史记录中包括8d8f7。

GitHub“reflog”:从GitHub事件API推送事件

实际上,OP sindhus在评论中指出了{{link2:“从Github的Reflog恢复提交”}},作者是John Engelman:

GitHub事件API允许浏览最近的事件:

curl https://api.github.com/repos/<user>/<repo>/events

"pushEvent"是需要查找的事件。然后,可以直接在GitHub上创建一个分支,以便使该提交再次可见(因为不再是悬空的,而是由实际对象(如分支)引用):"pushEvent"是需要查找的事件。然后,可以直接在GitHub上创建一个分支,以便使该提交再次可见(因为不再是悬空的,而是由实际对象(如分支)引用)。"
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"ref":"refs/heads/D-commit", "sha":"384f275933d5b762cdb27175aeff1263a8a7b7f7"}' https://api.github.com/repos/<user>/<repo>/git/refs

# JSON request
{
  "ref": "refs/heads/D-commit",
  "sha": "384f275933d5b762cdb27175aeff1263a8a7b7f7"
}

你可能需要使用令牌进行身份验证。

谢谢,您理解问题的要点。是否有通过GitHub API获取存储库的reflog的方法? - Sindhu S
找到了!http://www.objectpartners.com/2014/02/11/recovering-a-commit-from-githubs-reflog/ - Sindhu S
@sindhus 很好的发现!我已经在答案中加入了它,以提高可见性,并附有其他链接。 - VonC
我的救星!在执行 git push --mirror 后,恢复了一个被删除的分支 >_< - Sega-Zero

1
我不是很理解问题,所以提供以下解决方案:
要查看特定文件的所有提交记录: git log --follow 文件名.
要切换到旧版本,请查找答案这里

0

我不确定是否有一种方法可以获取所有版本的文件,跨越修改的提交。但是,reflog将包含早期版本的信息,您可以手动提取它们。以下是一个示例。

这是我的第一个提交

echo "a" > a.txt && git add a.txt && git commit -m "Version 0"

之后,还需要进行一些修改。

% echo "aa" > a.txt && git add a.txt && git commit --amend -m "Version 1"
% echo "aaa" > a.txt && git add a.txt && git commit --amend -m "Version 2"
% echo "aaaa" > a.txt && git add a.txt && git commit --amend -m "Version 3"
% echo "aaaaa" > a.txt && git add a.txt && git commit --amend -m "Version 4"

虽然我的日志只有一个条目

% git log --oneline a8d6c39 版本4

但我的引用日志有所有的记录

% git reflog master
a8d6c39 master@{0}: commit (amend): Version 4
cf87b8f master@{1}: commit (amend): Version 3
c45a91e master@{2}: commit (amend): Version 2
63c7f5a master@{3}: commit (amend): Version 1
f2b3336 master@{4}: commit (initial): Version 0

因此,如果您想要查看您的文件在第4版、第3版等版本中的样子,您可以这样做

% git show a8d6c39:a.txt
aaaaa
% git show cf87b8f:a.txt
aaaa
% git show c45a91e:a.txt
aaa
% git show 63c7f5a:a.txt
aa
% git show f2b3336:a.txt
a

总的来说,即使你是唯一的开发人员,不断修改的“过程”也是不好的。这是一次性的事情,你应该在最后一次提交时修复错误。

0

在本地克隆您的存储库,然后尝试在文件上执行此操作:

git log --follow install.sh

它应该向您显示您可以在Github上使用的ID。


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