参考,部分转载:https://yorkyu.cn/how-to-use-rebase-to-gracefully-fallback-code-08cdafe3d403.html
基本操作概念
- Git Revert
使用命令
git revert commit_id能产生一个 与commit_id完全相反的提交,即在 log 中会看到一条新的提交new_commit_id, revert 提交就是删除commit_id的提交。 - Git Reset
reset也能使代码回到某次提交,但跟 revert 不同的是, reset 是将提交的HEAD指针指到某次提交,之后的提交记录会消失,就像从没有过这么一次提交 - Get Rebase
rebase是“变基”的意思,这里的“基”,指[多次] commit 形成的 git workflow,使用 rebase,我们可以改变这些历史提交,修改 commit 信息,将多个 commit 进行组合。
Rebase+Revert回退
- 切出一个新分支
feature1首先,切出一个新分支feature1,使用 git log 查询一下要回退到的commit 版本commit_n。 feature1分支执行命令 git rebase -i commit_nfeature1合并 commit2 ~ commit4 到最旧的 commit1 上 在合并 commit 时,我们可以选择 pick(p) 最旧的 commit1,然后在后续的 commit_xxx 前添加 squash(s) 命令,将这些 commits 都合并到最旧的 commit1 上。pick 6fa5869 commit1 squash 0b84ee7 commit2 squash 986c6c8 commit3 squash 91a0dcc commit4feature1合并提交记录# 执行rebase 生成的新记录 commit 5 # 回退代码的版本号 commit_nfeature1合并master到feature1
由于feature1分支落后与master分支,因此需要执行git merge master将master分支向feature1分支合并。 合并后 git 会发现commit1到commit4提交的内容和feature1分支上commit5的修改内容是完全相同的,会自动进行合并,内容不变,但多了一个 commit5。# feature1 分支 commit 5 commit 4 commit 3 commit 2 commit 1 # 回退代码的版本号 commit_nfeature1分支执行 revert 反提交
在feature1分支上对commit5进行一次revert反提交,就实现了把commit1到commit4的提交全部回退。即撤回步骤5中的合并。git revert commit_5 # 执行rebase 生成的新记录 commit 5 # 回退代码的版本号 commit_nmaster分支执行合并feature1到master
master代码回退,但保留了commit_n, 1,2,3,4,5所有记录# 切回到 master $ git checkout master # 合并 feature1 $ git merge feature1