由于某种原因,生产环境的某个功能需要撤掉,但是别的功能已经基于 master 分支开发挺远的了,现在 master 回退倒是好办,难的是基于那个点的 master 分支开发的 feature 分支怎么撤掉那个功能,并且保留现有代码?
目前我想到的方案是: 重新从回退后的 master 分支新开一个分支 A,然后通过 cherry-pick 将在 feature 分支上的 commit 在新分支 A 应用一次。但是 commit 已经较多了,所以这个方案比较笨。
git 有没有类似分支做集合运算的功能:new_feature = old_feature - new_master ?
1
takeoffyoung 2018-11-16 23:24:18 +08:00
git revert 有什么需求不能满足吗?
|
2
xyz1001 2018-11-16 23:28:09 +08:00 via Android 1
git rebase -i master,将不需要的 commit 标记为 drop
|
3
mcfog 2018-11-16 23:31:13 +08:00 via Android
你把 master 搞定以后别的分支 merge master 不就好了
|
4
chinvo 2018-11-16 23:35:03 +08:00 via iPhone 1
master 上 revert,别的分支 merge 进去的时候会符合的,如果有冲突人工处理下
|
5
0xABCD OP |
6
oott123 2018-11-17 00:30:01 +08:00
https://harttle.land/2018/03/13/remove-certain-commits-from-history.html#header-3
|
7
Arnie97 2018-11-17 00:59:12 +08:00 via Android
二楼正解,不再复述
|
8
mcfog 2018-11-17 08:28:08 +08:00 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 2018-11-17 08:52:29 +08:00
master revert, feature 分支 rebase 下
|
10
wweir 2018-11-17 15:04:47 +08:00 via Android
1、基于 master 新建临时分支
2、reset master 到刚合并需要回滚代码的状态 3、revert master 上不需要的 commit 4、merge 临时分支 |
12
msg7086 2018-11-17 16:20:12 +08:00
我们的习惯是 force push 一把梭。如果你们玩 Git 还没熟到能承受一把梭的话,就只能把整个更改集 revert 掉以后把别的分支 rebase 一下。如果你们还没熟到能承受 rebase 的话,就只能把 revert commit 给 cherry pick 进 feature 了。
简单说,看你们 Git 玩得 6 不 6,以及对 Git history 的洁癖程度有多高。 |