git相关-- git命令 及 git add后 未commit git reset --hard如何恢复


git怎样删除未监视的文件untracked files

用 git clean

# 删除 untracked files
git clean -f
 
# 连 untracked 的目录也一起删掉
git clean -fd
 
# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
 
# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd



http://www.360doc.com/content/16/0219/11/10058718_535692779.shtml


Git,在工作区,只做了git add,没有提交git commit, 不小心git reset --hard,工作区代码全没了,如果你有add添加到暂存区,那么还有救


下面1方法可行,试验过,

1、git fsck --lost-found

1.1,找出git add过的所有文件,

git fsck --lost-found 可以找到,不过会找回来很多。找回来后自己 grep 一下哪个是你的目标文件吧
$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
Checking objects: 100% (28553/28553), done.
dangling blob 3a480c1e7ef0e208cebfa7555b284f9c69afdcda
dangling blob 8948d093fbbeb56b5f295bd2a87b645d19e5c256
dangling blob af4c1c7d9823f9bd407fd44b3ba7935378aad5e6
dangling blob 1953e28c0206144bb627e317c57b15ddd07041c0
dangling blob 7c58a2c9986bd9475afeda35ecd9c5599d64c586
dangling blob 6a6c5cefb4d17db0e17e31967f248eb05da750c7
dangling blob cd7afce5c4e0a4fb847edc7ad3d50012cf110ff5
dangling blob 5a84da1d9c4d115c21c09ed23f071b0c1246f198
dangling blob 1785a6545ce5b16e75ca67ad06450905776833a7
dangling blob d58aae6e86139875d02af89a906b1fb42f5c1d48
dangling blob 0ebadb923feadf850385fc2e218e64fe5a11210c
dangling blob d0f11de6a5403c092962fb6566e3474bec0ac4e8

下面的命令和上面的差别没查过

ls -l .git/lost-found/other/



1.2, 用git show id逐个查看上面某个id提交的文件内容,比如

git show 8948d093fbbeb56b5f295bd2a87b645d19e5c256

会显示这个id对应的文件的当时执行git add时的所有内容,查看这个文件内容,如果是你丢失的文件,则copy内容出来即可。或者可以执行下面的命令把文件的内容转存重定向到一个文件:

git cat-file -p 8948d093fbbeb56b5f295bd2a87b645d19e5c256 > test.md



下面2方法也应该可以找回,

2、吐槽

总结命令如下:

2.1、$ find .git/objects -type f | xargs ls -lt | sed 60q

2.2、git cat-file -p ID > a.md

在说恢复方法之前,先说下缘由。今天在转载完缓存算法之后,就打算把文件给同步到github上,以做备份。然后像往常一样打开git bash,在git add时遇到了错误,无法进行git add,因为我使用了hexo new进行生成文件,而hexo new生成的文件中,文件名的小括号和中括号都会变成’—‘,也就是说 [转载] 变成了 -转载- ,而git bash无法识别 - ,所以造成无法提交,这时,我灵机一动,想到将其他的所有文件都移出去,然后 git add . 来添加然后再提交(因为其他文件有改动,所有想把此文件单独提交后再来进行全部的提交),移出之后我发现原来已经执行过 git add . 了。没办法,那就重置吧,但是我从网上找来一篇文章, git reset --hard ,再然后,悲剧上演~

所以,骚年们,以后一定不要那么随便的相信一篇博文,要对知识抱有一定的怀疑态度,然后多看几篇博文甚至官方文档。不过最终从stackOverflow上找出了解决方法~

恢复已提交文件的方法

  1. 使用 git reflog 来找到最近提交的信息:

    F:\voidy>git reflog

    WARNING: terminal is not fully functional

    5ccb94c HEAD@{2}: commit: 设计模式汇总

    ba944a7 HEAD@{3}: commit: 组合模式

    49bf0f5 HEAD@{4}: commit: 状态模式

