背景:原始库作为 submodule 在父 repo 下面。
行为:本地 commit 了没有 push ,父 repo cehck 一下别的 branch ,check 回来。
结果:submodule 所在文件空了,丢失了 commit 但没 push 的历史。
1 Aurora0 2024-01-16 17:02:18 +08:00 JetBrains 家的软件有本地历史记录可以找回的 |
![]() | 2 KevinLock 2024-01-16 17:02:23 +08:00 ![]() git reflog 找一下看能恢复吗? 试着用 subtree 吧,submodule 坑太多了 |
![]() | 3 wgbx 2024-01-16 17:03:36 +08:00 git 只要 commit 就能找回来,有操作历史命令的,试试 git reflog |
![]() | 4 wgbx 2024-01-16 17:04:40 +08:00 找到哈希 commit ,cherry-pick 啥的都可以弄回来 |
![]() | 5 konakona 2024-01-16 17:27:36 +08:00 ![]() 因为你本地 submodule 是游离分支吧,所以会丢失,但凡在你丢失之前执行一次 git log 看下 commit id ,这样一来在你发生“丢失”的时候,可以用 git cherry-pick 旧回来。 还是学而不精啊… |
![]() | 6 qqjt 2024-01-16 17:29:26 +08:00 ![]() 本地 commit 的时候,不先 commit submodule 的吗 |
7 kneep 2024-01-16 17:38:39 +08:00 via iPhone git reflog |
![]() | 8 woodfizky 2024-01-16 18:03:41 +08:00 本地 commit 过用 git 可以找回来。 本地没 commit 过但是用的 jetbrains 的 IDE 可以用 local history 找回来。这个也是我本地忘了 commit 拉代码导致丢代码才发现的,本来都万念俱灰了。 |
9 xfn 2024-01-16 20:29:15 +08:00 ![]() 可以看看 google 的 repo ,android 和 chromium 的源代码都是它管理的,每个项目都是由上百个的 git 仓库组成。我们自己的工程管理中也用得很顺 |
![]() | 10 MajestySolor 2024-01-16 21:00:15 +08:00 ![]() git 的 submodule 是巨坑,碰过一次就再也不想用了 |
![]() | 11 SingeeKing PRO 应该有 reflog ,checkout 会一并改 submodule 指向的 commit ,但是 commit 过不太容易丢 |
12 Inf1nity 2024-01-16 22:29:44 +08:00 git submodule 确实是有挺多坑的,部分操作行为和结果非常反直觉。 |
![]() | 13 kennir 2024-01-16 22:31:34 +08:00 submodule 问题太多了,我们用 git-repo 管理多仓库,配合 codeup 还不错 |
14 tolbkni 2024-01-16 22:35:25 +08:00 直接在 submodule 里改东西?我一般是会把 submodule 里的 repo 单独放个文件夹,所有改动在单独的 repo 里做,然后 push 到服务器上,submodule 只从服务器上拉取 |
![]() | 15 Maboroshii 2024-01-17 00:30:49 +08:00 via Android submodule 概念的确难理解,我觉得不如 gitignore 加同步脚本来维护。。 |
![]() | 16 filtrate 2024-01-17 07:51:01 +08:00 via iPhone repo 确实是个不错的替代/解决方案 |
![]() | 17 andyJado OP |
18 icegogh 2024-01-17 08:20:56 +08:00 via Android git sub 相关的 api 水有点深,建议一般不到精通 git 的程度 不要触及 |
![]() | 19 retanoj 2024-01-17 09:28:22 +08:00 我想复现一下 OP 的操作,但有点没看明白。 本地修改了 submodule 并 add && commit 了,在父 repo 的 status 里会显示一个修改。这时候父进行 checkout branch 这个修改会带过去的吧?为啥会丢呢? |
20 lvjiaxuan818 2024-01-17 09:32:32 +08:00 ![]() submodule 已经不用了,workspace 你值得拥有。 |
![]() | 21 lisxour 2024-01-17 09:48:41 +08:00 给我的感觉是误操作导致的 |
22 HangoX 2024-01-17 10:09:15 +08:00 subTree 好用点,对于本地来说没有任何感知 |
![]() | 23 andyJado OP 你 check 了一个新的 branch ,我 check 的是老 branch ,该 bc 我切出来的时候还没有 add submodule 。 我看你回复后又去复现了一下,会丢。 |
![]() | 24 cloudzhou 2024-01-17 12:42:07 +08:00 @andyJado 复现你的操作,不管怎么切换 submodule 都保持了当时的一个 commit ,除非 reset hard ,不知道你怎么丢失的 |
![]() | 25 andyJado OP @cloudzhou 我又重建新两个 repo ,复现成功。 关键:branch0 没有 submodule ,切 branch1 add & commit submodule ,回到 branch0 ,没有撒毛利。再回到 branch1 ,本地的 sumoli 空了,.git 都没有。 |
![]() | 26 konakona 2024-01-17 15:21:22 +08:00 要不试试 `git fsck --lost-found`,这将列出孤立的 commit 和其他对象。 在 `.git/lost-found/commit/` 目录下你可能会找到你丢失的 commit 对象。 以上来自 chatGPT 。 |
27 owt5008137 2024-01-17 17:43:10 +08:00 via Android 子 repo 的 reflog 里有。默认设置映像中 3 天内都是不会 gc 掉的 |