【声明】

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

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

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

【正文】

在上一章节中,我们学习了关于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的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

四、版本回退:

我们现在进行第二次修改,也就是说,在布局文件中添加一个按钮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查看命令历史,以便确定要回到未来的哪个版本

五、工作区和暂存区的概念:

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

git版本控制工具(二)----本地版本库的常用操作的更多相关文章

  1. Git的使用(2) —— 本地版本库的操作

    1. 向本地版本库中添加文件 注意:.git文件夹是本地版本库,包含.git文件夹的目录叫工作目录,要往本地版本库中添加文件,就必须将文件放在工作目录中. (1) 把文件添加到工作目录中. (2) 右 ...

  2. Git 学习(二)版本库创建

    Git 版本库创建 什么是版本库(repository)? 可理解为文件仓库.由Git管理每个文件的新增.修改及删除,但这个仓库可以追溯历史.可还原至任意历史节点. 版本库创建 创建一个版本库非常简单 ...

  3. Git使用(二)版本库创建及文件修改

    一.创建版本库 1.安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功! 安装完成后,还需要最后一步设置,在命令行输入: $ gi ...

  4. git的使用(本地版本库)

    1. 创建版本库 1.1 创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录: 1.2通过git init命令把这个目录变成Git可以管理的仓库(git进入空目录的路径) $ git i ...

  5. TortoiseSVN搭建本地版本库及简单操作使用

    TortoiseSVN是windows上一款著名的版本控制软件,对于我们管理自己的代码,特别是对一个团队来说,非常重要. 本文探讨的是如何搭建本地的版本库. (1)安装TortoiseSVN之后需要创 ...

  6. TortoiseSVN 搭建本地版本库及简单操作使用

    TortoiseSVN是windows上一款著名的版本控制软件,对于我们管理自己的代码,特别是对一个团队来说,非常重要. 本文探讨的是如何搭建本地的版本库. (1)安装TortoiseSVN之后需要创 ...

  7. Git(2):本地版本库的一些操作

    参考链接:https://www.cnblogs.com/zhuwq585/p/6390542.html

  8. Git版本控制工具(一)----git的安装及创建版本库

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. Git版本控制工具(三)----远程仓库GitHub的使用

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. mysql bin-log和innodb_log的关系

    首先,二进制日志会记录所有与MySQL数据库有关的日志记录,包括InnoDB.MyISAM.Heap(memory除外)等其他存储引擎的日志.而InnoDB存储引擎的重做日志记录有关该引擎本身的事务日 ...

  2. 基于流的自动化构建工具------gulp (简单配置)

    项目上线也有一阵子,回头过来看了看从最初的项目配置到开发的过程,总有些感慨,疲软期,正好花点时间,看看最初的配置情况 随着前端的发展,前端工程化慢慢成为业内的主流方式,项目开发的各种构建工具,也出现了 ...

  3. FEE Development Essentials

    FEE Development Essentials JS Basic function call() and apply() func1.bind(thisObj,arg1...argn) Cust ...

  4. sqlserver 存储过程 try catch TRANSACTION (转)

    CREATE PROCEDURE YourProcedure    ASBEGIN    SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常    ...

  5. [ html canvas 模仿支付宝刮刮卡效果 ] canvas绘图属性 模仿支付宝刮刮卡效果实例演示

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  6. android 多屏幕适配 : 第一部分

    1.在xml布局文件中,控件的宽度和高度用  dp ;   字体大小用 sp 2.根据屏幕的宽高来动态的适配 , 获取屏幕的宽高的两种方法: 第一种方法: /** * 屏幕的宽度 * 屏幕的高度 * ...

  7. 【读书笔记】iOS-开发技巧-三种收起键盘的方法

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  8. Effective Java 15 Minimize mutability

    Use immutable classes as much as possible instead of mutable classes. Advantage Easy to design, impl ...

  9. IE8下解决position:flxed无效的问题

    只需将文档类型声明改成如下方式即可 <!DOCTYPE html>

  10. C# List与DataTable的相互转化

    List与Data的转化比较简单,网上也很多.但是大多都有一个Bug:当实体类有可空类型的属性时,转化会出异常(DATASET不支持System.Nullable异常) 下面的方法可以避免出现这个问题 ...