使用 SourceTree 检索 Git 中已删除的存储

问题描述 投票:0回答:11

我正在使用源代码树。我创建了多个更改的存储库并错误地删除了它。有办法找回来吗

git atlassian-sourcetree
11个回答
148
投票

根据之前的答案,这里有一个简单的序列:

打开终端窗口并 cd 进入存储库下的文件夹。然后:

git fsck | awk '{print $3}' > tmp.txt
cat tmp.txt | xargs git show > tmp2.txt

现在在编辑器中打开tmp2.txt,找到丢失的代码,然后找到其顶部的commit-id。然后应用代码:

git stash apply <commit id>
rm tmp.txt tmp2.txt

这救了我的命!我真的感谢所有回答这个问题的人。我祝福 git 创建者 Linus Torvalds 将已删除的内容保留在 git 数据库中。天才!!

编辑 2021:请注意,Windows 用户可以使用 Git Bash 执行相同操作。


54
投票

存储在内部保存为从存储列表引用的合并提交。

git fsck
可以找到悬挂的物体。它不仅会找到您删除的存储,还可能找到其他东西...所以您会想要查找看起来可能是您的存储的提交(
git show <ID>
以显示有关对象的相关信息并决定是否这就是您要找的人)。

一旦获得,您所需要做的就是将其重新插入到存储列表中。该列表存储在

.git/logs/refs/stash
中,一行具有以下格式:

<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash>

这是一个工作示例:

16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <email.censored@invalid> 1374227992 +0200  WIP on master: 0dbd812 Update draft release notes to 1.8.4

只需为您想要重新插入的存储合成一行(名称/邮件/时间戳/描述不准确),您应该能够再次正常使用它。

狩猎快乐!


26
投票

与之前的答案一样,您可以使用

git fsck
列出以下对象: 不会被任何包含您已删除的存储的内容引用。但它 可以使用
git show
过滤该对象列表以仅显示 藏品如:

git fsck 2> /dev/null |
  awk '/commit/{print $3}' |
  git show --stdin --merges --grep '^WIP on'

如果您知道存储的创建时间,您还可以添加一个参数,例如

--since '2 days ago'
到最后一行以进一步限制输出。希望这会将列表缩减到可管理的大小。

找到正确的存储后,记下其提交 ID,然后就可以使用

git stash apply COMMITID
应用它,就好像它没有被删除一样。


25
投票

这是恢复已删除存储的最干净的解决方法。

  1. git fsck --lost-found

  2. ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline

  3. git stash apply [tag]

将 [tag] 替换为 id,例如:

git 存储应用 40e47250d0b4fb6143be67c115b708be126e79d3


12
投票

在隐藏时使用注释可能会有所帮助,使用:

git stash save "comment"

它为我节省了一些使用以下命令查找已删除存储的麻烦:

git fsck --lost-found

ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline

git stash apply [tag]

10
投票

另一个解决方案是:

git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log

查找作者并提交信息(日期、哈希、作者等)

git stash store <hash-id-of-specific-commit>

9
投票

正如 Jan Krüger 上面所说,

git fsck
是正确的选择。但是,如果您发现自己无法(无论出于何种原因)成功合成存储文件中的一行并使该存储出现在可用列表中,则可以直接使用
git stash apply <guid>
,而无需添加该行。这将立即将文件更改应用(而不是提交)到您当前的分支。


2
投票
for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less

然后找到提交id#。

然后做

git stash apply {commit#}

1
投票

只是 Tengku Fathullah 答案的 Windows 版本

git fsck --lost-found
for /f %f in ('dir /b .git\lost-found\commit') do @git log -n 1 %f --pretty=oneline
git stash apply [tag]

(其中 [tag] 是从第二个命令中选择的 ID)。

如果这仍然是一个很长的列表需要查找,可以将其通过管道传输到

find
。例如,对于未命名的存储:

for /f %f in ('dir /b .git\lost-found\commit') do @git log -n 1 %f --pretty=oneline | find "WIP"

批处理文件注释,仅供参考:

  • 与正常使用
    for
    命令一样,请注意,在批处理文件中需要
    %%f
    (两次)
  • @git log
    用于抑制命令提示符回显,以提供单行输出


-3
投票

源代码树中有一个选项可以查看存储。只需右键单击您想要恢复的存储即可。它会给你两个选项,“应用存储”和“删除存储”。选择“应用隐藏”。

© www.soinside.com 2019 - 2024. All rights reserved.