本篇文章将带大家学会几个最重要也最基本的版控工作,其中将包含基本的档案操作如新增、删除、重新命名档案,提交变更 (建立新版本)、查询历史纪录等工作。
複习一下上一篇「第 03 天:建立储存库」的内容,我们直接来建立一个本地储存库,即可开始本篇文章的所有练习。
mkdir git-demo
cd git-demo
git init
我们在工作目录下放一些档案,至于放什麽档案都可以,总之先複製一些现有的档案与目录进到目前的工作目录下。
本篇文章,我将以 YEOMAN 工具,快速产生一个 webapp 范例网站,只要一个指令就可以建立一个完整网站:
yo webapp
注: 关于 YEOMAN 在 Windows 平台的使用,可以参考笔者的文章 如何在 Windows 平台安装与使用 Yeoman 1.0 相关工具,该文详述完整的安装与使用过程。
新增了档案之后,如果你还在 Git Shell 介面下,应该会立刻看到如下图的提示:
也就是以下这段位于路径后面的提示:
[master +10 ~0 -0 !]
在这段提示的地方,你可以看到几个东西:
如果要要将这些新增的档案加入到 Git 版本控管,你必须下达以下指令:
git add .
如此一来,这个工作目录下所有的档案、目录与子目录下的所有档案,全部都会被加入到这个 Git 工作目录的【索引】或【快取】之中。请注意: 此时并没有建立任何版本,只是告知 Git 这些档案「即将」被加入 Git 版本库而已。
如下图示,是我这边执行完 git add .
之后的结果,这裡所发生的 warning 讯息不是很严重,有兴趣了解的人可以参考笔者的另一篇文章: Git 在 Windows 平台处理断行字元 (CRLF) 的注意事项。
不过有趣的地方在于,原本「红色的数字」现在却变成了「绿色的数字」,这裡所代表的意义是:
但原本不是只有 +10 (红色) 而已吗? 怎麽执行完后变成了 +23 (绿色) 呢?
我们执行 git reset
重设一下工作目录的索引状态,然后再执行一次 git status
查询当前工作目录的详细状态,如下图示:
你可以发现,这边列出的只有「第一层目录下的档案与目录」而已,因为 git 不会这个时候去查到底目录下到底有多少档案没有被追踪。
当我们执行 git add .
之后,再执行一次 git status
查询状态,你可以发现连子目录下的档案也都全部被加入了,所以这个数字才会变多,如下图示:
刚刚提到的 git add .
指令会自动将所有档案(含子目录的档案)加入到工作目录索引中,有时候我们只想让特定目录或特定档案加入版本,这时你也可以指定特定目录,或利用万用字元来加入档案。
我们再执行一次 git reset
重设工作目录的索引状态,然后用 git add app
加入 app 这个资料夹与其下的所有档案,还有用 git add .*
新增所有「点」开头的档案,如下图示:
在执行的过程中,你应该可以发现,在执行 git add
的过程中,Git Shell 提示的文字也有了些变化,现在同时出现了「绿色的数字」与「红色的数字」,所代表的意思跟上述是一样的,是不是非常方便辨识!当你需要知道详情才需要执行 git status
指令。
注: 详细的指令与参数说明,可以输入 git help add
查询完整的文件。
这时我们预计要建立一个新版本了,在建立版本之前,我们还是把所有档案给加入吧,请各位在执行一次 git add .
命令。
建立版本的指令如下:
git commit
git commit -m "版本纪录的说明文字"
在 Git 版本控管中,所有的版本都必须拥有「版本纪录的说明文字」 ( 简称 Log ),不像 Subversion 预设可以签入「没有版本纪录说明」的版本。所以当你直接输入 git commit
的话,预设会开启 Notepad (记事本) 让你输入这个版本的讯息。开启后的档案会有很多 # 符号开头的文字,这些都是注解,不会成为 Log 的一部分。
如下图示,是我输入的讯息文字:
当你按下 Ctrl+S 储存这个文字档,这时还不会建立一个新版本,还必须关闭这个 Notepad 视窗,这时才会正式建立版本,如下图示:
建立版本完后,Git Shell 的提示就只剩下 [master]
字样了,代表目前已经没有任何要被建立版本的索引或快取。
注: 详细的指令与参数说明,可以输入 git help commit
查询完整的文件。
由于我们刚刚建立了一个版本,当我们想要查询版本的历史纪录,可以输入以下指令:
git log
有时候纪录越来越多,你也可以透过以下指令限制输出的版本数量,你只要透过一个减号 ( - ) 与一个数字,就可以限定输出最近几笔纪录:
git log -10
注: 详细的指令与参数说明,可以输入 git help log
查询完整的文件。
在 Git 指令列工具中也有个 rm
指令,可以用来删除档案。例如我们想删除 Gruntfile.js
这个档案,可以输入以下指令:
git rm 'Gruntfile.js'
这个 git rm
的指令执行的时候,会同时做两件事:
注: 详细的指令与参数说明,可以输入 git help rm
查询完整的文件。
在 Git 指令列工具中也有个 mv
指令,可以用来变更档案或目录的名称。例如我们想把 test
目录更名为 unit-test
名称,可以输入以下指令:
git mv test unit-test
注: 详细的指令与参数说明,可以输入 git help mv
查询完整的文件。
刚刚我们一直会看到 git status
来显示工作目录的状态,你也可以使用 git status -s
来显示较为精简的版本。
注: 详细的指令与参数说明,可以输入 git help status
查询完整的文件。
我们曾经学过如何利用 git reset
重置目前工作目录的索引状态,但请注意,这个指令预设只会重置「索引状态」,那些你用 git rm
删除的目录或档案,还是用 git mv
更名的目录或档案,透过 git reset
都无法把「实体档案」给救回来。
如果想把工作目录也给还原到目前的最新版,则必须输入以下指令:
git reset --hard
注: 详细的指令与参数说明,可以输入 git help reset
查询完整的文件。
如果档案编辑到一半,发现被改坏了,你希望能救回改没修改前的版本,这时你可以利用以下指令还原档案:
git checkout master Gruntfile.js
这段指令的意思是把 master
分支中最新版的 Grunefile.js 给还原,由于我先前已经把 Gruntfile.js 给删除了,为了要救回这一个档,可以用这个方式救回。这样可以避免使用 git reset --hard
一次把所有档案都给还原了!
请注意,还原的过程也会一併复原工作目录的索引状态喔!
注: 详细的指令与参数说明,可以输入 git help checkout
查询完整的文件。
今日的文章,可以说是在 Git 版本控管中不断会重複使用的指令与参数,必须非常熟练才行,接下来的文章,将会详细探讨 Git 版本控管的内部结构,千万不要错过!
我重新整理一下本日学到的 Git 指令与参数: