• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zjsxwc
V2EX  ›  程序员

git 如何把某次 commit 抹掉?

  •  
  •   zjsxwc ·
    zjsxwc · Mar 16, 2018 · 9267 views
    This topic created in 2985 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

    #移除暴露的档案后 git push -f 到 repo, 记得把 repo 的 force 保护关掉
    lllllllllllllll
        13
    lllllllllllllll  
       Mar 16, 2018   ❤️ 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  
       Mar 16, 2018
    虽然我也觉得直接换 secret 会好点
    uolcano
        15
    uolcano  
       Mar 16, 2018 via Android
    @scnace rebase 后其实还是能通过 reflog 看到这次操作的,不过被回滚的内容就不知道能不能再恢复回来,我还没试过恢复
    wwulfric
        16
    wwulfric  
       Mar 16, 2018
    1. 作为分布式代码控制,你不能保证其他人电脑上没有备份
    2. git rebase -i,然后在你要删除的 commit 那里把 pick 换成 drop,然后强推,至少服务器记录里可以删掉
    3. 最好的方式是换 secret 吧
    ZxBing0066
        17
    ZxBing0066  
       Mar 16, 2018   ❤️ 1
    reset 后 push --force 然而已经上线了不排除已经泄露的可能,还是换 secret 实在
    scnace
        18
    scnace  
       Mar 16, 2018 via Android
    @uolcano drop 也能看到吗?没用 reflog 试过来着……
    ex44559
        19
    ex44559  
       Mar 16, 2018
    git rebase
    closedevice
        20
    closedevice  
       Mar 16, 2018
    @vegito2002 git 图形化客户端
    liufish
        21
    liufish  
       Mar 16, 2018
    更换 secret
    或者 rebase,再 push -f
    Raymon111111
        22
    Raymon111111  
       Mar 16, 2018
    git reset --hard #commit 号#

    回滚到提交前一次的 commit 号, 记录就消失了...
    WispZhan
        23
    WispZhan  
       Mar 16, 2018
    没有 code review 的惨剧。
    zjsxwc
        24
    zjsxwc  
    OP
       Mar 16, 2018
    @WispZhan

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

    在不能 ignore 的文件里,写了调试性质的代码啊
    flowfire
        39
    flowfire  
       Mar 17, 2018
    @zjsxwc 把配置文件单独拉出来,在需要用到的地方 include 啊
    zjsxwc
        40
    zjsxwc  
    OP
       Mar 17, 2018
    @flowfire 你事先无法预测你要在哪里 debug 的
    LancerXin
        41
    LancerXin  
       Mar 23, 2018
    --force 神不知鬼不觉 慎用
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3109 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 11:30 · PVG 19:30 · LAX 04:30 · JFK 07:30
    ♥ Do have faith in what you're doing.