Git 删除本地分支和远程分支后,是不是该分支的 commit 也一并删除了?还能恢复吗?

2019-06-21 19:55:34 +08:00
 coolair
3279 次点击
所在节点    问与答
14 条回复
JLNR
2019-06-21 20:00:21 +08:00
可以恢复,reflog 找回你的校验和,checkout 到该提交就可以了。删除的只是一个 label 而已,实际上提交还在
coolair
2019-06-21 21:06:34 +08:00
@JLNR 是在本地还有记录还可以恢复吗?如果我在电脑 A 创建了分支,然后推到了 remote 服务器,接着又删了本地和远程的分支,并且在本地把这个代码库都删除了。那么如果在电脑 B pull 了最新的代码,已经没有那个分支了,是不是就没机会恢复了?
我看了下 reflog 只有 master 的记录。
JLNR
2019-06-21 21:11:16 +08:00
@coolair 是的,你说的这种情况是恢复不了的。在 A 电脑上的话可以恢复
hakono
2019-06-21 21:41:10 +08:00
@coolair 不一定。要看远程库怎么清理各种 commit。 有的不会立刻清掉
coolair
2019-06-21 22:09:14 +08:00
@hakono 怎么看远程怎么清理的?我是自建的 git,用 git init --bare 初始化的仓库。
coolair
2019-06-21 22:10:50 +08:00
@hakono 用 git push origin :dev 删除的分支。
msg7086
2019-06-21 22:18:40 +08:00
先什么都别管,把服务器上整个目录打包一个 tar 自己备份好。
这个 tar 里有你丢失的数据,至少保证其他操作不会影响到他。

然后下个 SmartGit,把 bare 仓库下载回来改名成.git 放在某个目录下,然后用 SmartGit 打开这个目录,切换到 Log 界面,左下角筛选器打开 Recyclable commits,右边应该会出现所有孤立提交记录。自己挨个点击看看,找到要恢复的提交,右键增加分支,起个名字,然后 Remote 菜单里把服务器地址加进来 Push 回去即可。

不知道还有没有别的 GUI 软件能看 reflog 的,反正我是一直用 SmartGit 的,用用也不要钱,你可以试试。
comwrg
2019-06-21 22:26:00 +08:00
git 有个特性就是你不想恢复都难
Arnie97
2019-06-22 00:22:23 +08:00
既然 A 已经删了,登录 remote 那台机器看 reflog 去恢复。此处 B 是没用的。
coolair
2019-06-22 09:50:13 +08:00
@Arnie97 远程机器上通过--bare 建的仓库不能 reflog 吧?
msg7086
2019-06-22 10:34:41 +08:00
@coolair 你是试过了才说的还是……?
coolair
2019-06-22 10:49:09 +08:00
@msg7086 我试过了,按你说的,按你说的那样操作的,把远程仓库下载到本地,重命名为.git 放在一个空目录 A 下,然后用 SmartGit 的 Portable 版本打开目录 A,log 为空。
coolair
2019-06-22 10:49:23 +08:00
@msg7086 是哪里操作不对吗?
msg7086
2019-06-22 16:14:10 +08:00
@coolair 那可能……你的 bare 仓库里没有 reflog = =
可以试试看 git fsck --unreachable,看看能不能救回来什么。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/576287

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX