我们在掌握Git后,git的基础语法很容易使用,但是最让我们头疼的是Git的撤销修改,今天,我用了将近5个小时的时间,深度分析了git里各种情况下的撤销修改情景,无偿分享给大家。
如果某些方面存在遗漏或不完美的地方,欢迎留言,最好你的代码,这样咱们分析问题更加直观。
先讲一个最基础的,
git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销。
这里的撤销修改有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。(需要用到先git reset HEAD <file>回退,再按git checkout -- file操作)
其实就一种情况:在文件没add之前,都可以直接进行checkout以实现撤销更改的目的,一旦add了,光凭上面的一句指令git checkout – readme.txt就没用了
注意:上面必须要加上 -- ,否则就是切换分支的命令。
总结:1.没有git add时,用git checkout -- file
2.已经git add时,先git reset HEAD <file>回退到1.,再按git checkout -- file操作 (注意,这两步操作缺一不可)
3.已经git commit时,用git reset commit_id 回退版本,然后再通过git checkout -- file 把文件重新找回 (注意,这两步操作缺一不可)
4.如果已经git push到远程库,想回退到某个版本,先pull下来,然后git reset --hard <commit_id>,再进行push,具体代码为:git push -f origin master
5.git reset --hard commit_id 回退到某个版本
hard的作用:
现在有很多提交,1是最新的提交,后面的次之,
1-2-3-4-5,现在head指向的是1,我现在想要指到3,那么使用git reset --hard 3,那么1,2的commit都会被丢弃,只保留3-4-5,
这个时候,你再使用git reset 1就会报错,因为1已经丢弃了。
而如果我现在用的是git reset --soft 3,那么1,2,3,4,5的commit都会被保留,此时再使用git reset 1 就会再跳转到1那个节点。
上述的操作可以多执行几遍,就明白了。大家在执行git reset --soft和git reset --hard时可以执行完后看看git log --pretty=oneline 的结果有什么变化
【不难看出:git reset --soft 还有移动指针的作用!】
6.git reflog 可以看到所有版本号
建议:大家在练习上面操作时,可以先尝试执行git log --pretty=oneline和git reflog显示出结果对照着看
该文章有word版本,可以作为笔记,方便查看,如果有需要,可以在下面下载:
https://tldx.lanzoul.com/i2P4a1i8dgre
密码:4r8v