git/gitlab 如何取消 merge 的代码

2024-05-27 09:59:27 +08:00
 yujianwjj

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

3242 次点击
所在节点    git
18 条回复
rlds
2024-05-27 10:03:43 +08:00
回滚
flyqie
2024-05-27 10:03:58 +08:00
手动 revert 那个 commit?
rlds
2024-05-27 10:05:03 +08:00
同时可以在了解下 cherry pick
yujianwjj
2024-05-27 10:10:54 +08:00
cherry pick 要重新创建一个分支,然后才能 cherry pick ,现在是 dev_1.1 还是下个要上线的分支
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
2024-05-27 10:25:19 +08:00
除了楼上的办法,如果有系统或人工记录了特性分支,可以新建一个 dev_1.1 ,去掉不上的功能再合一遍么。这种最好有工具来完成。
v2kt
2024-05-27 10:28:32 +08:00
git reflog 恢复
Nazz
2024-05-27 10:43:16 +08:00
git reset --hard $hash && git push -f
IamBack
2024-05-27 11:00:53 +08:00
git rebase -i 可以交互式的修改某些提交,将你想剔除的提交移动到最上面。
然后再用楼上说的办法,reset --hard
kucy
2024-05-27 11:45:37 +08:00
从上一次提交,新建一个分支发到线上,这个分支就作为这次发布用一次
crysislinux
2024-05-27 11:58:24 +08:00
如果是新的功能,再添加个 feature toggle 把新功能关了好了。
IMelon
2024-05-27 12:07:22 +08:00
git reset 或者 git revert 会撤销修改,但是有可能撤销你想要保存的部分,结合 cherry pick 能够恢复部分修改。

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

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

或者可以 revert ,但是会多 commit
nothingistrue
2024-05-27 12:29:48 +08:00
留历史:git revert 不想要的那些提交。很简单的一个操作,GUI 都提供的,命令都不用打。
洁癖:废了 dev_1.1 ,跳到 dev_1.2 。
作死:reset --hard && push --force 。
unco020511
2024-05-27 12:45:48 +08:00
revert 或者 reset
cirzear
2024-05-27 12:52:54 +08:00
revert commit
diagnostics
2024-05-27 13:12:37 +08:00
revert commit
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 的时候不会删去暂缓功能的代码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1044197

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX