git中的rebase操作

本文介绍如何使用Git rebase命令将master分支的错误修复同步到feature分支,以避免重复错误。同时讨论了rebase操作可能带来的问题及注意事项。

假设你在你的项目master分支上(我们只显示最后4个提交):

640?wx_fmt=png&wxfrom=5&wx_lazy=1

 

现在你想在不同的分支上开发一些很酷的新功能,所以你创建一个git checkout -b feature分支并进行两次提交。现在你master和feature分支看起来是这样的:

 

640?wx_fmt=png

 

但是现在有人告诉你你的应用程序存在一个bug,并且你很快就会将你的分支(checkout)切换到你master分支来查找并修复这个bug。一段时间后,您修复它并推送(并部署)更改。你可以回到你的feature分支。

 

640?wx_fmt=png

 

但是现在你意识到你有一个小问题。您的feature分支仍然存在您在master分支上修复的相同错误,并且您意识到该错误也会影响feature分支上的新代码,因此您需要将这些错误修复(提交)合并到feature分支中。但是该如何?在做feature分支之前进行错误修复。这样,具有修复代码的提交在feature分支中。你用rebase命令来做。所以,如果你在你的feature分支,你会这样做:

 

git rebase master

这就是你的分支会如何看起来像之后的样子:

640?wx_fmt=png

 

 

如你所见,feature分支的历史已经改变。如果有人现在看它,认为你feature在错误修复提交后制作了你的分支。

 

所以这很好?但有一个问题。git rebase会改变git的提交记录,但不用担心,你的代码将保持不变,只有feature分支上的提交的提交记录会改变。这些提交记录是什么?git log,你可能会注意到,当你这样做时,你看到每个提交都有40个字符的长字符串:

 

commit f5cad47722bc98419fe5037753f5bbe29d3917c4
Author: John Doe <john@doe.com>
Date:   Mon Apr 23 11:49:07 2018 +0200

 

如果提交之前提交记录是这样的:

 

640?wx_fmt=png

 

然后在rebase之后,feature分支上的提交记录会改变:

640?wx_fmt=png

 

这就是为什么你一直听到git rebase是一个危险的命令。因为它改变了历史,你应该谨慎使用它。

 

但为什么这是危险的?那么,让我们假设你不是唯一一个在这个feature分支上工作的人,但是有更多的人在对它进行改变。现在你可以写你的代码将更改推送到feature远程。现在,当你的同事试图从远端拉动时feature,这个时候会发生代码冲突,因为他的本地feature分支版本的历史与远端版本不同。

 

640?wx_fmt=png

 

所以同事代码冲突,但是他没有好的办法来解决这个问题。所以,如果您在本地分支上工作,并且尚未将其推送到远程服务器,或者您做了,但仍然只有您在该分支上工作的您,那么你可以使用rebase。

在使用 `git rebase` 时,如果过程中断(例如因为合并冲突、手动暂停或意外退出),你可以根据当前的状态选择继续、解决冲突或取消操作。以下是详细的解决方案和步骤说明。 --- ### ✅ 情况一:rebase 中因冲突中断,想要解决后继续 当执行 `git rebase` 时出现冲突,Git 会停止并提示你解决冲突。此时可以按以下步骤继续: ```bash # 1. 查看冲突文件(Git 会列出未合并的路径) git status # 2. 手动编辑冲突文件,解决冲突 # 冲突部分形如: # <<<<<<< HEAD # 当前分支代码 # ======= # 即将合并进来的提交代码 # >>>>>>> commit-hash # 3. 标记冲突已解决(add 文件) git add <file-name> # 或 git add . # 4. 继续 rebase 过程 git rebase --continue ``` ✅ **解释**: - `git rebase --continue` 会应用当前中断的提交,并继续后续的提交。 - 如果还有更多冲突,重复上述过程。 --- ### ✅ 情况二:想跳过当前提交(不推荐,除非必要) 如果你不想处理某个提交的冲突,可以跳过它(相当于丢弃该提交): ```bash git rebase --skip ``` ⚠️ 注意:`--skip` 可能导致数据丢失,仅在明确知道后果时使用。 --- ### ✅ 情况三:想取消整个 rebase 操作 如果 rebase 出错太多,想回到 rebase 前的状态: ```bash git rebase --abort ``` ✅ **解释**: - 此命令会完全终止 rebase,并恢复到 rebase 开始前的状态。 - 是最安全的“后悔药”。 --- ### ✅ 情况四:rebase 被意外中断(如终端崩溃) Git 通常会保留 rebase 状态。重新打开终端后,运行: ```bash git status ``` 如果看到类似: ``` You are currently rebasing branch 'feature' on 'abc1234' ``` 说明 rebase 仍在进行中,你可以: - 解决冲突 → `git add .` → `git rebase --continue` - 或直接放弃 → `git rebase --abort` --- ### ✅ 高级技巧:交互式 rebase 中断后继续 如果你在运行 `git rebase -i HEAD~3` 后修改了提交,但中途退出编辑器或保存失败: - Git 可能不会启动 rebase,需确保正确保存并关闭编辑器。 - 若已经开始但中断,处理方式同上:解决冲突后 `--continue`,或 `--abort`。 --- ### ✅ 如何避免 rebase 中断问题? 1. **备份分支**: ```bash git branch backup-before-rebase ``` 2. **小步操作**:不要一次性 rebase 太多提交。 3. **使用可视化工具**:如 `git mergetool` 辅助解决冲突。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值