# 关于撤销
1. 本地修改,未git add
可以使用git checkout
命令:
git checkout -- [file]
作用:让这个文件回到最近一次git commit
或git add
时的状态
2. 修改完git add,未git commit
可以使用git reset
命令,该命令不止可以用在版本回退,也可以用来撤销暂存区。用法:
git reset HEAD [file]
作用:把暂存区的修改撤销掉(unstage),重新放回工作区。
随后使用git status
查看,其状态与情况1一样,此时可以再使用git checkout
命令撤销工作区的修改。
另一种情况是要把git add
进暂存区的文件移出暂存区,使其变成未跟踪状态,可以使用git rm
命令。用法:
git rm --cached [file] #移出暂存区
作用:把暂存区的文件移出,使其变成未跟踪状态。
3. 修改完git commit,未git push
到这一步进行撤销就是常提到的:版本回退。
有三种回退方式:
-
git reset --hard HEAD^
往前回退一个版本,回退完了后工作区就是上一个版本的代码了,并且是clean的。连工作区也一起回退。
-
git reset --soft HEAD^
往前回退一个版本,并且将这次错误的提交的代码改动,放在暂存区里。回退到git commit之前,修改保留到git add。
-
git reset --mixed HEAD^ #(和不带参数是一样的)
往前回退一个版本,并且将这次错误的提交的代码改动,放在工作区里。回退到git add之前,修改保留在工作区。
# 关于改动
1. 使用git status
最常用的命令,功能十分强大,可以列出工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)加上远程的git仓库(Remote Directory)四个工作区域之间的差异状态。
- 查看工作区哪些文件未被跟踪
- 查看工作区哪些文件被修改且未使用
git add
添加到暂存区Stage - 查看暂存区Stage哪些文件未使用
git commit
提交到本地仓库 - 查看本地仓库有多少提交commit未使用
git push
推送到远程仓库
如果改动的文件过多,可以使用简短表示:
git status -s
最左边的红色字母表示文件状态,对应的状态有:
状态 | 含义 |
---|---|
‘’ | unmodified |
M | modified |
A | added |
D | deleted |
R | renamed |
C | copied |
U | updated but unmerged |
?? | untracked |
!! | ignored |
关于撤销可以看撤销栏目。
2. 使用git diff
作用:查看工作区和暂存区的文件差异。
在改动工作区的文件后,尚未执行git add
命令,则会与暂存区的内容产生差异,使用
git diff [file]
可以查看该文件与上次git add
的内容上的差异。
特殊情况:如果上一次刚使用完git commit
提交到本地仓库(版本库),此时暂存区的内容为空,那么这个时候如果改动工作区上的文件,使用git diff
则查看的是工作区与最后一次commit的差异。
从原理上看,当我们在做了一次commit之后,工作区 、暂存区,和版本库三个区域的sha-1版本号是同步的,sha-1号相同表示为同一份内容。
因此本质上还是查看工作区和暂存区的差异。
扩展用法
2.1 暂存区和版本库的文件差异
git diff --cached
git diff --staged
git diff --cached [path/file] #指定文件
git diff --cached [commid-id] [path/file]
显示【暂存区(已add但未commit文件)】和【最后一次commit(HEAD)】之间的所有不相同文件的增删改
上面这两个命令作用相同。
2.2 (工作区&暂存区)和版本库的差异
git diff HEAD
git diff HEAD^ #上一个版本
git diff HEAD~ #上一个版本
显示【工作目录(已track但未add文件)和暂存区(已add但未commit文件) 】与【最后一次commit】之间的的所有不相同文件的增删改。
2.3 两个分支最新commit内容的差异
git diff branch1 branch2
git diff branch1 branch2 --stat #简单显示,不显示具体的内容
git diff branch1 branch2 [path/file] #指定文件
2.4 两个commit的差异
git diff [commid-id1] [commit-id2]
2.5 打补丁
通过对上面的各种git diff
用法后面添加> [patch]
表示将差异做成补丁。
git diff > [patch]
git diff --cached > [patch] #将暂存区与版本库的差异做成补丁
git diff --HEAD > [patch] #将工作区与版本库的差异做成补丁
git diff [file] > [patch] #将文件的差异做成一个单独的补丁
做成补丁后,在其他机器上对应目录下使用:
git apply [patch]
git apply --reject [patch] #将能打的补丁打上,有冲突的会生成.rej文件,手动解决
可以将补丁打上。
在应用补丁之前,可以先检验一下补丁能否应用:
git apply --check [patch] #没有输出则表示可以顺利接受补丁
3. 使用git log
git log可以查看历史提交信息。
直接使用git log会列出所有的commit信息。如果版本库的提交比较多,可以使用
git log --oneline
作用:把所有历史提交以一行一提交的形式列出。
还有常用的,指定列出多少个历史提交
git log -2
作用:列出前2次历史提交。
当然可以结合起来用
git log -2 --oneline
即以一行一个提交的形式列出前两次提交。
还有一个可以查看log并且同时显示出改动的代码,相当于结合git diff
使用
git log -p