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

tus*_*ath 50 git atlassian-sourcetree

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

ish*_*hak 71

基于以上答案,这是一个简单的序列:

打开终端窗口并cd到存储库下的文件夹中.然后:

git fsck | awk '{print $3}' > tmp.txt
cat tmp.txt | xargs git show > tmp2.txt
Run Code Online (Sandbox Code Playgroud)

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

git stash apply <commit id>
rm tmp.txt tmp2.txt
Run Code Online (Sandbox Code Playgroud)

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

  • 这是最好的答案,一步一步.如果您通过SourceTree删除了存储,这些步骤将恢复已删除的存储.但不确定其他人. (2认同)

Jan*_*ger 47

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

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>
Run Code Online (Sandbox Code Playgroud)

这是一个有效的例子:

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

只是合成为要重新插入(名称/邮件/时间戳/描述不藏匿线是准确的),你应该能够再次正常使用.

快乐狩猎!

  • 这是我所知道的唯一方式.但是,你可以使用它来减少它:`git fsck --unreachable`; 并直接得到一个包含详细信息的列表,可能是这样的:`for $ in $(git fsck --unreachable --no-dangling 2> |/dev/null | grep commit | cut -d'' - f3); 做git --no-pager log -1 $ i; 完成| less` (3认同)
  • 我认为sha-1就足够了.只需拨打`git sash apply`即可. (2认同)

qqx*_*qqx 21

与之前的答案状态一样,您可以使用git fsck列出未包含已删除存储的任何内容引用的对象.但是,可以使用git show过滤该对象列表来仅显示如下的状态:

git fsck 2> /dev/null |
  awk '/commit/{print $3}' |
  git show --stdin --merges --grep '^WIP on'
Run Code Online (Sandbox Code Playgroud)

如果您知道何时创建了存储,您还可以添加一个类似于--since '2 days ago'最后一行的参数 来进一步限制输出.希望这会将列表缩小到可管理的大小.

一旦找到了正确的存储,请记下其提交ID,并且可以使用 git stash apply COMMITID它来应用它,就像它没有被删除一样.

  • "since"选项对我不起作用 (2认同)

Ten*_*lah 12

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

  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 stash 应用 40e47250d0b4fb6143be67c115b708be126e79d3


小智 11

在隐藏时使用评论可能会有所帮助,使用:

git stash save "comment"
Run Code Online (Sandbox Code Playgroud)

它使用以下方法为我省去了查找已删除存储的麻烦:

git fsck --lost-found

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

git stash apply [tag]
Run Code Online (Sandbox Code Playgroud)


小智 9

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


hck*_*knl 5

另一个解决方案是:

git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log
Run Code Online (Sandbox Code Playgroud)

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

git stash store <hash-id-of-specific-commit>
Run Code Online (Sandbox Code Playgroud)