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

git/gitlab 如何取消 merge 的代码

  •  
  •   yujianwjj · 21 天前 · 2014 次点击

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

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

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

    当然,基础是一定要做好备份。
    guanzhangzhang
        13
    guanzhangzhang  
       21 天前
    reset
    rebase 后把 pick 换成 d
    上面俩任选其一 push -f

    或者可以 revert ,但是会多 commit
    nothingistrue
        14
    nothingistrue  
       21 天前
    留历史:git revert 不想要的那些提交。很简单的一个操作,GUI 都提供的,命令都不用打。
    洁癖:废了 dev_1.1 ,跳到 dev_1.2 。
    作死:reset --hard && push --force 。
    unco020511
        15
    unco020511  
       21 天前
    revert 或者 reset
    cirzear
        16
    cirzear  
       21 天前
    revert commit
    diagnostics
        17
    diagnostics  
       21 天前
    revert commit
    geelaw
        18
    geelaw  
       21 天前
    假设 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   ·   实用小工具   ·   1294 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:00 · PVG 02:00 · LAX 11:00 · JFK 14:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.