Skip to main content

git merge 和 git rebase

SewenAugust 14, 2024About 8 min

git merge 和 git rebase

git rebase

git rebase 是 Git 版本控制系统中一个非常强大的命令,它用于将一系列的提交(commits)重新应用到另一个基点上。这个命令在整理项目历史、将特性分支(feature branch)合并到主分支(如 master 或 main)之前清理其历史等方面非常有用。与 git merge 不同,git rebase 并不是通过创建一个新的合并提交(merge commit)来合并两个分支的历史,而是通过创建一个新的提交序列,这个序列是将分支上的变更“重新播放”到另一个分支的顶部得到的。

基本用法

假设你有两个分支:master 和 feature,你想要将 feature 分支上的变更合并到 master 分支,但你想以 master 分支的最新状态为基准来应用这些变更。

首先,确保你处于 feature 分支上:

git checkout feature

将 feature 分支的变更重新基于 master 分支的最新状态进行应用:

git rebase master

这个命令会尝试将 feature 分支上从与 master 分支分叉点开始的所有变更,重新应用到 master 分支的最新提交之上。如果 master 分支在你开始 rebase 操作之后又有新的提交,Git 会尝试智能地解决任何冲突(如果有的话)。

注意事项

优点

缺点

git rebase 和 git merge 区别

git rebasegit merge 都是 Git 版本控制系统中用于合并分支的命令,但它们在工作方式和结果上存在一些显著的区别。

一、合并历史记录的方式

二、修改历史记录的能力

三、处理冲突的方式

四、使用场景

git rebase 应用场景

场景

在使用 Git TBD 的模式管理分支,并且以main分支作为主干分支

现在我以 main 分支作为基础分出切出一个 dev 分支进行功能开发,开发完成后,我需要将 dev 分支上的提交记录 rebase 到 main分支中

在使用 Git 进行版本控制时,当你从主分支(如 main)切出一个开发分支(如 dev)进行功能开发,并在开发完成后希望将这些改动以更清晰的方式合并回主分支时,使用 rebase 是一个很好的选择。rebase 会将 dev 分支上的更改重新“基于” main 分支的最新状态应用,这样可以保持项目历史的线性,让提交历史更加清晰。

以下是具体的操作步骤:

1. 确保你处于 dev 分支

首先,确保你当前位于 dev 分支上。你可以通过以下命令查看当前分支,并切换到 dev 分支(如果不在该分支上):

git status  # 查看当前分支  
git checkout dev  # 切换到 dev 分支

2. 确保 main 分支是最新的

在将 dev 分支的更改 rebase 到 main 之前,你应该确保 main 分支是最新的。这通常意味着你需要从远程仓库拉取最新的更改。

git checkout main  # 切换到 main 分支  
git pull origin main  # 从远程仓库拉取 main 分支的最新更改  
git checkout dev  # 切换回 dev 分支

3. 使用 rebasedev 分支的更改应用到 main

现在,你可以使用 rebase 命令将 dev 分支的更改重新基于 main 分支的最新状态。这将“重放” dev 分支上的每个提交,但是每个提交都会被放置到 main 分支的顶端。

bash复制代码

git rebase main

4. 解决可能出现的冲突

在 rebase 过程中,可能会遇到冲突。如果发生冲突,Git 会暂停 rebase 过程,并让你解决这些冲突。你需要手动编辑冲突的文件,然后执行以下命令来标记冲突已解决:

git add <conflicted-file>  # 添加已解决冲突的文件  
git rebase --continue  # 继续 rebase 过程

如果解决冲突后你想放弃 rebase,可以使用 git rebase --abort

5. 推送 dev 分支到远程仓库(如果需要)

如果你的团队成员正在使用相同的远程仓库,并且你也希望他们看到你的 rebase 更改,你需要将更新后的 dev 分支推送到远程仓库。注意,由于你已经改变了 dev 分支的历史,所以在推送时可能需要使用 --force(或 --force-with-lease,更安全)选项来覆盖远程分支上的历史。

bash复制代码

git push origin dev --force-with-lease

6. 将 dev 分支的更改合并到 main(可选)

如果你的团队决定 dev 分支上的更改已准备好合并到 main,你现在可以使用一个快速的合并(因为 dev 已经基于 main rebase 过,所以不会产生复杂的合并提交):

git checkout main  
git merge dev  
git push origin main

这就是将 dev 分支的更改 rebase 到 main 分支上的整个过程。

参考资料

git rebase VS git merge? 更优雅的 git 合并方式值得拥有 - 日拱一兵 - 博客园 (cnblogs.com)