跳到主要内容

Git 合并冲突

如何将两个分支合并到一起。就是说我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线。

e.g

# 本地处理冲突: 
git fetch --all
git checkout temp-8f4fafc9-f-20220425-gcmxgz-test
git pull
git merge origin/test
# 处理冲突
git commit -am "fix: 解决冲突"
git push

检查冲突​

git diff --check

merge 合并原理​

合并的第一种方法 git merge。在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。

这里准备了两个分支,每个分支上各有一个独有的提交。这意味着没有一个分支包含了我们修改的所有内容。咱们通过合并这两个分支来解决这个问题。

我们要把 bugFix 合并到 master 里

首先,master 现在指向了一个拥有两个父节点的提交记录。假如从 master 开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。这意味着 master 包含了对代码库的所有修改。

这时再把 master 分支合并到 bugFix:

因为 master 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 master 所指向的那个提交记录。这表明每一个分支都包含了代码库的所有修改!

merge 合并流程​

  1. 创建新分支 bugFix

  2. 用 git checkout bugFix 命令切换到该分支

  3. 提交一次

  4. 用 git checkout master 切换回 master

  5. 再提交一次

  6. 用 git merge 把 bugFix 合并到 master

git checkout -b bugFix
git commit
git checkout master
git commit
git merge bugFix

Rebase 合并原理​

第二种合并分支的方法是 git rebase。Rebase 实际上就是取出一系列的提交记录,“复制” 它们,然后在另外一个地方逐个的放下去。

还是准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支)

我们想要把 bugFix 分支里的工作直接移到 master 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。

这里使用 git rebase 之后

# 注意这里的顺序不要反了,这里是 master 与 bugFix 合并的意思
# 一般就是旧的合并新的
git rebase master bugFix

# 但是也可以反过来,那就变成 master 分支在 bugFix 下面了
git rebase master bugFix

# 在第一条命令的基础上执行
git rebase master bugFix
# 可以让 master 分支也移动到 c3' 节点

现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更线性的提交序列。

注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 master 分支上的 C3 的副本。

现在我们切换到了 master 上然后把它 rebase 到 bugFix

由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。

Rebase 合并流程​

  1. 新建并切换到 bugFix 分支
  2. 提交一次
  3. 切换回 master 分支再提交一次
  4. 再次切换到 bugFix 分支,rebase 到 master 上