Xcode 的 git,没保存不小心 checkout 后还能救吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
icebarley
V2EX    git

Xcode 的 git,没保存不小心 checkout 后还能救吗?

  •  1
     
  •   icebarley 2021-04-07 23:44:02 +08:00 6684 次点击
    这是一个创建于 1649 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬好,我是一个 git 小白,平时写 APP 没太注重 git 这块知识,今天想给 APP 写个新功能,想添加一个分支。

    然后进入了 Xcode 的 git 界面,发现 master 这个分支的版本是三个月前,最近 commit 的都跑到总项目文件这里了(图片的蓝色文件夹处),然后想着 checkout 应该就是合并一下,可以把最近的 commit 合并到 master 里,之后就悲剧了,整个项目回到了三个月前的样子。

    截屏 2021-04-07 下午 11.17.45.png

    我写 APP 比较佛系,晚上偶尔写写新功能,平时没有 add 、commit 的习惯,几乎都是版本快发布前才做这些操作。现在就是 dropbox 保存了 3 天前的文件,最坏的结果就是重新写这 3 天的代码。不过我看了一下项目下面 .git 这个文件夹,里面貌似还有 objects 、index 这些文件,不知道能不能根据这些恢复我 checkout 前的代码呢?

    有看到说 PyCharm 、jetbrains 这些软件能恢复历史记录,那如果我把 .git 导入这两个软件是不是也能恢复呢?求大佬赐教!

    第 1 条附言    2021-04-08 22:11:11 +08:00

    感恩各位的帮助,最后通过以下方法恢复了。

    首先

    git reflog --all

    显示最近的所有记录,这里就能看到最近3个月内的所有commit,发现里面有一个 refs/stash ,SHA1为 c8d2431 ,猜测就是Xcode在checkout前自动保存的暂存部分。

    然后

    git show c8d2431

    显示这个部分里面的详细代码操作,发现确实是之前没保存的内容,然后就可以确定恢复了。

    最后

    git reset --hard c8d2431

    恢复到这个stash版本,打开Xcode发现所有一切都回来了,失而复得的感觉太棒了!

    49 条回复    2021-04-08 23:39:16 +08:00
    chinvo
        1
    chinvo  
       2021-04-07 23:45:51 +08:00
    你 checkout 的时候丢弃修改了? 还是 stash 了? 还是先 commit 再 checkout 了?
    icebarley
        2
    icebarley  
    OP
       2021-04-07 23:50:11 +08:00
    @chinvo 我点太快了,没看清楚,checkout 前没有 commit 的,所以才悲剧了
    msg7086
        3
    msg7086  
       2021-04-07 23:55:24 +08:00 via Android
    没提交的代码部分不归 git 处理,不会保存到.git 数据库中。

    用 git 可以保证数据不丢失,如果你故意不用 git 来管理版本,那 git 也没法帮你恢复数据。
    icebarley
        4
    icebarley  
    OP
       2021-04-08 00:14:47 +08:00
    @msg7086 主要是个人小项目平时没那么复杂,让我产生不用 git 也能好好运作的幻觉,今天这种人为失误操作带来的影响也确实会让我重视起来啦
    BrettD
        5
    BrettD  
       2021-04-08 00:36:21 +08:00 via iPhone
    如果你不 commit 的话是找不回来的
    BrettD
        6
    BrettD  
       2021-04-08 00:36:45 +08:00 via iPhone
    git 只保存你的 commit 历史
    tr1stan
        7
    tr1stan  
       2021-04-08 00:50:59 +08:00
    这个城市又多了一个伤心的人
    momocraft
        8
    momocraft  
       2021-04-08 00:56:25 +08:00
    如果 git add 过 有可能能恢复出来 (到.git 里面找文件日期较新的 tree / blob object)
    先备个份 别抱太大希望
    ch2
        9
    ch2  
       2021-04-08 00:56:45 +08:00 via iPhone
    只有 commit 的才能还原
    zsen
        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
    Vancion
        11
    Vancion  
       2021-04-08 02:24:31 +08:00
    补充一点,不要用 dropbox 保存 git 仓库,文件可能会损坏。好像前两天才在这看到案例。
    NilChan
        12
    NilChan  
       2021-04-08 05:52:44 +08:00 via Android
    没 commit 就 checkout 不会失败吗?
    HeapOverflow
        13
    HeapOverflow  
       2021-04-08 06:13:36 +08:00
    you done fucked up.
    trn4
        14
    trn4  
       2021-04-08 07:13:18 +08:00
    你 checkout 有冲突的的话是会失败的啊,没冲突你的修改应该还在但是是基于三个月前的 master 的。而且你的描述我也没看懂,什么叫“最近 commit 的都跑到总项目文件这里了”,commit 是怎么跑到文件里的?
    vicnicLight007
        15
    vicnicLight007  
       2021-04-08 07:27:18 +08:00 via iPhone
    还是要用 sourceTree 稳当
    LokiSharp
        16
    LokiSharp  
       2021-04-08 08:10:22 +08:00 via Android
    有事没事就要 commit 一下啊…
    iminto
        17
    iminto  
       2021-04-08 08:27:56 +08:00   2
    jetbrains 才是你的正确选择。IDE 自带历史记录和本地版本记录,即使你没有 commit,也不会丢数据
    ZeoKarl
        18
    ZeoKarl  
       2021-04-08 08:33:57 +08:00 via iPhone
    @iminto #17 然而,jb 家的 appcode 非常难用,xcode 比他好用无数倍
    nielinjie
        19
    nielinjie  
       2021-04-08 08:40:20 +08:00
    既然 Mac, 不是有 Time Machine 么?
    Mutoo
        20
    Mutoo  
       2021-04-08 08:41:38 +08:00
    jetbrains 家的 IDE 自带 local history 是独立于版本控制存在的。救了我好几次命。
    sunnywqf
        21
    sunnywqf  
       2021-04-08 08:43:52 +08:00 via iPhone
    Xcode 的 undo 能找回来不?
    hash
        22
    hash  
       2021-04-08 08:53:01 +08:00   1
    命令行才是正解,从根本上避免瞎点按钮造成的问题
    RedBeanIce
        23
    RedBeanIce  
       2021-04-08 09:01:20 +08:00 via iPhone
    @nieyujiang,。。appcode 是智能提示等智能使用吗,,,,本地存储历史 show history 或许可以救题主,appcode 智能提示或许不行
    rationa1cuzz
        24
    rationa1cuzz  
       2021-04-08 09:19:45 +08:00
    没有 git add 没有备份 无解
    sutra
        25
    sutra  
       2021-04-08 09:40:06 +08:00
    如果有 TimeMachine,还能找回来。

    另外不要把 git repo 放在 iCloud 文件同步的地方,会有奇奇怪怪的问题。
    z1113456051
        26
    z1113456051  
       2021-04-08 09:41:46 +08:00
    用文本编辑可以找回
    hlx
        27
    hlx  
       2021-04-08 09:48:57 +08:00
    不要让代码在你的电脑上过夜, 没事就 commit, push, 一个功能完成后整理下 commit 历史记录就行了
    5408
        28
    5408  
       2021-04-08 09:56:38 +08:00
    在 Xcode 上切换分支只有两种选项“Cancel”和“Stash and Checkout”,也就是说必须 stash 才能 checkout 成功。你在 Xcode 的 git 列表下的“Stashed Changes”文件夹下应该能看到
    WillBC
        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
    WillBC
        30
    WillBC  
       2021-04-08 10:13:01 +08:00
    ZeoKarl
        31
    ZeoKarl  
       2021-04-08 10:13:28 +08:00 via iPhone
    @RedBeanIce #23 这玩意每次打开,就是一顿疯狂的索引,代码提示也不咋地
    amoyiki
        32
    amoyiki  
       2021-04-08 10:14:17 +08:00
    git reflog 看看 checkout 之前的操作有没有 commit 记录
    icebarley
        33
    icebarley  
    OP
       2021-04-08 10:26:07 +08:00
    @xiadong1994 可能是我没表达清楚,昨晚没 checkout 之前,点击蓝色那个文件夹名,就能看到最近 3 个月提交的 commit ;而点击 master 分支,只能看到 3 个月之前的 commit 内容,也就是说 3 个月前不知道我的什么神奇操作,变成这样子,也就是说我的工作区不在 master,所以 checkout 到 master 之后就导致了最近 3 个月的 commit 不见了。

    @ZHanYao 今晚回家我再去仔细看看,但是昨晚出问题之后我也看过这里,好像都变成了 master 分支下的内容,记录的操作都是 3 个月前的了。。。

    总之谢谢各位解答,好在这个亏不算太大,这次事件也让我恶补了 git 的知识,挺划算的哈哈哈
    icebarley
        34
    icebarley  
    OP
       2021-04-08 10:29:53 +08:00
    @WillBC @zsen @z1113456051 @amoyiki 今晚试试,感谢
    zhuweiyou
        35
    zhuweiyou  
       2021-04-08 10:30:37 +08:00
    不太了解 xcode . 如果是 jb 系列的 IDE, 有自带的 local history 可以看到每次的改动和时间.
    5408
        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...”即可恢复。
    MintZX
        37
    MintZX  
       2021-04-08 11:19:56 +08:00
    如果你没有 stash 或者 commit 就不小心删除了文件,请善用 IDE 的 revert 功能。至少 Jetbrain 的 IDE 是有这个功能的。直接一键 revert 所有代码更改。
    h123123h
        38
    h123123h  
       2021-04-08 11:21:49 +08:00
    找找 local history 吧
    LINAICAI
        39
    LINAICAI  
       2021-04-08 11:46:51 +08:00
    没 commit 不会有记录,除非做了 git stash push
    Vitta
        40
    Vitta  
       2021-04-08 13:28:20 +08:00
    我有次 Commit 了忘了 Push 了,回家重装了系统
    NEVERCODE
        41
    NEVERCODE  
       2021-04-08 13:37:00 +08:00
    @Vitta 很惨,但是有点好笑
    Rocketer
        42
    Rocketer  
       2021-04-08 13:38:38 +08:00 via iPhone
    按 git 的最佳实践,应该每完成一个改动就 commit 一下,学名叫原子性( atomic )。

    习惯这么做以后,就不会发生这种惨剧了。
    xz410236056
        43
    xz410236056  
       2021-04-08 14:36:56 +08:00
    sourcetree 不香吗?这么多年了就没用过 xcode 的 git
    mcluyu
        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 那就不知道了。
    zm8m93Q1e5otOC69
        45
    zm8m93Q1e5otOC69  
       2021-04-08 15:24:00 +08:00
    无了
    Felldeadbird
        46
    Felldeadbird  
       2021-04-08 16:29:29 +08:00
    大概率没了。
    看看 xcode 有没有提供 local history (本地文件历史)。 有一些 IDE,就算你文件被 checkout,你复建一样的文件。然后在本地文件历史,还是可以回滚到代码(前提 IDE 一直没关闭,且不一定回滚到)。

    下次 checkout 前,检查清楚在执行吧。我一般不用 IDE 的 GIT 。要么第三方 GUI,要么命令行。
    kiripeng
        47
    kiripeng  
       2021-04-08 16:30:42 +08:00
    xcode 没有 local history 把
    icebarley
        48
    icebarley  
    OP
       2021-04-08 21:56:52 +08:00
    @ZHanYao @mcluyu
    谢谢两位大佬提供的思路,虽然 Xcode 看不到之前的 Stashed Changes 的内容,但是 Xcode 里 checkout 前会 stash 这个思路给了很大的帮助。

    我最后通过 @zsen 大佬提供的链接恢复了!感恩
    djs
        49
    djs  
       2021-04-08 23:39:16 +08:00
    自动 stash 保命了一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     940 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 22:48 PVG 06:48 LAX 15:48 JFK 18:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86