去除从某分支合入的所有代码 (多次合入, 一次去除)

153 阅读2分钟

背景

dev 分支和其他很多分支的代码多次无序合入到 qa 分支, 最后发现 dev 分支存在问题, 想从 qa 分支中撤销所有来自 dev 分支改动, 但不影响 qa 分支的其他代码。

实现

假设存在问题的分支是 dev, 已经合入到了 qa 分支, 需要从 qa 分支中去除 dev 分支合入的所有代码,操作步骤如下。 更新本地 master, 从 master 分支创建并切换到 master-temp, 把 dev 合并到 master-temp 并且强制创建一个合并提交记录, 在 master-temp 分支中对刚刚的合并提交执行 revert 操作,这样就能撤销 dev 分支的改动, 将 master-temp 分支合并到 qa 分支,这样 qa 分支就没有 dev 的改动(提交记录还在)。

回到 dev 分支执行 revert 操作 (对上一次的 revert 再次 revert),使 dev 分支恢复原来的状态,以便继续开发。

1. 更新本地 master

首先,确保本地的 master 分支是最新的。

git checkout master
git pull origin master

2. 把 master 合并到 dev

确保 dev 分支基于最新的 master 分支。这样可以避免冲突,并确保 dev 分支与 master 分支保持一致。

git checkout dev
git merge master

3. 创建临时 master 分支

创建一个临时的 master-temp 分支,作为合并 dev 改动的基础。

git checkout -b master-temp master

4. 把 dev 所有代码合并到 master-temp,并强制创建提交记录

dev 分支的所有更改合并到 master-temp,并强制生成合并提交记录。

git merge --no-ff dev -m "强制创建 merge"

此时,master-tempdev 分支的代码完全一致。

5. 获取当前分支最后一个提交的提交 ID,保存为 lastId

获取刚刚合并 dev 分支后的最后一个提交 ID,以备后续撤销操作。

git rev-parse HEAD

保存返回的提交 ID,例如:abc1234

6. 在 master-temp 中执行 revert 操作,撤销 dev 的改动

使用 git revert 命令撤销 dev 分支的改动。-m 1 表示保留 master-temp 的父提交,撤销 dev 分支的改动。

#git revert -m 1 ${lastId}
git revert -m 1 abc1234

7. 将 master-temp 合并到 dev 分支

回到 dev 分支,将 master-temp 合并进来,确保 dev 分支没有 dev 分支的改动 (因为所有改动已经 revert 了)。

git checkout dev
git merge master-temp

8. 将 dev 合并到 qa 分支

接下来,将 dev 分支合并到 qa 分支,这样 qa 分支就会包含最新的改动,但没有 dev 分支的改动 (提交记录都在, 但是代码撤回了)。

git checkout qa
git merge dev

9. 回到 dev 分支,获取最后一个提交的提交 ID,保存为 lastId

获取刚刚 revert 操作的提交 ID,以便在 dev 分支恢复之前的状态。

git checkout dev
git rev-parse HEAD

保存返回的提交 ID,例如:def5678

10. 在 dev 分支中执行 revert 操作,恢复原来的状态(对上一次的 revert 再一次 revert, 改动的代码就回来了)

使用 git revert 命令恢复 dev 分支之前的改动,使其恢复为合并前的状态,以便继续在 dev 分支开发。

#git revert ${lastId}
git revert def5678

11.最后删除 master-temp

git branch -D master-temp

最终,dev 分支中的所有改动都从 qa 分支中撤销了,而 dev 分支将继续保留历史记录,可以在开发完成后再次合并到 qa 分支。