V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
maobukui
V2EX  ›  git

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

  •  
  •   maobukui · 2022-06-12 09:53:04 +08:00 · 1682 次点击
    这是一个创建于 655 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教下 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 ,本地需要把中间的一些改动去掉
    
    
    8 条回复    2022-06-12 22:35:14 +08:00
    darkengine
        1
    darkengine  
       2022-06-12 09:55:48 +08:00
    如果 feature 分支的 commit 不多,试试 cherry-pick 到当前的远程分支上吧
    VikingX
        2
    VikingX  
       2022-06-12 10:19:51 +08:00
    直接重新 fetch ,重新 rebase 就好了
    leo108
        3
    leo108  
       2022-06-12 11:39:42 +08:00
    rebase -i ,在弹出的编辑框里把远端删掉的 commit 对应删除即可
    jeffh
        4
    jeffh  
       2022-06-12 17:10:50 +08:00
    你的操作是对的,并且建议合并远程时使用 git merge --squash ,rebase 有时候会有很多冲突,不如 merge 划算
    rosu
        5
    rosu  
       2022-06-12 17:12:42 +08:00
    感觉应该没有了,因为你总是要 pull master 的代码的。远端 reset 的情况下,本地相当于分叉了。

    题外话,为什么允许 master reset 后 force push ,这对团队其他人太不友好了。应该禁止 reset ,改为 revert 。
    closedevice
        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 ,方便后续操作;)
    FaiChou
        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
    FaiChou
        8
    FaiChou  
       2022-06-12 22:35:14 +08:00
    https://faichou.com/skip-some-commits-when-doing-merge/ 之前也遇到过类似问题, 找过几个方法.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3288 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:09 · PVG 22:09 · LAX 07:09 · JFK 10:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.