Git:如何撤销已经提交的代码
日常操作流程
本地工作区(尚未暂存) ---> add . 到暂存区 ---> commit 到本地仓库 ---> pull拉取关联远程仓库分支合并到本地的分支---> push 到远程分支
查看commit提交的内容
git log #查看commitId的log
git show #查看最新的commit
git show commitId #查看指定commit c440aa10ac的所有修改:
场景一:
修改的文件已被git commit,再次修改的文件,合并到上一次提交的commit中,不再产生新的Commit
# 修改最后一次提交
git add sample.txt #修改文件添加到暂存区
git commit --amend -m"说明" #合并提交到上一次的commit里
git commit --amend #或者 进入到编辑里编写提交注释
修改上一次commit提交的备注
git commit --amend
场景二:
当修改文件后,还没有add提交到暂存区,也没有commit时,想要放弃修改
git checkout 11.txt #放弃11.txt文件的修改
git checkout . # 放弃所有文件的修改
git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。
场景三:
当文件add提交到暂存区,还没有commit时,发现文件提交错了,这时想撤回文件
git reset HEAD a.php #只撤消a.php
git reset HEAD * #撤消所有
这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
场景四:
当文件add提交到暂存区,也commit了,发现文件提交错了,这时想撤回文件
git reset HEAD^ # 撤消上一次的commit 不带参数默认是--mixed 例:git reset --mixed HEAD^ 也可以写成git reset HEAD~1
git reset HEAD~2 如果你进行了2次commit,想都撤回,可以使用HEAD~2
git reset fdaeaf208f0e142ceba5766d17786d60fcebc1dd #撤消指定的commitId
git reset --hard fdaeaf208f0e1 # 回退到指定版本 放弃工作区的所有修改,还原到指定版本的代码
reset三种模式区别
--soft:不删除工作空间改动代码,撤销commit,不撤销git add .操作,重置位置的同时,保留working Tree工作目录和index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
--mixed(默认):不删除工作空间改动代码,撤销commit,并且撤销git add . 操作,重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。
--hard:删除工作空间改动代码,撤销commit,撤销git add . 操作,重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
注意完成这个操作后,就恢复到了指定版本的commit状态。
push到远程仓库
如果代码之前已经push到远程仓库里,想要撤消线上的push
步骤:先回退本地版本,再强推到远程仓库里,有两种方法
方法:
- reset(回滚到)
- revert(重做)
区别:
- reset是指将HEAD指针指到先前已存在的历史提交,历史记录中不会出现放弃的提交记录。
- revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
reset(回滚到)
git reset --hard fdaeaf208f0e1 # 回退到指定版本 放弃工作区的所有修改,还原到指定版本的代码
git push 目标分支 本地分支 -f
此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,要加-f参数强制推送
#git push 目标分支 本地分支 -f
git push origin master -f
revert(重做)
参考下面的文档:
https://www.cnblogs.com/birdy-silhouette/p/13958151.html
或者在IDEA中操作:
选soft 或者 mixed 都可以,这个你本地开发的代码不会丢失。
查看代码已经撤回了
4.git push 重新提交会报错;
把撤回的状态推送到线上仓库里,因为此时只是在本地撤回代码了,还没有同步到线上
这是因为撤回后,本地仓库里的版本小到线上仓库的,所以被拒绝
下面强推一下就可以了
git push origin master -f
5.使用git push --force
执行完上面的命令后,线上仓库里的提交就被撤回了。
然后,自己在本地再修改代码,测试好了,再重提交代码
add .
add commit -m"edit code"
add pull
add push
标签:reset,test3,git,add,暂存区,push,commit From: https://www.cnblogs.com/izzh/p/18232925