V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zjsxwc
V2EX  ›  程序员

git 如何把某次 commit 抹掉?

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

    有同事在一次本地 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
    commit and push
    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  
       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   ·   实用小工具   ·   5609 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:44 · PVG 14:44 · LAX 22:44 · JFK 01:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.