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 · 3075 次点击
    这是一个创建于 380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当前版本是 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   ·   实用小工具   ·   5633 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:20 · PVG 14:20 · LAX 23:20 · JFK 02:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.