git版本控制工具(二)----本地版本库的经常使用操做

【声明】 html

欢迎转载,但请保留文章原始出处→_→ android

生命壹号:http://www.cnblogs.com/smyhvae/ git

文章来源:http://www.cnblogs.com/smyhvae/p/3994704.html分布式

 

【正文】工具

在上一章节中,咱们学习了关于Git最基本的用法,包括安装Git、建立版本库,以及提交本地代码。本章节中将学习更多的使用技巧。即:Git版本控制工具(一)----git的安装及建立版本库布局

咱们先要作好准备工做,将某个项目建立版本库,我这里就新建一个Android项目GitTest,建立一个版本库。打开Git Bash,进入到这个项目的根目录下,而后执行git init命令,以下图所示:学习

 

这样,准备工做就作好了。编码

 

1、忽略文件:spa

版本库已经建立好了,接下来咱们须要提交项目中的代码,可是不是全部的文件都须要加入到版本控制当中去呢?命令行

咱们须要知道,在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也仍是可以看到的修改记录,这是为何呢?是忽略文件无效吗?

 

2、查看修改的内容:(未提交以前)

Git比其余版本控制系统设计得优秀,由于Git跟踪并管理的是修改,而非文件。

在进行一次代码提交以后,咱们后面还须要对项目不断地进行维护,添加新功能。理想的状况是:每完成一小块功能,就执行一次提交。Git会记住每一次提交的状态。

注:这里能查看到的修改内容是指提交以前的修改。若是你已经提交了,立刻再输入这个命令,就看不到修改的内容了。

一、查看被修改的文件: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被修改过了,但这还只是没有提交的修改

二、查看文件的具体修改内容:git diff

以前的git status命令能够查看被修改的文件是什么,若是要查看具体的修改内容,须要输入以下命令:

git diff 

执行结果以下:

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式。

若是只想查看activity_main.xml这个文件的更改内容,可使用以下命令:

git diff res/layout/activity_main.xml 

执行结果以下:

三、撤销未add的修改:git checkout

只要代码未提交,全部修改的内容都是能够撤销的。能够执行git checkout这个命令。即执行以下命令:

git checkout -- res/layout/activity_main.xml 

执行以后,咱们对activity_main.xml这个文件在add以前所作的所有修改都被撤销了。

从新运行git status命令检查一下:

能够看到,当前项目没有任何能够提交的文件,撤销成功。

四、撤销未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命令。 

五、删除文件:

当你直接在在文件管理器中把没用的文件(这里以忽略文件为例)删了,这个时候,Git知道你删除了文件,所以,工做区和版本库就不一致了,git status命令会马上告诉你哪些文件被删除了:

 

如今你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,而且commit:

git rm .gitignore

git commit -m "delete .gitignore"

另外一种状况是删错了,如今不想删除,由于版本库里还有呢,因此能够很轻松地把误删的文件恢复到最新版本:

git checkout -- .gitignore

注:git checkout实际上是用版本库里的版本(准确来讲是暂存区的版本)替换工做区的版本,不管工做区是修改仍是删除,均可以“一键还原”

 

3、查看提交记录:(log命令

每当你以为文件修改到必定程度的时候,就能够“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还能够从最近的一个commit恢复,而后继续工做,而不是把几个月的工做成果所有丢失。

当某个项目开发了几个月以后,咱们可能已经执行过上百次的提交操做了。这个时候估计你早就忘记了每次提交都修改了哪些内容。不过不要紧,Git一直都帮咱们记录着呢。

咱们如今将以前的修改进行提交:

git add .

git commit -m "add button1"

而后执行以下命令查看提交记录:

git log

执行的结果以下:

能够看到,每次提交都会包含提交id,提交人,提交日期,以及提交描述这四个信息。

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

当提交记录很是多的时候,咱们只想查看其中的某条记录,能够在该log命令的后面加上对应记录的id,并加上-l参数。即:git log [id] -l

而若是想要查看这条记录提交记录的具体修改了什么内容,能够继续加上-p参数。即:git log [id] -l -p

 

4、版本回退:

咱们如今进行第二次修改,也就是说,在布局文件中添加一个按钮button2,而后执行git log命令,显示效果以下:

上图显示,咱们总共进行了三次提交。

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。执行以下命令进入可视化界面:

gitk

 执行后弹出以下界面:

如今开始咱们的版本回退工做。

首先,Git必须知道当前版本是哪一个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,固然往上100个版本写100个^比较麻烦,因此写成HEAD~100。

【新版本回到旧版本】

如今,咱们从“版本3”回退到上一个版本,即回退到“版本2”,就可使用git reset命令:

git reset --hard HEAD^

执行效果以下:

--hard参数有啥意义?这个后面再讲,暂时先放心使用。

再执行git log命令,发现版本三已经不见了:

【旧版本回到新版本】

若是如今要从“版本2”回到“版本3”,该怎么办呢?办法其实仍是有的。

只要上面的命令行窗口尚未被关掉,就能够顺着往上找,只要找到版本3的id号就好了,即输入以下命令:

git reset --hard 508972a

版本号不必写全,写前7位就能够了,Git会自动去找。

若是你想回退到某个版本,可是电脑已经关闭了,这个时候已经找不到新版本的commit id了,该怎么办呢?办法老是有的。Git提供了一个命令git reflog用来记录你的每一次命令。即输入以下命令:

git reflog

因而,咱们终于找到了版本三的commit id。又能够输入一样的命令回到版本三了。

如今咱们能够作一个总结了:

  • HEAD指向的版本就是当前版本,所以,Git容许咱们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log能够查看有哪些版本,以便肯定要回退到哪一个版本
  • 要重返将来,用git reflog查看命令历史,以便肯定要回到将来的哪一个版本

 

5、工做区和暂存区的概念:

Git和其余版本控制系统如SVN的一个不一样之处就是有暂存区的概念。

  • 工做区(Working Directory):就是你在电脑里能看到的目录;
  • 版本库(Repository):工做区有一个隐藏目录“.git”,这个不算工做区,而是Git的版本库

Git的版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。

注:分支和HEAD的概念稍后再说。

咱们把文件往Git版本库里添加的时候,是分两步执行的:

  • 第一步是用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区
  • 第二步是用“git commit”提交更改,实际上就是把暂存区的全部内容提交到当前分支

由于咱们建立Git版本库时,Git自动为咱们建立了惟一一个master分支,因此,如今,commit就是往master分支上提交更改。能够简单理解为,须要提交的文件修改统统放到暂存区,而后,一次性提交暂存区的全部修改。一旦提交后,若是你又没有对工做区作任何修改,那么工做区就是“干净”的。即:nothing to commit (working directory clean)。

注:用“git diff HEAD -- filename”命令能够查看工做区和暂存区里面最新版本的区别。

关于远程仓库的使用,咱们将在下一章节中进行讲解。

 

本文参考连接:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743858312764dca7ad6d0754f76aa562e3789478044000

相关文章
相关标签/搜索