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 · 2988 次点击
    这是一个创建于 787 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想要回滚之前的一次错误的 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   ·   实用小工具   ·   1843 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:25 · PVG 00:25 · LAX 08:25 · JFK 11:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.