git rebase 和 git merge 的使用方法和使用场景
git merge 介绍
merge 操作会将两个或多个分支的开发历史合并在一起,并保留所有分支的提交记录,同时还会增加一个合并提交(merge commit)来表示合并操作的完成。
merge 的基本语法是:git merge <branch>
假设有如下的 fix 和 master 分支,以及 commit 历史:
A --- B --- C fix
/
D --- E --- F --- G master
此时,你希望将 fix 分支最新的代码合并到 master 分支。
你可以在 master 分支上运行 git merge fix 命令。
这将会把 fix 分支的提交内容(自从它与当前分支分离以来的所有提交)合并到 master 分支。
这之后 commit 历史会变成:
A --- B --- C fix
/ \
D --- E --- F --- G --- H master
master 分支的 commit 历史会增加一个新的合并提交记录 H。
H 提交记录里会包含所有 fix 分支中的 A, B 和 C 提交记录。
不适合使用 git merge 的场景
在使用 git merge 时,合并操作会保留分支的所有提交记录,并增加一个合并提交,这在公共分支是很好的合并策略。
但是如果用在私人分支或未共享的分支就很容易出现问题。
假设有如下的 feature 和 master 分支,以及 commit 历史:
D --- E --- F --- G master
\
A --- B feature
在你开发 feature 分支的时候,master 分支被更新了两次。
在将 feature 分支的代码提交到 develop 分支并提交测试之前,为了保持代码一致性,你需要先将 master 分支最新的代码合并到 feature 分支。
此时如果你继续使用 git merge 来处理,commit 历史会变成:
D --- E --- F --- G master
\ \
A --- B --- H feature
即 feature 分支上的提交记录会变成:
A --- B --- H(包含了 F 和 G) feature
H 提交记录中包含了 master 分支最新的提交内容,即 F 和 G。
代码合并成功后,我们再将 feature 分支的代码用 git merge 合并到公共分支 develop。
提交记录会变成:
D --- E --- F --- G master
\ \
A --- B --- H feature
\
X --- Y --- Z ----------- M develop
develop 分支增加了一个 M 提交记录,且 M 提交记录里会包含 feature 分支的所有提交记录(A、B 和 H),而 H 提交记录里又包含了 master 分支的 F 和 G 提交记录。
在该例子的 commit 数量只有两三次的情况下,仅仅两步 merge 之后,各个分支的 Git 提交记录就变得如此复杂。
如果 commit 增多,merge 的次数增多,这会给我们审查代码,以及之后调试和回溯代码造成很大的困难。
我曾遇到过,commit 数量超过 200 个的 MR,而这就是其 merge 了主分支的最新代码导致的。
所以去掉多余的提交记录,让提交历史保持干净非常重要。
不仅让我们审查代码时能更轻松,也能在之后调试和回溯代码时能更容易理解代码的演变过程。