git-reset/revert命令:
git 分布式版本控制系统,强大的分支管理
工作区、暂存区(add)、本地仓库(commit)、远程仓库(push)
git reset :用于回退版本,可以指定退回某一次提交的版本。
git reset [–soft | --mixed | --hard] [HEAD]
- –soft
- –mixed 默认的可以不带,重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
- –hard
1、git reset --soft:
- 只回退了commit的信息。如果还要提交,直接commit即可
- 如果还要提交,直接commit即可(修改的内容变成未add的状态),索引(暂存区)和工作目录的内容是不变的,
- 在git reset三个命令中对现有版本库状态改动最小。
- 修改内容还在,只是本次提交信息回退了,重新提交即可
2、git reset --mixed(git reset)
- 修改内容还在,变成未add的状态
- 需要重新git add 、git commit
3、git reset --hard
- 彻底回退到某个版本,本地的代码也会变为上一个版本的内容,所有修改的内容都会丢失,
- 丢失本地修改
- 可用这个命令来实现和远程强行reset,一定程度上解决提交时因为本地代码不是最新提交产生冲突的问题
- git reset --hard origin/xxx
- 一般本地执行git reset --hard,此时执行git push会报错,就是因为本地的代码比远程的旧,故要使用git push -f (强推)
4、注意:
4.1、恢复git reset —hard的误操作
- 起因:不小心通过git reset —hard将版本回退到之前的commit
- git reflog命令,找到要退回的commitId
- 再次强行 git reset --hard commitId
4.2、git revert
- commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,
- 可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:
- 撤销之前某个版本,又想保留目标版本之后的版本
- git revert -n 版本号(撤销的版本)----git commit -m 版本名”------git push
4.3、git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
- 回滚操作,效果差不多。但是继续merge以前的老版本时有区别。
- git revert:一次逆向的commit,因此日后合并老的branch时,导致这部分改变不会再次出现,
- git reset:把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
- 移动方向不同:
- git reset :HEAD向后移动了一下,
- git revert:HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
4.4、HEAD 说明:
HEAD 表示当前版本
- HEAD^ 上一个版本
- HEAD^^ 上上一个版本
- HEAD^^^ 上上上一个版本
- 以此类推…
可以使用 ~数字表示 - HEAD~0 表示当前版本
- HEAD~1 上一个版本
- HEAD~2 上上一个版本
- HEAD~3 上上上一个版本
- 以此类推…
4.5、代码回滚
- 工作区:
- git checkout – a.txt # 丢弃某个文件
- git checkout – . # 丢弃全部
- 新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前
- 对暂存区没有任何影响
- 之前都没有暂存或commit,回到上一次pull
- 暂存区:
- git add到缓存区,并未commit提交
- git reset HEAD .
- git reset HEAD a.txt
- 这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
- 本地仓库:
- git commit到本地分支、但没有git push到远程
- git log # 得到你需要回退一次提交的commit id
- git reset --hard <commit_id> # 回到其中你想要的某个版本
- git reset --hard HEAD^ # 回到最新的一次提交
- git reset HEAD^ # 此时代码保留,回到 git add 之前
- 远程仓库:
- git push把修改提交到远程仓库
- git reset是直接删除指定的commit
- git log # 得到你需要回退一次提交的commit id
- git reset --hard <commit_id>
- git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除
- 一般企业开发中不允许强推
- git revert是用一次新的commit来回滚之前的commit
- git log # 得到你需要回退一次提交的commit id
- git revert <commit_id> # 撤销指定的版本,撤销也会作为一次提交进行保存