一、查看仓库状态
使用 git status
命令查看当前仓库状态。
接下来我们操作测试一下。
首先,修改 GitSpace
目录下的 readme.txt
文件,在原有内容下,加入一句:
Git status handler.
保存后,关闭编辑器。然后在 git bash
中输入 git status
命令。
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
返回的信息告诉我们 readme.txt
文件被修改过了。
然后如果相知道修改的详细内容,可以用 git diff
命令查看。
$ git diff
diff --git a/readme.txt b/readme.txt
index 9f7547c..082f801 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,4 @@
Git is a version control system.
-Git is free software.
\ No newline at end of file
+Git is free software.
+
+Git status handler.
\ No newline at end of file
返回的详细信息为 readme.txt
文件新增了一行空的 line,和一句
Git status handler。
之后,我们再把修改过的内容提交。
提交的命令我们之前操作过:
$ git add readme.txt
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: readme.txt
$ git commit -m "modify readme.txt"
[master 6f06d48] modify readme.txt
1 file changed, 3 insertions(+), 1 deletion(-)
$ git status
On branch master
nothing to commit, working tree clean
先 add readme.txt
文件,然后运行 git status
命令,看到仓库信息为:将要提交修改的 readme.txt
文件。最后提交。再次运行 git status
命令,就显示没有内容待提交,此时工作目录是干净的(working tree clean)。
二、版本回退
在开发中,我们肯定会遇到这样的问题。出现了错误代码的提交要回退到某个指定的代码版本,然后在正确版本的代码上去规避问题。
那我们怎么知道要具体回退到哪一个版本呢?或者我们怎么能记得住哪个版本我们提交了哪些内容呢?
当然,我所提的这肯定不算啥大问题,所有的代码版本控制系统完成这件事都是小菜一碟。
在 Git 中,我们可以使用 git log
命令查看我们提交代码的历史记录:
$ git log
commit 6f06d487836765e507bc20a69d9740b048191fdf (HEAD -> master)
Author: gink
Date: Fri Nov 24 10:28:30 2017 +0800
modify readme.txt
commit 4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef
Author: gink
Date: Thu Nov 23 16:55:51 2017 +0800
add newfiles
commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
Author: gink
Date: Thu Nov 23 16:52:25 2017 +0800
add readme file
使用 git log
命令可以查看最近三次提交记录,显示序列由近到远。如果嫌显示的内容太过繁杂,可以加上--pretty=oneline
参数:
$ git log --pretty=oneline
6f06d487836765e507bc20a69d9740b048191fdf (HEAD -> master) modify readme.txt
4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef add newfiles
f4625e13ea1076da03dc32f66b6ad0f4c651a26c add readme file
在 Git 中,用 HEAD
表示当前版本,上一个版本用 HEAD^
表示,上两个版本用 HEAD^^
表示。如果往上的版本太多,比如上100个版本,那就用 HEAD~100
表示。
然后你看到的一长串字符串是每次提交的版本号(commit id),如果想要进行回退,就要用到这些版本号。
注:需要注明的是,Git 和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id
和我的肯定不一样,以你自己的为准。为什么commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
好了,现在开始吃后悔药,进行版本回退吧。
版本回退可以使用 git reset
命令,我们试一下,将版本回退到 add newfiles
版本。
$ git reset --hard HEAD^
HEAD is now at 4ab5b56 add newfiles
$ git log
commit 4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef (HEAD -> master)
Author: gink
Date: Thu Nov 23 16:55:51 2017 +0800
add newfiles
commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
Author: gink
Date: Thu Nov 23 16:52:25 2017 +0800
add readme file
OK,现在已经把版本回退到了add newfiles
版本。原来的 modify readme.txt
已经找不到了。那现在想再把 modify readme.txt
版本还原回来怎么办?
可以,只要你找到 modify readme.txt
的版本号。拿到版本号之后,运行命令:
$ git reset --hard 6f06d48783
HEAD is now at 6f06d48 modify readme.txt
$ git log
commit 6f06d487836765e507bc20a69d9740b048191fdf (HEAD -> master)
Author: gink
Date: Fri Nov 24 10:28:30 2017 +0800
modify readme.txt
commit 4ab5b56ea7ee19c5e7948e004cf37b74b5a4c1ef
Author: gink
Date: Thu Nov 23 16:55:51 2017 +0800
add newfiles
commit f4625e13ea1076da03dc32f66b6ad0f4c651a26c
Author: gink
Date: Thu Nov 23 16:52:25 2017 +0800
add readme file
注:版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
三、工作区和暂存区
直接上结论:
- 工作区:就是在电脑上能看到的目录。比如 GitSpace 文件夹。
- 暂存区:git add 的操作就是把需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改
四、管理修改
管理修改是 Git 有别于也是优于别的版本控制系统的特点。
为什么说Git管理的是修改,而不是文件呢?我们还是在代码中看。
还是打开 readme.txt
,在最后加一行内容:
Git modify
然后,将本次修改添加到暂存区:
$ git add readme.txt
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: readme.txt
然后,先不提交,再去修改 readme.txt :
Git is a version control system.
Git is free software.
Git status handler.
Git modify on file.
然后,再去提交:
$ git commit -m "git change"
[master d0d8cc4] git change
1 file changed, 2 insertions(+), 1 deletion(-)
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
我们看到,第二次修改并没有提交上去。
这就是 Git 至管理修改的特点了。因为我们只把第一次的修改添加到暂存区了,第二次的修改没有添加进去,自然就提交不上。
想要把第二次修改,可以继续git add
再git commit
,也可以别着急提交第一次修改,先git add
第二次修改,再git commit
,就相当于把两次修改合并后一块提交了。
五、撤销以及修改
有时候我们会不小心手抖写错了一些文档或者写了错误的代码。这时,我们通常的做法都是删除错误的书写,让文件恢复到上一个版本的状态。这时候输入 git status
命令:
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
Git 会告诉你,可以使用 git checkout -- file
命令来丢弃工作区的修改。
$ git checkout -- readme.txt
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
在工作目录中,如果你手动或者使用 rm
命令删除一个文件之后,运行 git status
会看到 Git 中有删除记录。
这时候你有两个选择,一个是使用 git rm
命令将文件删除,并且 git commit
。
这样,文件就彻底从版本库中删除了。
另一种情况就是,你又想吃后悔药了。想还原已经删除的文件。
此时,运行:
$ git checkout -- 删除的文档名
就可以从版本库中还原已经删除的文件。
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
参考
Git教程