如何使用 Git Rebase 优雅回退代码?
- 作者:约克
- 原文地址:
- 文章版权归作者所有,转载请注明出处!
背景
本文首先对常用的 Revert,Reset 回退代码命令进行了讲解。希望可以讲明白它们的弊端。最后介绍如何使用 Rebase 优雅回退代码。
一. Revert 回退代码
1.1. 命令描述
1.2. 命令使用
# 查看提交记录
$ git log -p
# 回退某个提交
$ git revert commit_id
# 取消执行回退
$ git revert --abort
# revert merge commit
# 一般来说,如果在 master 上 merge a_branch,那么 parent 1 就是 master,parent 2就是 a_branch。
# git revert merge_commit_id -m parent
$ git revert b7b7b87d5d05a22ad1e7779484bcf82e31041a72 -m 1
1.3. 使用场景分析
场景1 :提交次数多,中途还有几次从其他分支的 merge 操作。
要完成从 C 版本到 N 版本的 revert,需要倒序执行 revert 操作几十次,如果其中顺序错了一次,最终结果可能就是不对的。
场景2 :在进行代码 merge 时,也会把 merge 信息产生一次新的提交,而 revert 这次 merge commit 时需要指定 m 参数,以指定
mainline
。二. Reset 回退代码
2.1. 命令描述
reset
也能使代码回到某次提交,但跟revert
不同的是,reset
是将提交的HEAD
指针指到某次提交,之后的提交记录会消失,就像从没有过这么一次提交。2.2. 命令使用
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变 $ git reset [file] # 重置暂存区与工作区,与上一次commit保持一致 $ git reset --hard # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变 $ git reset [commit] # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致 $ git reset --hard [commit] # 重置当前HEAD为指定commit,但保持暂存区和工作区不变 $ git reset --keep [commit]
2.3. 使用场景分析
场景1 :使用 feature 分支开发,在 feature 分支上将代码回退到某次提交后。将其合并到 develop 分支时却被提示报错。
这是因为 feature 分支回退提交后,在 git 的 workflow 里,feature 分支是落后于 develop 分支。
场景2 :在 master 分支上执行 reset,使用 –hard 选项完全抛弃这些旧代码,reset 后再强制推到远端
三. Rebase 回退代码
3.1. 命令描述
3.2. 命令使用
# 执行变基 $ git rebase -i commit_n # 终止变更 $ git rebase --abort
3.2. 回退代码步骤
2). 执行命令
git rebase -i commit_n
-i
指定交互模式后,会打开git rebase
编辑界面。$ git rebase -i fa1b56d920e636914b6ef27988358ff122279261
pick 6fa5869 commit1 pick 0b84ee7 commit2 pick 986c6c8 commit3 pick 91a0dcc commit4
pick 6fa5869 commit1 squash 0b84ee7 commit2 squash 986c6c8 commit3 squash 91a0dcc commit4