1、本地仓库分支版本回退
第一步、用下面命令找到要回退的版本的 commit id:
git reflog 或 git log --oneline
注:git reflog 查看命令历史 git log --oneline 查看历史版本简洁信息
第二步、回退版本:
git reset --hard 2e6ab1d
2、远程仓库分支版本回退的方法
第一步、首先要回退本地分支:
git reflog
git reset --hard 2e6ab1d
第二步、强制推送到远程分支:
git push -f
注:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支。
3、公共远程分支版本回退的方法(一)
A、B分别代表两个员工,A1、A2、B1代表各自的提交记录。所有人的本地分支都已经更新到最新版本,和远程分支一致。
此时,假设A员工发现 A2 这次提交有错误,你用 reset 回滚远程分支 master 到 A1。此时,最理想状态是B员工拉代码 git pull,B员工的 master 分支也自动回滚了。但是现实并不是这样,B员工会看到下面的提示:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
也就是说,B员工的分支并没有主动回退,而是比远程分支超前了两次提交,因为远程分支回退了。
此时B员工需要作如下操作:
git checkout b_branch // 先回到自己的分支
git reflog // 接着看看当前的 commit id,例如:d517b5d
git reset --hard B1 // 回到被覆盖的那次提交 B1
git checkout -b b_backup // 拉个分支,用于保存之前因为回退版本被覆盖掉的提交B1
git checkout b_branch // 拉完分支,迅速回到自己分支
git reset --hard d517b5d // 马上回到自己分支的最前端
B1那次提交找回来了,这时 b_backup 分支最新的一次提交就是B1,然后将本地 master 分支和远程 master 分支保持一致:
git reset --hard origin/master
这是B员工本地 maser 分支的代码是 A1。然后B员工再次合并那个被丢掉的B1提交:
git checkout master // 切换到 master
git merge tony_backup // 再合并一次带有B1的分支到 master
这个时候B员工的 master 分支的代码是 A1-B1。终于把丢掉的B1给找回来了,接着B员工执行 push 操作,A员工拉取也能同步代码。
如果C员工没有提交代码,那么他拉完代码 git pull 之后,只需要强制用远程 master 覆盖掉本地 master 即可。
git reset --hard origin/master
4、公共远程分支版本回退的方法(二)
git revert HEAD // 撤销最近一次提交
git revert HEAD~1 // 撤销上上次的提交,注意:数字从0开始
git revert d517b5d // 撤销 d517b5d 这次提交
注:git revert 撤销某次提交。它会产生一个新的提交,虽然代码回退了,但是版本依然是向前的,所以,当你用revert回退之后,所有人pull之后,他们的代码也自动的回退了。
注意以下几点:
git revert 命令的好处就是不会丢掉别人的提交,即使你撤销后覆盖了别人的提交,他更新代码后,可以在本地用 reset 向前回滚,找到自己的代码,然后拉一下分支,再回来合并上去就可以找回被你覆盖的提交了。
git reflog 查看命令历史
git log 查看提交历史
git log --oneline 查看历史版本简洁信息
git 回滚上一次拉取之前的版本
git reset --hard FETCH_HEAD
git 回退到上一个版本
git reset --hard HEAD^
git reset --head [局部索引值]
注: 一个 ^ 表示后退一步 , n个表示后退 n 步
git reset --hard HEAD~n
注 : 表示后退n步