git/gitlab 如何取消 merge 的代码 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
yujianwjj
V2EX    git

git/gitlab 如何取消 merge 的代码

  •  
  •   yujianwjj 2024-05-27 09:59:27 +08:00 3454 次点击
    这是一个创建于 552 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当前版本是 1.0 ,现在团队在 dev_1.1 的分支上提交代码,但是因为一些原因,原计划的一些功能,不能在 1.1 版本上线,但是部分代码已经 merge 进了 dev_1.1 分支里面。这个时候一般怎么操作?

    18 条回复    2024-05-27 13:22:59 +08:00
    rlds
        1
    rlds  
       2024-05-27 10:03:43 +08:00
    回滚
    flyqie
        2
    flyqie  
       2024-05-27 10:03:58 +08:00 via Android
    手动 revert 那个 commit?
    rlds
        3
    rlds  
       2024-05-27 10:05:03 +08:00
    同时可以在了解下 cherry pick
    yujianwjj
        4
    yujianwjj  
    OP
       2024-05-27 10:10:54 +08:00
    cherry pick 要重新创建一个分支,然后才能 cherry pick ,现在是 dev_1.1 还是下个要上线的分支
    codeMore
        5
    codeMore  
       2024-05-27 10:15:59 +08:00
    如果部分已经合进去的代码是在提交的最后几次,那可以直接 reset --hard 到前面的提交,如果在中间,那从 1.0 版本创建出一个新分支叫 dev_1.1_new ,然后从 dev_1.1 里 cherry-pick 出需要的提交到 dev_1.1_new 咯,后面就上线 dev_1.1_new 咯
    chf007
        6
    chf007  
       2024-05-27 10:25:19 +08:00
    除了楼上的办法,如有系统或人工记录了特性分支,可以新建一个 dev_1.1 ,去掉不上的功能再合一遍么。这种最好有工具来完成。
    v2kt
        7
    v2kt  
       2024-05-27 10:28:32 +08:00
    git reflog 恢复
    Nazz
        8
    Nazz  
       2024-05-27 10:43:16 +08:00
    git reset --hard $hash && git push -f
    IamBack
        9
    IamBack  
       2024-05-27 11:00:53 +08:00
    git rebase -i 可以交互式的修改某些提交,将你想剔除的提交移动到最上面。
    然后再用楼上说的办法,reset --hard
    kucy
        10
    kucy  
       2024-05-27 11:45:37 +08:00
    从上一次提交,新建一个分支发到线上,这个分支就作为这次发布用一次
    crysislinux
        11
    crysislinux  
       2024-05-27 11:58:24 +08:00
    如果是新的功能,再添加个 feature toggle 把新功能关了好了。
    IMelon
        12
    IMelon  
       2024-05-27 12:07:22 +08:00
    git reset 或者 git revert 会撤销修改,但是有可能撤销你想要保存的部分,结合 cherry pick 能够恢复部分修改。

    因此我认为 git reset 用来撤销历史中的一段提交,再用 cherry pick 把想要的提交恢复过来。

    当然,基础是一定要做好备份。
    guanzhangzhang
        13
    guanzhangzhang  
       2024-05-27 12:22:29 +08:00
    reset
    rebase 后把 pick 换成 d
    上面俩任选其一 push -f

    或者可以 revert ,但是会多 commit
    nothingistrue
        14
    nothingistrue  
       2024-05-27 12:29:48 +08:00
    留历史:git revert 不想要的那些提交。很简单的一个操作,GUI 都提供的,命令都不用打。
    洁癖:废了 dev_1.1 ,跳到 dev_1.2 。
    作死:reset --hard && push --force 。
    unco020511
        15
    unco020511  
       2024-05-27 12:45:48 +08:00
    revert 或者 reset
    cirzear
        16
    cirzear  
       2024-05-27 12:52:54 +08:00
    revert commit
    diagnostics
        17
    diagnostics  
       2024-05-27 13:12:37 +08:00
    revert commit
    geelaw
        18
    geelaw  
       2024-05-27 13:22:59 +08:00
    假设 dev_1.1 是

    B -> C1 -> C2 -> C3 -> C4 -> C5 = dev_1.1

    并且假设 C2 、C4 要被撤销,那么

    git checkout -b new dev_1.1
    git revert --no-commit C4

    解决冲突,并 git add 好

    git revert --no-commit C2

    解决冲突,并 git add 好

    git commit --edit

    编辑消息,说明要暂缓某功能,并且实际操作是撤销了 C4 、C2 ,并记录冲突是如何解决的。

    git checkout -b dev_1.1_bak dev_1.1
    git merge -s ours --edit new

    编辑消息,说明这是为了恢复暂缓功能的代码,同时实现“当前 commit 是撤销后 commit 的后代”和“blame 可以得到正确历史记录”。

    git push
    git checkout dev_1.1
    git merge --ff-only new
    git push
    git branch -d new

    到此为止:

    - dev_1.1 是暂缓功能代码删去的状态
    - dev_1.1_bak 是没有删去的状态,且是 dev_1.1 的后代
    - 如果 dev_1.1 继续开发,可以在 dev_1.1_bak 上 merge dev_1.1 ,并且 merge 的时候不会删去暂缓功能的代码
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2509 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:01 PVG 18:01 LAX 02:01 JFK 05:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86