[ git rebase ] 操作 - 关于远端代码回退的问题

2022-06-12 09:53:04 +08:00
 maobukui

请教下 git rebase 的操作

当前状态:

本地 feature 开发,做了多次本地 commit 后,在同步到远程前,先做了 fetch ,获取 master 最新的远程代码,然后本地 rebase 操作,未 push 。

碰到的问题:

远程的代码有问题做了回退,这时候本地怎么处理比较好?

我尝试了几个方案,都有些复杂。 把自己 rebase 的代码 reset ,本地 stash 保存,然后操作 master 代码回退后,再次 rebase 。这样比较麻烦,有没有更简单的操作?

场景说明:

master  C1 -> C2 -> C3... Cn
feature C1 -> C2 -> C3... Cn -> A1 -> A2

远端把一部分代码做了回退,用了 reset --hard ,本地需要把中间的一些改动去掉

1711 次点击
所在节点    git
8 条回复
darkengine
2022-06-12 09:55:48 +08:00
如果 feature 分支的 commit 不多,试试 cherry-pick 到当前的远程分支上吧
VikingX
2022-06-12 10:19:51 +08:00
直接重新 fetch ,重新 rebase 就好了
leo108
2022-06-12 11:39:42 +08:00
rebase -i ,在弹出的编辑框里把远端删掉的 commit 对应删除即可
jeffh
2022-06-12 17:10:50 +08:00
你的操作是对的,并且建议合并远程时使用 git merge --squash ,rebase 有时候会有很多冲突,不如 merge 划算
rosu
2022-06-12 17:12:42 +08:00
感觉应该没有了,因为你总是要 pull master 的代码的。远端 reset 的情况下,本地相当于分叉了。

题外话,为什么允许 master reset 后 force push ,这对团队其他人太不友好了。应该禁止 reset ,改为 revert 。
closedevice
2022-06-12 18:55:31 +08:00
对于像楼主的这种情况,方法挺多,无论是 rebase -i ,还是重建分支再 cp commit ,还是在当前分支 reset 后再 cp 、rebase 都行,但最重要的是在稳定分支上要尽量避免 reset --hard 操作后 push -f 操作,用 revert 来代替.(PS:由于之前踩坑太多,一般我自己习惯于将多个相关的 commit 做成一个 commit ,方便后续操作;)
FaiChou
2022-06-12 22:34:04 +08:00
1. cherry-pick:
[master]$ git cherry-pick 123474
[master]$ git cherry-pick 123475

2. rebase:
[bug]$ git branch temp 123475 # a
[bug]$ git rebase --onto master 123474^ temp # b
[bug]$ git checkout master # c
[master]$ git reset --hard temp # d

3. rebase -i:
[dev]$ git checkout -b bug-to-merge-into-master
[bug-to-merge-into-master]$ git rebase -i 123471 123475
d 123471
d 123472
d 123473
p 123474
p 123475
[bug-to-merge-into-master]$ git checkout master
[master]$ git merge bug-to-merge-into-master

4. merge + revert
[master]$ git merge dev
[master]$ git revert -n 123471
[master]$ git revert -n 123472
[master]$ git revert -n 123473
[master]$ git commit -m "revert"

5. patch
[bug]$ git format-patch 123474^..123475 --stdout > ~/Downloads/part.patch
[bug]$ git checkout master
[master]$ git am --signoff < ~/Downloads/part.patch
FaiChou
2022-06-12 22:35:14 +08:00
https://faichou.com/skip-some-commits-when-doing-merge/ 之前也遇到过类似问题, 找过几个方法.

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

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

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

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

© 2021 V2EX