How to Remove Git Merge

Git

一些 Git 项目的操作规范,会禁止 Git Merge 的提交,而只允许使用 Git Rebase。以下列举一些可以去除 Git Merge 节点的操作思路。

Merge 节点在顶部

如果是最近的一个提交不小心产生了 Merge 节点,有几个方案可以参考:

  1. 可以撤销了重新用 Git Rebase 再来一次,不过坏处是可能需要重新处理一遍冲突(视情况可能会有很多次冲突处理要执行);
  2. 或者可以考虑先 git reset --soft <commit_id> 然后再重新提交,直接将所有新的改动压缩成一个 commit,不过缺点是历史 commit 信息都丢失了。

Merge 节点在中间

如果因为一些操作原因,在历史 Commit 中生成了 Merge 节点,可以考虑如下的方案去除。

首先,假设处理之前的 Git 分支如下:

A -> B -> C -> D -> M -> G -> HEAD
       \-> E -> F -/

那么,可以通过如下的命令去除 Merge 节点 M

git rebase F HEAD

这里的 F 节点是分支在 Merge 前的最后一个节点,而 Head 就是当前的最新节点。Rebase 完成之后,新的 Commit 顺序应该如下:

A -> B -> E -> F -> C -> D -> G -> HEAD

其中,A -> B -> E -> F 就是 Git Rebase 命令中到 F 点为止的整条路径,而后续的 C -> D -> G -> HEAD 就是剩下在这条路径上不存在的新节点。

可以通过如下的命令创建一个环境来手动试一试:

git init;
echo "A" > file.txt && git add -A && git commit -m "A";
echo "B" > file.txt && git add -A && git commit -m "B";
git checkout -b "new-branch";
echo "E" > file.txt && git add -A && git commit -m "E";
echo "F" > file.txt && git add -A && git commit -m "F";
git checkout -;
echo "C" > file.txt && git add -A && git commit -m "C";
echo "D" > file.txt && git add -A && git commit -m "D";
git merge new-branch;
echo "E" > file.txt && git add -A && git commit --no-edit;
echo "G" > file.txt && git add -A && git commit -m "G";

此时,只需要使用命令 git rebase new-branch HEAD 即可以去除 Merge 节点(当然,需要手动处理一些 Merge Conflict)。