git版本控制工具(二)----本地版本库的常用操作,git----
【正文】
在上一章节中,我们学习了关于Git最基本的用法,包括安装Git、创建版本库,以及提交本地代码。本章节中将学习更多的使用技巧。即:Git版本控制工具(一)----git的安装及创建版本库
我们先要做好准备工作,将某个项目创建版本库,我这里就新建一个Android项目GitTest,创建一个版本库。打开Git Bash,进入到这个项目的根目录下,然后执行git init命令,如下图所示:
这样,准备工作就做好了。
一、忽略文件:
版本库已经创建好了,接下来我们需要提交项目中的代码,但是不是所有的文件都需要加入到版本控制当中去呢?
我们需要知道,在Android项目结构中,bin目录和gen下的文件都是自动生成的,我们不应该将这部分文件添加到版本控制当中,否则有可能会对文件的自动生成造成影响。那如何才能实现这样的效果呢?
其实,Git会检查版本库中的根目录下是否存在一个名为.gitignore的文件,如果存在的话,就去一行一行的读取这个文件中的内容,并把每一行指定的文件或目录排除在版本控制之外。注意,.gitignore的文件中指定的文件或者目录是可以使用“*”通配符的。
【步骤】
现在,我们在GitTest项目的根目录下创建一个名为.gitignore的文件,然后去编辑这个文件中的内容。如下图所示:
这样就把bin目录和gen下的文件都忽略掉,从而使它们不会加入到版本控制中。
记住,.gitignore文件的编码方式必须为UTF-8:
然后就可以使用add提交代码:
git add .
然后执行commit命令完成提交:
git commit -m "First commit"
注:以后每次修改忽略文件之后,或者重新添加了文件,都必须重新提交,文件才会生效。
问:如果某个文件被加入到忽略文件中,即使被修改了内容,通过git status 和git diff也还是能够看到的修改记录,这是为什么呢?是忽略文件无效吗?
二、查看修改的内容:(未提交之前)
Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
在进行一次代码提交之后,我们后面还需要对项目不断地进行维护,添加新功能。理想的情况是:每完成一小块功能,就执行一次提交。Git会记住每一次提交的状态。
注:这里能查看到的修改内容是指提交之前的修改。如果你已经提交了,马上再输入这个命令,就看不到修改的内容了。
1、查看被修改的文件:git status
查看文件修改的情况的方法非常简单,只需在根目录执行如下命令:
git status
然后Git会提示目前项目中没有任何可提交的文件,因为我们才刚刚提交过。现在我们在布局文件中,添加一个Button,添加的代码如下:

<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第一个按钮" />

然后再输入git status看一下:
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,activity_main.xml被修改过了,但这还只是没有提交的修改。
2、查看文件的具体修改内容:git diff
之前的git status命令可以查看被修改的文件是什么,如果要查看具体的修改内容,需要输入如下命令:
git diff
执行结果如下:
git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式。
如果只想查看activity_main.xml这个文件的更改内容,可以使用如下命令:
git diff res/layout/activity_main.xml
执行结果如下:
3、撤销未add的修改:git checkout
只要代码未提交,所有修改的内容都是可以撤销的。可以执行git checkout这个命令。即执行如下命令:
git checkout -- res/layout/activity_main.xml
执行之后,我们对activity_main.xml这个文件在add之前所做的全部修改都被撤销了。
重新运行git status命令检查一下:
可以看到,当前项目没有任何可以提交的文件,撤销成功。
4、撤销未commit的修改:git reset和git checkout
不过上面这种方式只适用于还没有执行过add命令的文件,如果某个文件已经被add过了,这种方式是无效的。
此时应该采取的步骤是:先使用reset命令取消add添加(此时暂存区中的内容将被清空,之前所有的add都是无效的),再使用checkout命令将修改的内容进行撤销。即执行如下命令:
git reset HEAD res/layout/activity_main.xml
git checkout -- res/layout/activity_main.xml
【总结】
命令git checkout -- filename意思就是,把filename这个文件在工作区的修改全部撤销。
这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
一句话总结,即:用暂存区中filename文件来覆盖工作区中的filename文件。
注:git checkout -- file命令中的“--”很重要,没有“--”,就变成了“创建一个新分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
5、删除文件:
当你直接在在文件管理器中把没用的文件(这里以忽略文件为例)删了,这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且commit:
git rm .gitignore git commit -m "delete .gitignore"
另一种情况是删错了,现在不想删除,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git checkout -- .gitignore
注:git checkout其实是用版本库里的版本(准确来说是暂存区的版本)替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
三、查看提交记录:(log命令)
每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
当某个项目开发了几个月之后,我们可能已经执行过上百次的提交操作了。这个时候估计你早就忘记了每次提交都修改了哪些内容。不过没关系,Git一直都帮我们记录着呢。
我们现在将之前的修改进行提交:
git add . git commit -m "add button1"
然后执行如下命令查看提交记录:
git log
执行的结果如下:
可以看到,每次提交都会包含提交id,提交人,提交日期,以及提交描述这四个信息。
你看到的一大串类似“ 3628164...882e1e0”的是commit id(版本号),和SVN不一样,Git的c