这里贴出部分信息。

  1. 使用 git reset ID 来恢复文件(第一列为ID),举个栗子:

    比如说 设计模式汇总 ,那么执行 git reset 5ccb94c 好了,如果是一般的情况到此已经解决了。但是,我没有提交啊。那么该怎么办?

恢复未提交文件的方法

下面是stackoverFlow上一些人提供的方法

If you didn't already commit your local changes (or at least stage them via `git add`, they're gone. `git reset --hard` is a destructive operation for uncommitted changes.

If you did happen to stage them, but didn't commit them, try `git fsck --lost-found` and then search through the contents of .git/lost-found - it will contain all of the objects that aren't referenced by a known commit, and may include versions of files that were staged.

You can recover anything you git added, with git fsck --lost-found and poke around in .git/lost-found.  find .git/objects -type f | xargs ls -lt | sed 60q will give you the last 60 things to get added to the repo, that'll help.

Anything you didn't git add is gone as surely as if you'd deleted it yourself.

我总结一下吧,其实呢,就两步:

  1. 执行 find .git/objects -type f | xargs ls -lt | sed 60q ,这里60q 的意思是最近60次的add,然后会出来这么个东东:

    $ find .git/objects -type f | xargs ls -lt | sed 60q

    -r—r—r— 1 Y Administ 222 Feb 3 21:00 .git/objects/02/18fb7591

    36a0ee550d2e4d179f01bd75af48a0

    -r—r—r— 1 Y Administ 176 Feb 3 21:00 .git/objects/5c/cb94ce63

    fd5196db10dffa6bab149c8b30546e

    -r—r—r— 1 Y Administ 77 Feb 3 21:00 .git/objects/d5/177a8da3

    96b5d6450d2c8e6ecf2f3ad8e41cd2

    -r—r—r— 1 Y Administ 1387 Feb 3 21:00 .git/objects/e0/7e9099c0

    b27a4dd1a432db0bbf2112ca544ebd

    -r—r—r— 1 Y Administ 5480 Feb 3 20:38 .git/objects/74/ea02bfa7

    353be6095959503abdd7dc0a178f53

    -r—r—r— 1 Y Administ 2701 Feb 3 20:38 .git/objects/7a/d366bac4

    91f6793d9b7da0cc3e7fb5ba26d403

    -r—r—r— 1 Y Administ 2597 Feb 3 20:38 .git/objects/a7/9c139160

    fa387b365629ead63f5818177d2e48

    -r—r—r— 1 Y Administ 2458 Feb 3 20:38 .git/objects/c3/cc71cfa6

    40e80731bb8080a6baad1c0f2efa44

    -r—r—r— 1 Y Administ 2463 Feb 3 20:38 .git/objects/c5/71825cf2

    3df3147e8854cd4903d00a08723db2

    -r—r—r— 1 Y Administ 2666 Feb 3 20:38 .git/objects/e5/c001e1b2

    548ebc786f266b27941cbe7d93592a

    -r—r—r— 1 Y Administ 1941 Feb 3 20:38 .git/objects/ec/08fe6869

    a6d1eb8cfb8b4e740da56f104a5646

此处仅仅截取一部分信息,然后就是恢复了。

  1. 使用 git cat-file -p ID > a.md ,解释一下这个命令,就是将ID所示的文件读取出来重定向保存到 a.md 文件内,ID是objects后面的一串东西,比如第一个就是 0218fb759136a0ee550d2e4d179f01bd75af48a0 。(PS:需要将之间的/ 去掉)。

好了,以上。对了,忘了说了,恢复未提交的文件仅仅是 git add 过的,如果你连 git add 也没有执行,那么我就不晓得怎么做了,如果你知道的话,请告诉我,另外,一定要记着,没事不要执行 git reset --hard ~然后网上的教程什么的也不要轻信,要时刻对知识抱有一种怀疑的态度,包括本文~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值