git 如何把某次 commit 抹掉? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
zjsxwc
V2EX    程序员

git 如何把某次 commit 抹掉?

  •  
  •   zjsxwc
    zjsxwc 2018-03-16 09:24:30 +08:00 8855 次点击
    这是一个创建于 2768 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有同事在一次本地 commit 里把极光推送的 secret 传上去了,然后他又 commit 一次把这个 commit 给覆盖掉,但通过gitk filename仍旧可以看到他的那次提交的 secret。

    然而不幸的是,上周已经把他的分支合并到了线上分支。

    我们应该如何把他带有 secret 的提交抹去?

    第 1 条附言    2018-03-16 09:55:09 +08:00
    结贴, 还是换 secret 代价最小也最简单
    41 条回复    2018-03-23 10:01:06 +08:00
    blakejia
        1
    blakejia  
       2018-03-16 09:27:01 +08:00   1
    更换 secret 更实在
    ycz0926
        2
    ycz0926  
       2018-03-16 09:28:36 +08:00 via iPhone
    把代码删了,重新初始化仓库
    pagxir
        3
    pagxir  
       2018-03-16 09:29:38 +08:00 via Android
    直接删库跑路。
    leviathan0992
        4
    leviathan0992  
       2018-03-16 09:30:28 +08:00
    强制回滚
    arclin16
        5
    arclin16  
       2018-03-16 09:32:36 +08:00
    reset 到提交 secret 之前的节点吧 然后重新 commit...
    scnace
        6
    scnace  
       2018-03-16 09:33:15 +08:00 via Android
    rebase -i ? 还有这种 key 不是应该做成 conf 的形式吗?
    vegito2002
        8
    vegito2002  
       2018-03-16 09:33:54 +08:00
    reset 不行吗? gitk 没用过不知道难道是有什么特殊的功能;
    SEARCHINGFREE
        9
    SEARCHINGFREE  
       2018-03-16 09:35:29 +08:00
    #1 +1
    secret 都暴露了吧
    dahvlh
        11
    dahvlh  
       2018-03-16 09:42:09 +08:00
    reset 然后 push -f 吧
    timwei
        12
    timwei  
       2018-03-16 09:43:47 +08:00
    #先记录暴露的 commit 的 hash、当前版本的 hash
    git log

    #回到旧版本
    git checkout 旧版本 hash

    #创建回滚用分支
    git checkout -b 回滚用的分支

    #套用回滚版本到当前版本中间的修改
    git checkout 当前版本 hash .

    #移除暴露的档案后 git push -f 到 repo, 记得把 repo 的 force 保护关掉
    lllllllllllllll
        13
    lllllllllllllll  
       2018-03-16 09:48:40 +08:00   2
    backup current files.
    git reset --hard <your commit hash>
    git push origin master -f

    use your backup overwrite current files
    timwei
        14
    timwei  
       2018-03-16 09:48:40 +08:00
    虽然我也觉得直接换 secret 会好点
    uolcano
        15
    uolcano  
       2018-03-16 09:50:42 +08:00 via Android
    @scnace rebase 后其实还是能通过 reflog 看到这次操作的,不过被回滚的内容就不知道能不能再恢复回来,我还没试过恢复
    wwulfric
        16
    wwulfric  
       2018-03-16 09:51:29 +08:00
    1. 作为分布式代码控制,你不能保证其他人电脑上没有备份
    2. git rebase -i,然后在你要删除的 commit 那里把 pick 换成 drop,然后强推,至少服务器记录里可以删掉
    3. 最好的方式是换 secret 吧
    ZxBing0066
        17
    ZxBing0066  
       2018-03-16 10:01:42 +08:00   1
    reset 后 push --force 然而已经上线了不排除已经泄露的可能,还是换 secret 实在
    scnace
        18
    scnace  
       2018-03-16 10:05:11 +08:00 via Android
    @uolcano drop 也能看到吗?没用 reflog 试过来着……
    ex44559
        19
    ex44559  
       2018-03-16 10:06:58 +08:00
    git rebase
    closedevice
        20
    closedevice  
       2018-03-16 10:13:58 +08:00
    @vegito2002 git 图形化客户端
    liufish
        21
    liufish  
       2018-03-16 10:27:36 +08:00
    更换 secret
    或者 rebase,再 push -f
    Raymon111111
        22
    Raymon111111  
       2018-03-16 10:30:19 +08:00
    git reset --hard #commit 号#

    回滚到提交前一次的 commit 号, 记录就消失了...
    WispZhan
        23
    WispZhan  
       2018-03-16 10:31:28 +08:00
    没有 code review 的惨剧。
    zjsxwc
        24
    zjsxwc  
    OP
       2018-03-16 10:42:40 +08:00
    @WispZhan

    这个 code review 看不出来的
    ryuzaki113
        25
    ryuzaki113  
       2018-03-16 11:31:46 +08:00
    重新生成一下 secret
    0xABCD
        26
    0xABCD  
       2018-03-16 11:37:12 +08:00 via Android
    @arclin16 你这种方式提交不了吧
    otakustay
        27
    otakustay  
       2018-03-16 11:41:04 +08:00
    楼上有很多做法,但前提都是服务器不留 reflog ……
    loading
        28
    loading  
       2018-03-16 11:41:06 +08:00 via iPhone
    只要暴露出来,就应该改啊。
    0xABCD
        29
    0xABCD  
       2018-03-16 11:50:43 +08:00 via Android
    如果合并到 dev 或者 master 分支就比较麻烦了,需要同时 reset feature 和 dev 分支,不然就算你 reset 了 feature 分支,你也不能 merge 到 dev 分支,它会提示你比 dev 分支旧的
    rohgeo
        30
    rohgeo  
       2018-03-16 12:09:50 +08:00
    只抹掉服务器的仓库没用。还没有人拉取过的时候,你抹掉服务器的就可以。某则必须所有人的本地仓库也抹掉才行!如果有人已经拉取下来了,他再次提交的时候,会全部都提交回来!
    arclin16
        31
    arclin16  
       2018-03-16 14:45:07 +08:00
    @0xABCD git push -f 只要强制提交就可以
    regiondavid
        32
    regiondavid  
       2018-03-16 17:28:54 +08:00
    git reset --rebase
    wujunze
        33
    wujunze  
       2018-03-16 19:03:27 +08:00
    reset 然后 push -f
    lovesky
        34
    lovesky  
       2018-03-16 19:23:20 +08:00 via Android
    核弹级的 git 指令 git filter-branch
    xiqingongzi
        35
    xiqingongzi  
       2018-03-16 19:28:44 +08:00   1
    Reficul
        36
    Reficul  
    &nbs;  2018-03-17 02:18:24 +08:00 via Android
    @scnace 能,只要你知道之前那次 commit 的 hash,没有 gc 过仓库就能 checkout 出来
    flowfire
        37
    flowfire  
       2018-03-17 02:27:49 +08:00 via iPhone
    其实我比较奇怪你们都不写 gitignore 的么。。。
    zjsxwc
        38
    zjsxwc  
    OP
       2018-03-17 08:29:21 +08:00
    @flowfire

    在不能 ignore 的文件里,写了调试性质的代码啊
    flowfire
        39
    flowfire  
       2018-03-17 10:57:32 +08:00
    @zjsxwc 把配置文件单独拉出来,在需要用到的地方 include 啊
    zjsxwc
        40
    zjsxwc  
    OP
       2018-03-17 13:00:30 +08:00
    @flowfire 你事先无法预测你要在哪里 debug 的
    LancerXin
        41
    LancerXin  
       2018-03-23 10:01:06 +08:00
    --force 神不知鬼不觉 慎用
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5888 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 03:20 PVG 11:20 LAX 20:20 JFK 23:2
    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