git教程--git版本库的使用

向版本控制器提交文件

咱们已经成功地添加并提交了一个readme.txt文件,如今,是时候继续工做了,因而,咱们继续修改readme.txt文件,改为以下内容:git

Git is a distributed version control system.
Git is free software.

如今,运行git status命令看看结果:app

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:   readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

git status命令可让咱们时刻掌握仓库当前的状态,上面的命令告诉咱们,readme.txt被修改过了,但尚未准备提交的修改。分布式


 

虽然Git告诉咱们readme.txt被修改了,但若是能看看具体修改了什么内容,天然是很好的。好比你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,因此,须要用git diff这个命令看看:工具

$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,能够从上面的命令输出看到,咱们在第一行添加了一个“distributed”单词。spa

知道了对readme.txt做了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是同样的两步,第一步是git add命令行

$ git add readme.txt

一样没有任何输出。在执行第二步git commit以前,咱们再运行git status看看当前仓库的状态:3d

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   readme.txt
#

git status告诉咱们,将要被提交的修改包括readme.txt,下一步,就能够放心地提交了:版本控制

$ git commit -m "add distributed"
[master ea34578] add distributed
 1 file changed, 1 insertion(+), 1 deletion(-)

提交后,咱们再用git status命令看看仓库的当前状态:指针

$ git status
# On branch master
nothing to commit (working directory clean)

Git告诉咱们当前没有须要提交的修改,并且,工做目录是干净(working directory clean)的。日志

如今,再练习一次,修改readme.txt文件以下:

Git is a distributed version control system.
Git is free software distributed under the GPL.

而后尝试提交:

$ git add readme.txt
$ git commit -m "append GPL"
[master 3628164] append GPL
 1 file changed, 1 insertion(+), 1 deletion(-)

像这样,你不断对文件进行修改,而后不断提交修改到版本库里,就比如玩RPG游戏时,每经过一关就会自动把游戏状态存盘,若是某一关没过去,你还能够选择读取前一关的状态。有些时候,在打Boss以前,你会手动存盘,以便万一打Boss失败了,能够从最近的地方从新开始。Git也是同样,每当你以为文件修改到必定程度的时候,就能够“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还能够从最近的一个commit恢复,而后继续工做,而不是把几个月的工做成果所有丢失。


如今,咱们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add distributed

Git is a distributed version control system.
Git is free software.

版本3:append GPL

Git is a distributed version control system.
Git is free software distributed under the GPL.

固然了,在实际工做中,咱们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,否则要版本控制系统干什么。版本控制系统确定有某个命令能够告诉咱们历史记录,在Git中,咱们用git log命令查看:

$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 15:11:49 2013 +0800

    append GPL

commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 14:53:12 2013 +0800

    add distributed

commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 19 17:51:55 2013 +0800

    wrote a readme file

git log命令显示从最近到最远的提交日志,咱们能够看到3次提交,最近的一次是append GPL,上一次是add distributed,最先的一次是wrote a readme file。 若是嫌输出信息太多,看得眼花缭乱的,能够试试加上--pretty=oneline参数:

$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

须要友情提示的是,你看到的一大串相似3628164...882e1e0的是commit id(版本号),和SVN不同,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个很是大的数字,用十六进制表示,并且你看到的commit id和个人确定不同,以你本身的为准。为何commit id须要用这么一大串数字表示呢?由于Git是分布式的版本控制系统,后面咱们还要研究多人在同一个版本库里工做,若是你们都用1,2,3……做为版本号,那确定就冲突了。

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。若是使用可视化工具查看Git历史,就能够更清楚地看到提交历史的时间线。

好了,如今咱们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是“add distributed”的那个版本,怎么作呢?

首先,Git必须知道当前版本是哪一个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意个人提交ID和你的确定不同),上一个版本就是HEAD^,上上一个版本就是HEAD^^,固然往上100个版本写100个^比较容易数不过来,因此写成HEAD~100

如今,咱们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可使用git reset命令:

$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed

看看readme.txt的内容是否是版本add distributed

$ cat readme.txt
Git is a distributed version control system.
Git is free software.

还能够继续回退到上一个版本wrote a readme file,不过且慢,然咱们用git log再看看如今版本库的状态:

$ git log
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 14:53:12 2013 +0800

    add distributed

commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 19 17:51:55 2013 +0800

    wrote a readme file

最新的那个版本append GPL已经看不到了!比如你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?

办法其实仍是有的,只要上面的命令行窗口尚未被关掉,你就能够顺着往上找啊找啊,找到那个append GPLcommit id3628164...,因而就能够指定回到将来的某个版本:

$ git reset --hard 3628164
HEAD is now at 3628164 append GPL

再当心翼翼地看看readme.txt的内容:

$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.

Git的版本回退速度很是快,由于Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL改成指向add distributed,而后顺便把工做区的文件更新了。因此你让HEAD指向哪一个版本号,你就把当前版本定位在哪。

如今,你回退到了某个版本,关掉了电脑,次日早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,老是有后悔药能够吃的。当你用$ git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:

$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file

终于舒了口气,第二行显示append GPL的commit id是3628164,如今,你又能够乘坐时光机回到将来了。

相关文章
相关标签/搜索