还不懂git rebase和git merge吗?? 一文读懂如何使用!!

git rebasegit merge都是Git中用于整合不同分支上的更改的命令,但它们在整合过程中的工作方式和结果有所不同。

git merge

  • 工作方式git merge命令会把两个分支的更改合并到一起,并在合并点创建一个新的“合并提交”(merge commit)。这个合并提交有两个父提交,分别指向合并前的两个分支的最新提交。
  • 结果:合并后的历史会保留分支的并行历史,因此可以看到一个分支历史中的合并点。
  • 适用场景:当你想保留项目历史的分支结构时,使用git merge是比较合适的。

git rebase

  • 工作方式git rebase命令会将一个分支上的一系列提交“移植”到另一个分支的顶端。它通过临时存储这些提交,然后将它们一个接一个地应用到目标分支上。
  • 结果:重演(rebase)之后的分支历史将变得线性,好像所有更改是按顺序一个接一个地发生的,没有并行分支的情况。
  • 适用场景:当你想要一个更清晰的无分叉的项目历史时,使用git rebase更合适。

主要区别

  • 历史线性git rebase会创造一个更加线性的历史,而git merge会保留历史中的分支合并点。
  • 冲突解决:在git rebase过程中可能需要解决冲突多次,因为每个提交都会被重新应用。而在git merge中,只需要解决一次冲突,即在合并提交时。
  • 历史改写git rebase实际上是在改写历史,因为它会创建新的提交哈希。这在共享分支上可能会导致问题,因为其他人的历史和你重演后的历史不同。而git merge不会改写历史。

使用建议

  • 不要在公共分支上使用git rebase,因为它会改变历史。在私有分支上使用git rebase可以保持历史的整洁。
  • 在公共分支上,使用git merge来整合更改,这样可以避免对其他协作者的工作产生影响。
  • 在决定使用哪种命令之前,需要考虑团队的工作流程和偏好。

举例说明

假设我们有一个名为 main 的主分支,和一个基于 main 分支创建的特性分支 feature。我们想要将 feature 分支上的改动整合回 main 分支。下面将分别展示使用 git mergegit rebase 的情况。

使用 git merge
  1. 初始状态,两个分支的提交历史如下:
A---B---C main
         
          D---E feature
  1. main 分支上执行 git merge feature 命令:
A---B---C-----------F main
                  /
          D---E---/ feature

在这个例子中,F 是一个新的合并提交,它将 feature 分支上的更改与 main 分支合并。提交历史中保留了分支结构。

使用 git rebase
  1. 初始状态,两个分支的提交历史如下:
A---B---C main
         
          D---E feature
  1. feature 分支上执行 git rebase main 命令:
D'---E' feature
             /
A---B---C---/ main

在这个例子中,D'E' 是重演(rebase)后的提交,它们在 main 分支的最新提交 C 之后。这样,feature 分支的历史看起来就像是直接从 main 分支的最新状态开始的。

  1. 然后切换回 main 分支并执行 git merge feature
A---B---C---D'---E' main

此时,main 分支上的历史是线性的,没有出现额外的合并提交。

总结

通过这个例子可以看出,使用 git merge 会保留一个明显的分支合并点,而使用 git rebase 则会创建一个更加线性的提交历史。选择哪种方式取决于你希望历史看起来如何,以及你的团队工作流程。