结尾附基本常用命令
git commit --amend 改写提交
重写上一次的提交信息,不会生成新的版本号
执行了一次提交,提交信息是 '新增了业务模块 by zhoul'
发现提交信息不完善,想修改它为'新增了征信业务模块 by zhoul'
就可以使用:
git commit --amend '新增了征信业务模块 by zhoul'
通过git reflog 查看不会生成新的版本号,只看到一次提交
git reset 回滚代码仓库
reset参数是重置命令
它有三种模式
–soft 、–mixed以及–hard是三个恢复等级。
使用–soft就仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变。
如果使用–mixed,就将头恢复掉,已经add的暂存区也会丢失掉,工作空间的代码什么的是不变的。
如果使用–hard,那么一切就全都恢复了,头变,aad的暂存区消失,代码什么的也恢复到以前状态。
选项 | HEAD | 暂存区 | 工作目录 | 原来文件内容的变更 | 目录结构的变更(增加或者删除文件) | 个人理解 |
---|---|---|---|---|---|---|
–hard | 受影响 | 受影响 | 受影响 | 修改内容丢失,修改的代码 不会变成未add的状态 | 新增文件丢失、删除的文件相当于没删 | 等同于 git revert,表示commit操作完全不要了,且粒度更大 |
–soft | 受影响 | 不受影响 | 不受影响 | 修改内容还在,变成add的状态 | 新增文件:还存在,变成add的状态(编辑器中文件变成绿色,可以再次执行git commit );删除文件:目录结构中还是没有,可以直接执行git commit | 表示commit操作不要了,但是修改给我保存着,变成已add |
–mixed | 受影响 | 受影响 | 不受影响 | 修改内容还在,变成未add的状态 | 新增文件: 还存在,变成未add的状态(目录结构中文件变成红色,需要执行命令git add . 再执行git commit );删除文件:目录结构中还是没有,需要执行命令git add . 再执行git commit ) | 表示commit操作不要了,但是修改给我保存着,变成未add |
git checkout – file 放弃暂存区的修改
checkout 和 reset 的适用场景并不一样
–>reset针对commit操作之后的情况
–>checkout针对的是未add操作的情况。
【举例】
原文件内容:苹果
对文件操作的顺序:①修改文件内容为"香蕉"—>②add操作—>③commit操作
checkout操作 | 原文件内容 |
---|---|
在①②之间 | 苹果 |
在②③之间 | 香蕉 |
在③之后 | 香蕉 |
git rm后恢复文件:git rm、git reset、git checkout
这里的运用 可以说是对掌握git checkout – file的检验(请看上面一个知识点)
- 先说一下git rm file与rm file两者区别:执行前者操作后,文件变成已add的状态,后者则是未add的状态
- git reset操作是重置所有缓存区内容:比如已经add状态的文件执行git reset操作后变成未add的状态
- 不难理解,git reset其实是让checkout操作回到了①②之间。
git reset 测试过程
新建文件a.txt、b.txt、c.txt并且添加一些内容,commit信息里面,new对应新建操作,write对应写入内容操作
git reset --hard HEAD^ 回滚到上一个不同的版本id,
git reset --hard HEAD~3 回滚三个版本
git reset --hard id 回滚到指定id
第一步:如果最后不加’^',则会生成两个相同版本id,此次回滚无效
$ git reset --soft HEAD 生成两个相同指针654b4dd
zhoul@ZHOULIAO_PC MINGW64 /e/a/2 (master)
$ git reflog
654b4dd (HEAD -> master) HEAD@{
0}: reset: moving to HEAD
654b4dd (HEAD -> master) HEAD@{
1}: commit: write c.txt
026d291 HEAD@{
2}: commit: new c.txt
3742de7 HEAD@{
3}: commit: new write b.txt
902cd69 HEAD@{
4}: commit: write a.txt
3c5fbd5 HEAD@{
5}: commit (initial): new a.txt
第二步:此时再执行正常回滚操作,跳过两次相同的id值654b4dd指针指向026d291
$ git reset --soft HEAD^
zhoul@ZHOULIAO_PC MINGW64 /e/a/2 (master)
$ git reflog
026d291 (HEAD -> master) HEAD@{
0}: reset: moving to HEAD^
654b4dd HEAD@{
1}: reset: moving to HEAD
654b4dd HEAD@{
2}: commit: write c.txt
026d291 (HEAD -> master) HEAD@{
3}: commit: new c.txt
3742de7 HEAD@{
4}: commit: new write b.txt
902cd69 HEAD@{
5}: commit: write a.txt
3c5fbd5 HEAD@{
6}: commit (initial): new a.txt
此时git status内容是什么?
答:因为使用–soft模式,git status内容是026d291之前操作都会出现在缓存区,即【向c.txt写内容】
第三步:此时再执行回滚操作呢?注意看HEAD -> master的位置,说明是以026d291为头指针向前进行一次回滚操作
$ git reset --soft HEAD^
zhoul@ZHOULIAO_PC MINGW64 /e/a/2 (master)
$ git reflog
3742de7 (HEAD -> master) HEAD@{
0}: reset: moving to HEAD^
026d291 HEAD@{
1}: reset: moving to HEAD^
654b4dd HEAD@{
2}: reset: moving to HEAD
654b4dd HEAD@{
3}: commit: write c.txt
026d291 HEAD@{
4}: commit: new c.txt
3742de7 (HEAD -> master) HEAD@{
5}: commit: new write b.txt
902cd69 HEAD@{
6}: commit: write a.txt
3c5fbd5 HEAD@{
7}: commit (initial): new a.txt
此时git status内容是