V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
0xABCD
V2EX  ›  程序员

Git master 分支需要回退怎么办?

  •  1
     
  •   0xABCD · 2018-11-16 23:19:25 +08:00 · 6366 次点击
    这是一个创建于 2227 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于某种原因,生产环境的某个功能需要撤掉,但是别的功能已经基于 master 分支开发挺远的了,现在 master 回退倒是好办,难的是基于那个点的 master 分支开发的 feature 分支怎么撤掉那个功能,并且保留现有代码?

    目前我想到的方案是: 重新从回退后的 master 分支新开一个分支 A,然后通过 cherry-pick 将在 feature 分支上的 commit 在新分支 A 应用一次。但是 commit 已经较多了,所以这个方案比较笨。

    git 有没有类似分支做集合运算的功能:new_feature = old_feature - new_master ?

    12 条回复    2018-11-17 16:20:12 +08:00
    takeoffyoung
        1
    takeoffyoung  
       2018-11-16 23:24:18 +08:00
    git revert 有什么需求不能满足吗?
    xyz1001
        2
    xyz1001  
       2018-11-16 23:28:09 +08:00 via Android   ❤️ 1
    git rebase -i master,将不需要的 commit 标记为 drop
    mcfog
        3
    mcfog  
       2018-11-16 23:31:13 +08:00 via Android
    你把 master 搞定以后别的分支 merge master 不就好了
    chinvo
        4
    chinvo  
       2018-11-16 23:35:03 +08:00 via iPhone   ❤️ 1
    master 上 revert,别的分支 merge 进去的时候会符合的,如果有冲突人工处理下
    0xABCD
        5
    0xABCD  
    OP
       2018-11-16 23:50:03 +08:00
    @takeoffyoung @xyz1001 @mcfog @chinvo commit 有点多哦,一个一个 revert 有点麻烦,主要是想问一下有没有更便捷的方案类似集合运算那种,谢谢回复
    oott123
        6
    oott123  
       2018-11-17 00:30:01 +08:00
    https://harttle.land/2018/03/13/remove-certain-commits-from-history.html#header-3
    Arnie97
        7
    Arnie97  
       2018-11-17 00:59:12 +08:00 via Android
    二楼正解,不再复述
    mcfog
        8
    mcfog  
       2018-11-17 08:28:08 +08:00 via Android   ❤️ 1
    @0xABCD 要干掉的功能不是独立一个分支?的话没救了只能手动

    独立的话,revert merge commit 一个应该就好了吧
    就算不行,也可以这样手动生成:
    1. 在 master 分支被合并之前的最新分支记个 branch 叫 tmp (或者 copy 下 hash 也可以)
    2. checkout 不要的那个 feature branch,rebase 到 tmp,用 squash 压缩成一个,过程要解决的冲突应该和 merge 是一样的,原样解决
    3. revert 刚刚 rebase 形成的一个 commit
    4. 你应该还在 feature branch,checkout 最新 master,Cherry pick 你在 feature branch 刚才 revert 形成的 commit

    不管我的做法对不对或者你看没看懂,劝你不要改变已经被 push 的历史,除非你和你的团队所有人都明白这里面的道理
    quinoa42
        9
    quinoa42  
       2018-11-17 08:52:29 +08:00
    master revert, feature 分支 rebase 下
    wweir
        10
    wweir  
       2018-11-17 15:04:47 +08:00 via Android
    1、基于 master 新建临时分支
    2、reset master 到刚合并需要回滚代码的状态
    3、revert master 上不需要的 commit
    4、merge 临时分支
    wweir
        11
    wweir  
       2018-11-17 15:06:24 +08:00 via Android
    @wweir 这么一套复杂操作的好处是 可以保留所有 commit 记录
    msg7086
        12
    msg7086  
       2018-11-17 16:20:12 +08:00
    我们的习惯是 force push 一把梭。如果你们玩 Git 还没熟到能承受一把梭的话,就只能把整个更改集 revert 掉以后把别的分支 rebase 一下。如果你们还没熟到能承受 rebase 的话,就只能把 revert commit 给 cherry pick 进 feature 了。

    简单说,看你们 Git 玩得 6 不 6,以及对 Git history 的洁癖程度有多高。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1448 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:15 · PVG 01:15 · LAX 09:15 · JFK 12:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.