git rebase 和 git merge 的区别

608 阅读2分钟

许多新手在学习GIT的时候, 对于 git rebase (变基) 和 git merge 比较难理解, 今天就对于这里两个进行 简单的说明

前提

所有的工作都是需要前提的, 我们的前提就是 得有一个项目不是?

  1. 创建一个空的项目juejin,并且git初始化git init, 这样我们就创建了一个新的仓库, 此时这个仓库里什么都没有;
  2. 创建一个README.md echo "hello world!" >> README.md
  3. 进行提交: git add README.md , git commit -m "add: hello world "

image.png

有了前提, 那么我们就要创建 一个 分支

创建分支并且切换分支 有两种:

  1. git checkout -b branch-a
  2. git switch -c branch-a

这样, 我们就有一个分支branch-a, 现在我们主要进行以下步骤:

  1. 分支上 进行 对内容修改, 并且提交
  2. 切换到 主干 上 对内容修改 并且提交

此时, 从下图中就可以看出, 两次不同分支的提交, 并且 他们都有一个共同的父级 (1c7c6a3a4b)

image.png

整合分支: (git merge)

  1. 切换到 主干 git switch/chekcout master
  2. 合并分支 git merge branch-a (会遇到冲突, 记得解决冲突再提交)

如下图, 可以看出 在 主干上重新 创建了一个 commit, 并且 它的 父级 变成了两个: 一个是 主干上的提交, 另一个是 分支上的提交; 这还是简单的一个项目, 如果是大型的项目, 创建N个分支, 然后进行 N次合并, 那么 交错复杂的线, 得多么的喜人; 其实很多的分支 不一定要 留着, 所以的 整合分支的 另一种 方式 git rebase(变基) 油然而生;

image.png

image.png (来自官方的图)

image.png

整合分支(git rebase )

为了简洁, 创建新的分支 branch-b, 并且再进行 主干 和 分支的 合并, 跟前面一样, 两次分支的提交,在 (9697deb7b8)提交记录上分叉,并且 分支提交的父级都是指向

image.png 下面进行整合分支:

  1. 切换到 分支上 git switch/checkout branch-a

  2. 变基 git rebase master, 此时就看到了, 刚刚的分叉, 变成了一根线,并且分支的提交记录的父级 指向了 主干的最近一次的提交记录上; image.png 仔细的读者,会发现, 此时的主干master还是停留在之前的提交上, 所以我们得将 主干master指向 最新的commit上

  3. git merge branch-b, 在这里其实就是 修改了master的引用指向,.git/refs/heads/master 或者 直接 git cat-file -p c4ed63d23 可以查看 指向

image.png

这样就完成了分支的合并, 并且没有那些错综复杂的线

image.png

image.png