背景
为简化讲解我们假设只有两个分支 dev和master 一个开发分支 一个线上分支 ,背景是dev错误的合并到了master并且已经push到了远程仓库,我们要实现的效果是 回滚master上的代码 ,并且回到dev改正bug后继续合并到master上线
场景还原
# 初始化master分支 并推送到远程
echo '初始化' >> readme.txt
git add .
git commit -m '项目初始化'
git remote add origin ssh://git@127.0.0.1/root/git-test.git
git push origin -u --all
## 切出来新的dev分支 并进行修改提交 合并到maser
git checkout -b dev
echo '错误的修改' >> readme.txt
git add .
git commit -m 'dev分支的提交'
git checkout master
git merge dev
git push
git log --oneline
此时master分支上有两次提交记录 最初的和我们再dev上弄的错误的修改
8f5f2b (HEAD -> master, origin/master, dev) dev分支的修改
87f168f 项目初始化
还原处理
好,下面我们就在这个场景下进行代码的回退处理,用的是 revert这个命令 ,git的本质就是记录一个个的提交记录,每个提交记录都有记录你改动过的文件快照,而revert是产生一个反向的提交记录,形成对冲的效果,把你想撤回的提交通过一个新的提交给覆盖掉,简单说就是他总跟你反着干,你增加一行 他就减少一行 你改了一行 他就还原那一行
# 这里我们revert跟的id就是那次合并分支对应的提交记录id
git revert d8f5f2b
# 分别看一下master的日志和dev的日志
git log --oneline
git checkout dev
git log --oneline
master的日志 多了一条revert记录
4cefdf4 (HEAD -> master) Revert "dev分支的修改"
d8f5f2b (origin/master, dev) dev分支的修改
87f168f 项目初始化
dev的日志 还是之前的两条
d8f5f2b (HEAD -> dev, origin/master) dev分支的修改
87f168f 项目初始化
这个时刻 我们看 master上的代码虽然回退了,但是在git的角度去看 master的代码是更新的 dev的代码是旧的,因为master比dev多一次提交,这个结论很重要,一定要理顺
此时如果你想让dev去合并到master是合并不上去的,因为git认为master的代码是新的dev上是旧的,那如果我们想修改dev上的bug,重新合master上线该怎么做呢?
那问题的本质就变成了,要让dev的提交记录比master还要新 ,怎么做呢 看下面的操作
# 首先让dev和master持平
git merge master
# 然后revert掉那次revert
git revert 4cefdf4
git log --oneline
这里有点镜子反射两次的感觉,反射一次反了,再反一次又正了,当然你可以这样无限套娃下去
# 此时 dev上的日志,因为dev上多了一次revert,所以git认为 dev的代码比maser更新
c325084 (HEAD -> dev) Revert "Revert "dev分支的修改""
4cefdf4 (master) Revert "dev分支的修改"
d8f5f2b (origin/master) dev分支的修改
87f168f 项目初始化
有了dev上的再次revert 我们就保证了dev的代码比master要先进,好下面就是正常的修复bug合master上线了
echo '修正bug' >> readme.txt
git add .
git commit -m '修复bug'
git checkout master
git merge dev
git push
git log --oneline
此刻master上记录了我们完成的操作流程
1589f28 (HEAD -> master, origin/master, dev) 修复bug
c325084 Revert "Revert "dev分支的修改""
4cefdf4 Revert "dev分支的修改"
d8f5f2b dev分支的修改
87f168f 项目初始化
如果咱们比较给力,合到master后还有bug,那就按这个套路 重新再走一遍 ,要点就是不要走回头路 一直往前走^_^