git 小白求助,怎样优雅的回滚过去某次错误的 merge,并保留 merge 之后 commit 的改动 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
nexuszjq
V2EX    git

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

  •  1
     
  •   nexuszjq Sep 26, 2022 3923 views
    This topic created in 1312 days ago, the information mentioned may be changed or developed.

    想要回滚之前的一次错误的 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 replies    2022-09-27 09:37:10 +08:00
    nexuszjq
        1
    nexuszjq  
    OP
       Sep 26, 2022
    奇怪模拟的 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  
       Sep 26, 2022
    主题可以用 markdown 格式。

    允许 push -f ,则借助工具用 drop commit 。
    不允许就 revert 。
    hsfzxjy
        3
    hsfzxjy  
       Sep 26, 2022 via Android
    git rebase -i abcd1234
    然后删掉 pick asdf4321
    superwhite
        4
    superwhite  
       Sep 26, 2022   2
    先 git reset,然后把后面几次的提交进行 git cherry-pick commit3,4,5...
    FrankAdler
        5
    FrankAdler  
       Sep 26, 2022
    直接 revert 不行吗
    baolongzhanshen
        6
    baolongzhanshen  
       Sep 26, 2022
    git rebase -i abcd1234
    baolongzhanshen
        7
    baolongzhanshen  
       Sep 26, 2022
    @baolongzhanshen d asdf4321
    renmu
        8
    renmu  
       Sep 26, 2022 via Android
    直接 revert 吧
    youngxhui
        11
    youngxhui  
       Sep 26, 2022 via Android
    Reficul
        12
    Reficul  
       Sep 26, 2022   1
    $git rebase -i abcd1234

    d abcd1234

    :wq
    Jirajine
        13
    Jirajine  
       Sep 26, 2022
    可以用 rebase -i ,或者对小白来说最万能的办法,reset 或 checkout 到最近的“正常”commit 点,然后把后面想要的 commit 的一个个 cherry-pick 上去。
    simen513
        14
    simen513  
       Sep 26, 2022
    lazygit 有个功能,能直接将 staged 的修改应用到特定的 commit 上。后台就是用的 rebase -i 实现的,比较麻烦。
    leonshaw
        15
    leonshaw  
       Sep 26, 2022
    git rebase --Onto=abcd1234 asdf4321
    FrankHB
        16
    FrankHB  
       Sep 26, 2022
    不接受重写只有 revert 。
    能 push -f ,那就 git replace+git filter-repo (事先保存好 config )。
    简单点就 rebase ,不过不保留时间戳。
    不过在此之前先学会 cherry-pick 和 format-patch/apply 吧。
    foam
        17
    foam  
       Sep 26, 2022
    revert 就是为这种场景设计的,不要搞其他的了
    eraserking
        18
    eraserking  
       Sep 27, 2022
    取决于你的 branch 是你自己用,还是别人也用
    别人也用,为了避免别人骂你,就 revert 那个 commit
    如果是自己用,revert 那个 commit 当然也行,但是如果你想直接把那个 commit 抹掉,就 rebase 到那个 commit 的前一个,然后 drop 那个 commit
    About     Help     Advertise     Blog     API     FAQ     Solana     2644 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 88ms UTC 12:06 PVG 20:06 LAX 05:06 JFK 08:06
    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