github会记住提交ID吗?

时间:2015-03-10 07:38:39

标签: git github

有几天我正在为Scrollback项目重新编写install.sh文件,因为我是唯一一个在本地做这个并在本地做的人,我一直在提交修改相同的提交,偶尔推到我的fork的主。 (请忽略此处的最佳做法,我一个人工作)。

在此期间,我记得通过电子邮件向某人展示我完成的一半工作,即网址https://github.com/sindhus/scrollback/blob/8d8f7f414383499c2ab6fec586b4c9665a41c7aa/install.sh

现在由于一些困惑我在本地失去了工作(想想rm -rf),我记得在此之前推进。所以github在某些时候确实看到了我重新定义的install.sh的提交ID。

如您所见,上面的URL允许我通过提交ID访问此blob。 但是我无法在本地访问它,因为同一个repo被强制推送。

我的问题如何让github向我显示文件的所有提交ID?无论路径如何,它可能知道该文件的所有ID。如果我必须使用他们的API,我不介意,但我想深入研究一些想法。

谢谢!

4 个答案:

答案 0 :(得分:12)

  

我的问题如何让github向我显示文件EVER的所有提交ID

如果您偶尔强制推送(git push --force)修订后的提交,那么提交8d8f7已被more recent commit with a different SHA替换。

这意味着8d8f7现在只是GitHub仓库的reflog中的引用,只有GitHub支持才能访问
克隆回购将不包括该克隆回购的本地历史中的8d8f7。


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

实际上OP sindhus in the comments指出Recovering a commit from Github’s Reflog到“John EngelmanGitHub Events API

need to use a token for the authentication允许浏览最后的事件:

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

“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"
}

您可以{{3}}。

答案 1 :(得分:1)

我没有真正得到问题所以有一些解决方案:

要查看特定文件的所有提交:     git log --follow filename

要结帐旧版本,请找回答案here

答案 2 :(得分:0)

在本地克隆你的回购,然后在你的档案上试试:

git log --follow install.sh

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

答案 3 :(得分: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版

我的reflog包含所有内容

% 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

总的来说,即使你是唯一的开发者,持续修改的“过程”也是不好的。这是你应该做的一件事,以修复最后一次提交的错误。