各位大佬好,我是一个 git 小白,平时写 APP 没太注重 git 这块知识,今天想给 APP 写个新功能,想添加一个分支。
然后进入了 Xcode 的 git 界面,发现 master 这个分支的版本是三个月前,最近 commit 的都跑到总项目文件这里了(图片的蓝色文件夹处),然后想着 checkout 应该就是合并一下,可以把最近的 commit 合并到 master 里,之后就悲剧了,整个项目回到了三个月前的样子。
我写 APP 比较佛系,晚上偶尔写写新功能,平时没有 add 、commit 的习惯,几乎都是版本快发布前才做这些操作。现在就是 dropbox 保存了 3 天前的文件,最坏的结果就是重新写这 3 天的代码。不过我看了一下项目下面 .git 这个文件夹,里面貌似还有 objects 、index 这些文件,不知道能不能根据这些恢复我 checkout 前的代码呢?
有看到说 PyCharm 、jetbrains 这些软件能恢复历史记录,那如果我把 .git 导入这两个软件是不是也能恢复呢?求大佬赐教!
感恩各位的帮助,最后通过以下方法恢复了。
首先
git reflog --all
显示最近的所有记录,这里就能看到最近3个月内的所有commit,发现里面有一个 refs/stash ,SHA1为 c8d2431
,猜测就是Xcode在checkout前自动保存的暂存部分。
然后
git show c8d2431
显示这个部分里面的详细代码操作,发现确实是之前没保存的内容,然后就可以确定恢复了。
最后
git reset --hard c8d2431
恢复到这个stash版本,打开Xcode发现所有一切都回来了,失而复得的感觉太棒了!
![]() | 1 chinvo 2021-04-07 23:45:51 +08:00 你 checkout 的时候丢弃修改了? 还是 stash 了? 还是先 commit 再 checkout 了? |
![]() | 3 msg7086 2021-04-07 23:55:24 +08:00 via Android 没提交的代码部分不归 git 处理,不会保存到.git 数据库中。 用 git 可以保证数据不丢失,如果你故意不用 git 来管理版本,那 git 也没法帮你恢复数据。 |
![]() | 4 icebarley OP @msg7086 主要是个人小项目平时没那么复杂,让我产生不用 git 也能好好运作的幻觉,今天这种人为失误操作带来的影响也确实会让我重视起来啦 |
![]() | 5 BrettD 2021-04-08 00:36:21 +08:00 via iPhone 如果你不 commit 的话是找不回来的 |
![]() | 6 BrettD 2021-04-08 00:36:45 +08:00 via iPhone git 只保存你的 commit 历史 |
7 tr1stan 2021-04-08 00:50:59 +08:00 这个城市又多了一个伤心的人 |
![]() | 8 momocraft 2021-04-08 00:56:25 +08:00 如果 git add 过 有可能能恢复出来 (到.git 里面找文件日期较新的 tree / blob object) 先备个份 别抱太大希望 |
![]() | 9 ch2 2021-04-08 00:56:45 +08:00 via iPhone 只有 commit 的才能还原 |
10 zsen 2021-04-08 01:01:53 +08:00 via iPhone https://www.google.com /search?q=git+%E6%89%BE%E5%9B%9E%E6%9C%AA%E6%8F%90%E4%BA%A4%E7%9A%84%E6%96%87%E4%BB%B6&newwindow=1&safe=strict&source=hp&ei=0eRtYKinKIbr0ATPzbGQDQ&oq=git+%E6%89%BE%E5%9B%9E%E6%9C%AA%E6%8F%90%E4%BA%A4%E7%9A%84&gs_lcp=ChFtb2JpbGUtZ3dzLXdpei1ocBABGAEyBQghEKABMgUIIRCgATIFCCEQoAE6AggAOgQIABAMOgcIIRAKEKABUPsLWLekAWCcxgFoBnAAeAaAAZIBiAGKGJIBBDkuMjCYAQCgAQGwAQA&sclient=mobile-gws-wiz-hp |
11 Vancion 2021-04-08 02:24:31 +08:00 补充一点,不要用 dropbox 保存 git 仓库,文件可能会损坏。好像前两天才在这看到案例。 |
12 NilChan 2021-04-08 05:52:44 +08:00 via Android 没 commit 就 checkout 不会失败吗? |
![]() | 13 HeapOverflow 2021-04-08 06:13:36 +08:00 you done fucked up. |
14 trn4 2021-04-08 07:13:18 +08:00 你 checkout 有冲突的的话是会失败的啊,没冲突你的修改应该还在但是是基于三个月前的 master 的。而且你的描述我也没看懂,什么叫“最近 commit 的都跑到总项目文件这里了”,commit 是怎么跑到文件里的? |
15 vicnicLight007 2021-04-08 07:27:18 +08:00 via iPhone 还是要用 sourceTree 稳当 |
![]() | 16 LokiSharp 2021-04-08 08:10:22 +08:00 via Android 有事没事就要 commit 一下啊… |
![]() | 17 iminto 2021-04-08 08:27:56 +08:00 ![]() jetbrains 才是你的正确选择。IDE 自带历史记录和本地版本记录,即使你没有 commit,也不会丢数据 |
![]() | 19 nielinjie 2021-04-08 08:40:20 +08:00 既然 Mac, 不是有 Time Machine 么? |
![]() | 20 Mutoo 2021-04-08 08:41:38 +08:00 jetbrains 家的 IDE 自带 local history 是独立于版本控制存在的。救了我好几次命。 |
21 sunnywqf 2021-04-08 08:43:52 +08:00 via iPhone Xcode 的 undo 能找回来不? |
![]() | 22 hash 2021-04-08 08:53:01 +08:00 ![]() 命令行才是正解,从根本上避免瞎点按钮造成的问题 |
![]() | 23 RedBeanIce 2021-04-08 09:01:20 +08:00 via iPhone @nieyujiang,。。appcode 是智能提示等智能使用吗,,,,本地存储历史 show history 或许可以救题主,appcode 智能提示或许不行 |
![]() | 24 rationa1cuzz 2021-04-08 09:19:45 +08:00 没有 git add 没有备份 无解 |
![]() | 25 sutra 2021-04-08 09:40:06 +08:00 如果有 TimeMachine,还能找回来。 另外不要把 git repo 放在 iCloud 文件同步的地方,会有奇奇怪怪的问题。 |
26 z1113456051 2021-04-08 09:41:46 +08:00 用文本编辑可以找回 |
27 hlx 2021-04-08 09:48:57 +08:00 不要让代码在你的电脑上过夜, 没事就 commit, push, 一个功能完成后整理下 commit 历史记录就行了 |
![]() | 28 5408 2021-04-08 09:56:38 +08:00 在 Xcode 上切换分支只有两种选项“Cancel”和“Stash and Checkout”,也就是说必须 stash 才能 checkout 成功。你在 Xcode 的 git 列表下的“Stashed Changes”文件夹下应该能看到 |
29 WillBC 2021-04-08 10:08:39 +08:00 歪个楼,Emacs 的 Undo fu session 插件可以在重启 Emacs/Mac 后照旧 undo redo,独立于 git 的。 https://gitlab.com/ideasman42/emacs-undo-fu-session |
30 WillBC 2021-04-08 10:13:01 +08:00 |
![]() | 31 ZeoKarl 2021-04-08 10:13:28 +08:00 via iPhone @RedBeanIce #23 这玩意每次打开,就是一顿疯狂的索引,代码提示也不咋地 |
![]() | 32 amoyiki 2021-04-08 10:14:17 +08:00 git reflog 看看 checkout 之前的操作有没有 commit 记录 |
![]() | 33 icebarley OP @xiadong1994 可能是我没表达清楚,昨晚没 checkout 之前,点击蓝色那个文件夹名,就能看到最近 3 个月提交的 commit ;而点击 master 分支,只能看到 3 个月之前的 commit 内容,也就是说 3 个月前不知道我的什么神奇操作,变成这样子,也就是说我的工作区不在 master,所以 checkout 到 master 之后就导致了最近 3 个月的 commit 不见了。 @ZHanYao 今晚回家我再去仔细看看,但是昨晚出问题之后我也看过这里,好像都变成了 master 分支下的内容,记录的操作都是 3 个月前的了。。。 总之谢谢各位解答,好在这个亏不算太大,这次事件也让我恶补了 git 的知识,挺划算的哈哈哈 |
![]() | 34 icebarley OP |
35 zhuweiyou 2021-04-08 10:30:37 +08:00 不太了解 xcode . 如果是 jb 系列的 IDE, 有自带的 local history 可以看到每次的改动和时间. |
![]() | 36 5408 2021-04-08 11:05:18 +08:00 @icebarley #33 假设你 A 分支最后一次提交是在 3 个月前,当你在 A 分支上有更改并且没提交的情况下想要切换到 B 分支,这时就如我在#28 楼说的“必须 stash 才能 checkout 成功”,Xcode 会将你在 A 分支上所有更改记录保存在“Stashed Changes”文件夹下。如果你想要将此更改恢复到 A 分支上,你只需要切回 A 分支并在 Stashed Changes 文件夹下找到对应的更改记录,右击选择“Apply Stashed Changes...”即可恢复。 |
![]() | 37 MintZX 2021-04-08 11:19:56 +08:00 如果你没有 stash 或者 commit 就不小心删除了文件,请善用 IDE 的 revert 功能。至少 Jetbrain 的 IDE 是有这个功能的。直接一键 revert 所有代码更改。 |
38 h123123h 2021-04-08 11:21:49 +08:00 找找 local history 吧 |
![]() | 39 LINAICAI 2021-04-08 11:46:51 +08:00 没 commit 不会有记录,除非做了 git stash push |
![]() | 40 Vitta 2021-04-08 13:28:20 +08:00 我有次 Commit 了忘了 Push 了,回家重装了系统 |
![]() | 42 Rocketer 2021-04-08 13:38:38 +08:00 via iPhone 按 git 的最佳实践,应该每完成一个改动就 commit 一下,学名叫原子性( atomic )。 习惯这么做以后,就不会发生这种惨剧了。 |
43 xz410236056 2021-04-08 14:36:56 +08:00 sourcetree 不香吗?这么多年了就没用过 xcode 的 git |
![]() | 44 mcluyu 2021-04-08 14:43:47 +08:00 没 commit 就 checkout 会提示你先 stash, 往下 看,下面有个 Stashed Changes,checkout 回你想 apply stash 的分支,然后 apply stash, 然后 commit, 再 merrge “branchXX” into “branchXX1” 没有 stashed changes 那就不知道了。 |
45 zm8m93Q1e5otOC69 2021-04-08 15:24:00 +08:00 无了 |
![]() | 46 Felldeadbird 2021-04-08 16:29:29 +08:00 大概率没了。 看看 xcode 有没有提供 local history (本地文件历史)。 有一些 IDE,就算你文件被 checkout,你复建一样的文件。然后在本地文件历史,还是可以回滚到代码(前提 IDE 一直没关闭,且不一定回滚到)。 下次 checkout 前,检查清楚在执行吧。我一般不用 IDE 的 GIT 。要么第三方 GUI,要么命令行。 |
![]() | 47 kiripeng 2021-04-08 16:30:42 +08:00 xcode 没有 local history 把 |
![]() | 48 icebarley OP |
49 djs 2021-04-08 23:39:16 +08:00 自动 stash 保命了一下 |