请教下 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 ,本地需要把中间的一些改动去掉
1
darkengine 2022-06-12 09:55:48 +08:00
如果 feature 分支的 commit 不多,试试 cherry-pick 到当前的远程分支上吧
|
2
nwu2Cv8OZ2MZMg39 2022-06-12 10:19:51 +08:00
直接重新 fetch ,重新 rebase 就好了
|
3
leo108 2022-06-12 11:39:42 +08:00
rebase -i ,在弹出的编辑框里把远端删掉的 commit 对应删除即可
|
4
jeffh 2022-06-12 17:10:50 +08:00
你的操作是对的,并且建议合并远程时使用 git merge --squash ,rebase 有时候会有很多冲突,不如 merge 划算
|
5
rosu 2022-06-12 17:12:42 +08:00
感觉应该没有了,因为你总是要 pull master 的代码的。远端 reset 的情况下,本地相当于分叉了。
题外话,为什么允许 master reset 后 force push ,这对团队其他人太不友好了。应该禁止 reset ,改为 revert 。 |
6
closedevice 2022-06-12 18:55:31 +08:00
对于像楼主的这种情况,方法挺多,无论是 rebase -i ,还是重建分支再 cp commit ,还是在当前分支 reset 后再 cp 、rebase 都行,但最重要的是在稳定分支上要尽量避免 reset --hard 操作后 push -f 操作,用 revert 来代替.(PS:由于之前踩坑太多,一般我自己习惯于将多个相关的 commit 做成一个 commit ,方便后续操作;)
|
7
FaiChou 2022-06-12 22:34:04 +08:00 2
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 |
8
FaiChou 2022-06-12 22:35:14 +08:00
https://faichou.com/skip-some-commits-when-doing-merge/ 之前也遇到过类似问题, 找过几个方法.
|