git
› Pro Git
› Atlassian Git Tutorial
› Pro Git 简体中文翻译
› GitX
nexuszjq
V2EX  ›  git

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

  •  1
     
  •   nexuszjq · Sep 26, 2022 · 4474 views
    This topic created in 1498 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
    nexuszjq
    OP
    Sep 26, 2022
    1
    奇怪模拟的 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
    wolfie
    Sep 26, 2022
    2
    主题可以用 markdown 格式。

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

    d abcd1234

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