许多新手在学习GIT的时候, 对于 git rebase (变基) 和 git merge 比较难理解, 今天就对于这里两个进行 简单的说明
前提
所有的工作都是需要前提的, 我们的前提就是 得有一个项目不是?
- 创建一个空的项目juejin,并且git初始化
git init
, 这样我们就创建了一个新的仓库, 此时这个仓库里什么都没有; - 创建一个README.md
echo "hello world!" >> README.md
- 进行提交:
git add README.md , git commit -m "add: hello world "
有了前提, 那么我们就要创建 一个 分支
创建分支并且切换分支 有两种:
git checkout -b branch-a
git switch -c branch-a
这样, 我们就有一个分支branch-a, 现在我们主要进行以下步骤:
- 在 分支上 进行 对内容修改, 并且提交
- 切换到 主干 上 对内容修改 并且提交
此时, 从下图中就可以看出, 两次不同分支的提交, 并且 他们都有一个共同的父级 (1c7c6a3a4b)
整合分支: (git merge)
- 切换到 主干
git switch/chekcout master
- 合并分支
git merge branch-a
(会遇到冲突, 记得解决冲突再提交)
如下图, 可以看出 在 主干上重新 创建了一个 commit, 并且 它的 父级 变成了两个: 一个是 主干上的提交, 另一个是 分支上的提交; 这还是简单的一个项目, 如果是大型的项目, 创建N个分支, 然后进行 N次合并, 那么 交错复杂的线, 得多么的喜人; 其实很多的分支 不一定要 留着, 所以的 整合分支的 另一种 方式 git rebase
(变基) 油然而生;
(来自官方的图)
整合分支(git rebase )
为了简洁, 创建新的分支 branch-b, 并且再进行 主干 和 分支的 合并, 跟前面一样, 两次分支的提交,在 (9697deb7b8)提交记录上分叉,并且 分支提交的父级都是指向
下面进行整合分支:
-
切换到 分支上
git switch/checkout branch-a
-
变基
git rebase master
, 此时就看到了, 刚刚的分叉, 变成了一根线,并且分支的提交记录的父级 指向了 主干的最近一次的提交记录上; 仔细的读者,会发现, 此时的主干master还是停留在之前的提交上, 所以我们得将 主干master指向 最新的commit上 -
git merge branch-b
, 在这里其实就是 修改了master的引用指向,.git/refs/heads/master
或者 直接git cat-file -p c4ed63d23
可以查看 指向
这样就完成了分支的合并, 并且没有那些错综复杂的线