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

时间:2013-07-19 09:49:45

标签: git atlassian-sourcetree

我正在使用源代码树。我创建了一个包含多个更改的存储,并错误地删除了它。有没有办法找回它们?

9 个答案:

答案 0 :(得分:66)

根据以上答案,这是一个简单的序列:

打开终端窗口并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数据库中保留已删除的内容。天才!!

答案 1 :(得分:46)

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

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 <your@email.example> <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

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

快乐狩猎!

答案 2 :(得分:21)

与之前的回答状态类似,您可以使用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将其应用,就像它没有被删除一样。

答案 3 :(得分:9)

正如JanKrüger所述,git fsck是要走的路。但是,如果您发现自己无法(无论出于什么原因)在存储文件中成功合成一行并使存储显示在可用列表中,则可以直接使用git stash apply <guid>,而无需添加该行。这将立即将(不提交)文件更改应用于当前分支。

答案 4 :(得分:4)

另一种解决方案是:

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

找到作者并提交信息(日期,哈希,作者等)

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

答案 5 :(得分:3)

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

  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]

  4. enter image description here

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

      

    git stash apply 40e47250d0b4fb6143be67c115b708be126e79d3

答案 6 :(得分:2)

在存储时使用以下注释可能会有所帮助:

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]

答案 7 :(得分:1)

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#}

答案 8 :(得分:0)

源树中有一个选项可以查看隐藏。只需右键单击要还原的存储。它会给你两个选项,“Apply Stash”和“Delete Stash”。选择“应用存储”。enter image description here