各位大佬好,我是一个 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
xiadong1994 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 2
jetbrains 才是你的正确选择。IDE 自带历史记录和本地版本记录,即使你没有 commit,也不会丢数据
|
18
nieyujiang 2021-04-08 08:33:57 +08:00 via iPhone
@iminto #17 然而,jb 家的 appcode 非常难用,xcode 比他好用无数倍🤣🤣🤣
|
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 1
命令行才是正解,从根本上避免瞎点按钮造成的问题
|
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
ZHanYao 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
nieyujiang 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
ZHanYao 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
uselessVisitor 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 保命了一下
|