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

2022-09-26 17:58:55 +08:00
 nexuszjq

想要回滚之前的一次错误的 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 的代码

2707 次点击
所在节点    git
18 条回复
nexuszjq
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
2022-09-26 18:10:58 +08:00
主题可以用 markdown 格式。

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

d abcd1234

:wq
Jirajine
2022-09-26 20:36:14 +08:00
可以用 rebase -i ,或者对小白来说最万能的办法,reset 或 checkout 到最近的“正常”commit 点,然后把后面想要的 commit 的一个个 cherry-pick 上去。
simen513
2022-09-26 21:45:03 +08:00
lazygit 有个功能,能直接将 staged 的修改应用到特定的 commit 上。后台就是用的 rebase -i 实现的,比较麻烦。
leonshaw
2022-09-26 21:59:42 +08:00
git rebase --onto=abcd1234 asdf4321
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
2022-09-26 23:17:03 +08:00
revert 就是为这种场景设计的,不要搞其他的了
eraserking
2022-09-27 09:37:10 +08:00
取决于你的 branch 是你自己用,还是别人也用
别人也用,为了避免别人骂你,就 revert 那个 commit
如果是自己用,revert 那个 commit 当然也行,但是如果你想直接把那个 commit 抹掉,就 rebase 到那个 commit 的前一个,然后 drop 那个 commit

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/883095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX