git 小白求助,怎样优雅的回滚过去某次错误的 merge,并保留 merge 之后 commit 的改动 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
nexuszjq
V2EX    git

git 小白求助,怎样优雅的回滚过去某次错误的 merge,并保留 merge 之后 commit 的改动

  •  1
     
  •   nexuszjq 2022-09-26 17:58:55 +08:00 3563 次点击
    这是一个创建于 1143 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想要回滚之前的一次错误的 merge ,然而在那次 merge 之后又有几次 commit 并已 push 到远端仓库:

    假设 git log 如下: commit5 10:00 commit4 9:00 commit3 8:00 wrong merge 7:00 reversion number: asdf4321 commit2 6:00 reversion number: abcd1234 commit1 5:00

    回滚掉 7:00 那次 wrong merge

    我的操作是 git reset --hard abcd1234 ,回到 commit2 的状态 然后再把 commit3 ,commit4 ,commit5 三个 commit 的改动...复制粘贴了回去... 再 git push -f 到远端仓库

    事后被自己的行为蠢到了......

    请教各位 git 圣手,这种情况如何优雅的回滚掉中间某次 merge/commit ,并保留之后的几次 commit 的代码

    18 条回复    2022-09-27 09:37:10 +08:00
    nexuszjq
        1
    nexuszjq  
    OP
       2022-09-26 18:02:34 +08:00
    奇怪模拟的 git log 怎么没了换行。。。
    我换种写法:
    commit5 10:00 <- commit4 9:00 <- commit3 8:00 <- wrong merge 7:00 (reversion number: asdf4321) <- commit2 6:00 (reversion number: abcd1234) <- commit1 5:00
    wolfie
        2
    wolfie  
       2022-09-26 18:10:58 +08:00
    主题可以用 markdown 格式。

    允许 push -f ,则借助工具用 drop commit 。
    不允许就 revert 。
    hsfzxjy
        3
    hsfzxjy  
       2022-09-26 18:12:04 +08:00 via Android
    git rebase -i abcd1234
    然后删掉 pick asdf4321
    superwhite
        4
    superwhite  
       2022-09-26 18:15:01 +08:00   2
    先 git reset,然后把后面几次的提交进行 git cherry-pick commit3,4,5...
    FrankAdler
        5
    FrankAdler  
       2022-09-26 18:32:11 +08:00
    直接 revert 不行吗
    baolongzhanshen
        6
    baolongzhanshen  
       2022-09-26 18:56:11 +08:00
    git rebase -i abcd1234
    baolongzhanshen
        7
    baolongzhanshen  
       2022-09-26 18:56:37 +08:00
    @baolongzhanshen d asdf4321
    renmu
        8
    renmu  
       2022-09-26 19:11:24 +08:00 via Android
    直接 revert 吧
    youngxhui
        11
    youngxhui  
       2022-09-26 19:46:53 +08:00 via Android
    Reficul
        12
    Reficul  
       2022-09-26 19:51:07 +08:00   1
    $git rebase -i abcd1234

    d abcd1234

    :wq
    Jirajine
        13
    Jirajine  
       2022-09-26 20:36:14 +08:00
    可以用 rebase -i ,或者对小白来说最万能的办法,reset 或 checkout 到最近的“正常”commit 点,然后把后面想要的 commit 的一个个 cherry-pick 上去。
    simen513
        14
    simen513  
       2022-09-26 21:45:03 +08:00
    lazygit 有个功能,能直接将 staged 的修改应用到特定的 commit 上。后台就是用的 rebase -i 实现的,比较麻烦。
    leonshaw
        15
    leonshaw  
       2022-09-26 21:59:42 +08:00
    git rebase --Onto=abcd1234 asdf4321
    FrankHB
        16
    FrankHB  
       2022-09-26 22:38:26 +08:00
    不接受重写只有 revert 。
    能 push -f ,那就 git replace+git filter-repo (事先保存好 config )。
    简单点就 rebase ,不过不保留时间戳。
    不过在此之前先学会 cherry-pick 和 format-patch/apply 吧。
    foam
        17
    foam  
       2022-09-26 23:17:03 +08:00
    revert 就是为这种场景设计的,不要搞其他的了
    eraserking
        18
    eraserking  
       2022-09-27 09:37:10 +08:00
    取决于你的 branch 是你自己用,还是别人也用
    别人也用,为了避免别人骂你,就 revert 那个 commit
    如果是自己用,revert 那个 commit 当然也行,但是如果你想直接把那个 commit 抹掉,就 rebase 到那个 commit 的前一个,然后 drop 那个 commit
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     934 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 19:48 PVG 03:48 LAX 11:48 JFK 14:48
    Do have faith in what you're doing.
    ubao msn 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