首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
拉勾
V2EX  ›  程序员

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

  •  1
     
  •   0xABCD · 123 天前 · 1959 次点击
    这是一个创建于 123 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于某种原因,生产环境的某个功能需要撤掉,但是别的功能已经基于 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
        1
    takeoffyoung   123 天前
    git revert 有什么需求不能满足吗?
        2
    xyz1001   123 天前 via Android   ♥ 1
    git rebase -i master,将不需要的 commit 标记为 drop
        3
    mcfog   123 天前 via Android
    你把 master 搞定以后别的分支 merge master 不就好了
        4
    chinvo   123 天前 via iPhone   ♥ 1
    master 上 revert,别的分支 merge 进去的时候会符合的,如果有冲突人工处理下
        5
    0xABCD   123 天前
    @takeoffyoung @xyz1001 @mcfog @chinvo commit 有点多哦,一个一个 revert 有点麻烦,主要是想问一下有没有更便捷的方案类似集合运算那种,谢谢回复
        6
    oott123   123 天前
    https://harttle.land/2018/03/13/remove-certain-commits-from-history.html#header-3
        7
    Arnie97   123 天前 via Android
    二楼正解,不再复述
        8
    mcfog   123 天前 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 的历史,除非你和你的团队所有人都明白这里面的道理
        9
    quinoa42   123 天前
    master revert, feature 分支 rebase 下
        10
    wweir   122 天前 via Android
    1、基于 master 新建临时分支
    2、reset master 到刚合并需要回滚代码的状态
    3、revert master 上不需要的 commit
    4、merge 临时分支
        11
    wweir   122 天前 via Android
    @wweir 这么一套复杂操作的好处是 可以保留所有 commit 记录
        12
    msg7086   122 天前
    我们的习惯是 force push 一把梭。如果你们玩 Git 还没熟到能承受一把梭的话,就只能把整个更改集 revert 掉以后把别的分支 rebase 一下。如果你们还没熟到能承受 rebase 的话,就只能把 revert commit 给 cherry pick 进 feature 了。

    简单说,看你们 Git 玩得 6 不 6,以及对 Git history 的洁癖程度有多高。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2903 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 01:03 · PVG 09:03 · LAX 18:03 · JFK 21:03
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1