一、代码回退场景
1. 回退本地修改到git HEAD
版本,也就是本地分支版本
- 回退单个文件shell
# 进入需要回退文件的目录 cd '文件所在的目录' # 使用 `git checkout` filename 就是需要回退的文件名称 git checkout --filename
- 回退全部文件shell
# 进入需要回退文件的目录 cd '文件所在的目录' # 使用 `git checkout` filename 就是需要回退的文件名称 git checkout --.
注意:
git checkout -- .
丢弃全部,也包括:新增的文件会被删除,删除的文件会恢复回来,修改的文件会恢复跟本地分支保持一样的版本,git checkout
只是回退到暂存区
之前的代码版本,对之前保存在暂存区里的代码不会有任何的影响
。对commit
提交到本地分支的代码就更没影响了。- 如果之前压根都没有
add
或commit
,那就是回到上次pull
下来的代码版本。
2. 代码git add
到暂存区,并未commit
提交,需要回退
- 回退指定文件shell
git reset HEAD filename
- 回退全部文件shell
git reset HEAD .
注意:
- 这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化。
- 如果需要回退跟本地分支一样的版本,只需要配合使用
git checkout
即可。 - 示例:
3. git commit
后,如何撤销commit
场景: 执行commit后,还没执行push时,想要撤销这次的commit,该怎么办?
- 解决方案
回到其中想要的某个版,修改、增加代码消失
- 执行
git log
,查看提交的commit id
commit-id.png
- 执行
- 根据
commit id
撤销
shellgit reset --hard <commit_id>
- 根据
回到最新的一次提交,修改、增加代码消失
shellgit reset --hard HEAD^
回到
git add
之前,此时修改,新增的代码都会保留,撤销git add
操作shellgit reset HEAD^ # 或者 git reset --mixed HEAD^
回到
git add
之后,此时修改、新增的代码都会保留,保留git add
操作shellgit reset --soft HEAD^
参数详解
HEAD^
表示上一个版本,即上一次的commit,也可以写成HEAD~1
如果进行两次commit
,想要都撤回,可以使用HEAD~2
git reset [<mode>] [<commit>]
mode
--soft
: 不删除工作空间的改动代码,撤销commit,不撤销git add file
--hard
: 删除工作空间的改动代码,撤销commit且撤销add,彻底还原到上一次提交的状态且无法找回。
--mixed
: 不删除工作空间的改动代码,撤销commit,撤销git add file
4. git push
把修改提交到远程仓库,
使用
git reset
- 查看需要回退提交的
commit id
shellgit log
- 查看需要回退提交的
- 回退shell
git reset --hard commit_id
- 强制提交一次,之前的提交就从远程仓库删除,
慎重!!!
shellgit push origin HEAD --force
使用
git revert
- 查看需要回退一次提交的
commit id
shellgit log
- 查看需要回退一次提交的
- 撤销指定的版本,撤销也会作为一次提交进行保存
shellgit revert <commit_id>
5. git merge后,后悔了如何回退
场景:今天将feature分支的代码merge到develop分支后,后悔了,因为feature分支的功能还没有全部开发完成, 在feature分支上commit是可以的,但是这之后又把它merge到了develop分支这就不合适了。
- 解决方案
- 第一步:
git checkout branch_name
到要恢复的那个分支上shellgit checkout develop
- 第二步:
git reflog
查出要回退到merge前的版本号shellgit reflog
git reset --hard [版本号]
就回退到merge前的代码状态了shellgit reset --hard f82cfd2
- 第一步: