Git 回滚、重置与变基
回滚
提交回滚(Revert) 提交回滚会创建一个新的提交,这个提交的作用是撤销指定的提交。它不会改变已有的提交历史,因此在公共分支上使用是安全的。
示例 假设你的提交历史如下:
A---B---C---D---E main
你想回滚提交 D 和 E。
查看提交历史:
git log
找到你要回滚的提交。
回滚最近的两个提交:
git revert HEAD~1 git revert HEAD~1
这会创建两个新的提交 R1 和 R2,分别撤销 E 和 D。提交历史变为:
A---B---C---D---E---R1---R2 main
重置
重置(Reset) 重置操作会直接改变提交历史,可以删除或移动提交。重置操作有三种模式:--soft、--mixed 和 --hard。
- soft:只移动 HEAD 指针,保留工作目录和暂存区的更改。
- mixed(默认):移动 HEAD 指针并重置暂存区,保留工作目录的更改。
- hard:移动 HEAD 指针并重置暂存区和工作目录的更改。
示例 假设你的提交历史如下:
A---B---C---D---E main
你想重置到提交 C。
查看提交历史:
git log
找到提交 C 的哈希值。
重置到提交 C:
git reset --hard <commit_hash_of_C>
这会将 main 分支重置到提交 C,提交历史变为:
A---B---C main
提交 D 和 E 以及它们的更改将被丢弃。
回滚和重置的区别
提交回滚:
- 创建新的提交来撤销指定的提交。
- 不改变已有的提交历史。
- 安全用于公共分支。
重置:
- 直接改变提交历史,可以删除或移动提交。
- 有三种模式(--soft、--mixed、--hard),影响工作目录和暂存区。
- 不适用于已经推送到远程仓库的公共分支,因为会重写历史,可能导致其他开发者的提交失效。
选择适用场景
- 公共分支:使用提交回滚,因为它不会改变提交历史,对其他开发者的工作没有影响。
- 本地分支:可以使用重置,特别是在你需要清理提交历史或撤销一系列提交时。
变基
变基(Rebase)是 Git 中的一种操作,用于将一个分支的变化移动到另一个基点之上。变基的主要目的是保持历史记录的整洁和线性,避免因为合并(merge)操作而产生的多余分支和合并提交。
变基的用途
保持历史记录的线性:
变基可以将分支的提交历史重新应用到另一个基点,使得提交历史看起来更加线性和整洁。例如,当你在一个分支上开发新功能时,可以使用变基将这个分支的提交应用到最新的主分支之上。
解决冲突: 在变基过程中,可以逐个提交地解决冲突,而不是在一次合并中解决所有冲突。这有助于更细粒度地处理冲突。
变基的基本用法
假设你有一个分支 feature,你想将它的提交变基到 main 分支的最新提交之上。可以按照以下步骤操作:
切换到 feature 分支:
git checkout feature
执行变基操作:
git rebase main
这会将 feature 分支上的提交重新应用到 main 分支的最新提交之上。
变基的示例
假设你的提交历史如下:
A---B---C main
\
D---E feature
执行 git rebase main 后,历史会变成:
A---B---C main
\
D'---E' feature
处理冲突
在变基过程中,如果遇到冲突,Git 会暂停变基并提示你解决冲突。你需要手动解决冲突,然后继续变基:
解决冲突并标记为已解决:
git add <冲突文件>
继续变基:
git rebase --continue
如果你想中止变基,可以使用以下命令:
git rebase --abort
变基 vs 合并
- 变基:将一个分支的提交移动到另一个基点之上,保持历史记录的线性。
- 合并:将两个分支的提交合并在一起,保留两者的历史记录,可能会产生合并提交。
注意事项
- 避免在公共分支上变基:因为变基会重写提交历史,如果其他人已经基于这些提交进行开发,变基会导致他们的提交失效。因此,变基通常用于本地分支或未共享的分支。
- 安全的变基:对于公共分支,使用 git merge 更安全,因为它不会重写提交历史。 通过变基,你可以保持提交历史的整洁和线性,使得代码库更易于理解和维护。