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的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”命令可以查看工作区和暂存区里面最新版本的区别。

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

时间: 2024-11-02 02:38:46

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

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

[正文] 一.初识Git: Git是目前世界上最先进的分布式版本控制系统(没有之一).它的开发者就是大名鼎鼎的Linux操作系统的作者Linus Torvalds.Git被开发出来的初衷是为了更好的管理Linux内核,而现在却广泛应用于各种项目中.Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等. 那那什么是版本控制系统呢?如果有一个软件,不但能自动帮我记

Git 2.8改进子版本库、身份处理和Windows支持

近日发布的Git 2.8带来了许多新特性.改进和Bug修复.其中,最值得注意的是子版本库并行获取.Git用户身份处理方式改进以及更好的Windows支持. 子版本库并行获取允许一次获取多个版本库,旨在减少获取版本库及其所有相关子版本库所需的时间.这可以通过使用新增的--jobs选项来实现,例如: git fetch --recurse-submodules --jobs=4 据Git团队介绍,对于包含许多子版本库的版本库,这可以大大增加更新速度.当使用--recurse-submodules而不

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

[正文] 即使是周末,也不能停止学习的脚步,在之前的两篇文章中,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了.今天就来一起学习一下大名鼎鼎的GitHub网站是怎么用的.如果网站进不去,该怎么做你懂得.如果不嫌弃的话,可以用我的邀请链接:http://honx.in/i/U-mc6Oz5NGRmLX2S   这样的话,双方都能加十天的有效期,嘿嘿~~~ 一.GitHub的引入:                                   

【SVN】(二)版本库导入新文件或目录(2015-12-17)

1.svn import 将本地zg2目录导入版本库/svn/op/运维问题/center/,import还可以递归创建不存在但指定的目录 svn import -m "new import" zg2/ https://svn.jidongnet.com/svn/op/运维问题/center/zg2 2.中心机脚本目录同步到svn 将/root/下的脚本上传至https://svn.jidongnet.com/svn/op/运维问题/center/,删除原目录并checkout到/ro

使用SOURCETREE建立本地GIT版本库教程

使用git可以方便进行版本管理,那么本地项目如何加入到git版本库中,从而使用git命令或sourcetree工具进行版本管理呢? 首先,打开sourcetree,点击"命令行模式".这个在命令行模式下操作更为方便. 以windows环境为例,比如有一个WEB项目在路径:D:\xampp\htdocs\yii2中,先把这个文件夹移到D盘下,然后在原先目录再新建一个yii2的空文件夹. 通过命令行进入到D盘下的yii2文件夹,如: cd yii2 然后使用git的init命令建立版本库,

GIT用服务器上的版本强制覆盖掉本地的版本(转)

以前在机子上使用git下载了linux git版本库上的源代码,由于在阅读源代码的过程中,难免会对本地的文件进行修改,这样就导致本地文件与服务器上的文件版本不一致,我想做的就是用服务器上的版本强制覆盖掉本地的版本: 我得到的错误消息如下:                             从图中可以看到,git fetch和git pull的区别, git fetch 不会自动的将结果merge到本地,只是将远程版本同步到本地版本库,而不会merge到本地副本. git pull  将会直

《走进git时代系列二》 从SVN迁移到GIT教程

本篇文章是走进git时代系列之二,如何迁移到GIT的教程, 不了解GIT的同学可以先看系列一<走进git时代系列一> 你该怎么玩? 本文分为以下几部分内容: SVN 迁移到 Git 的简单原理 图文教程从TaoCode SVN 迁移到 YunCode Git 如何混用SVN+GIT SVN 迁移到 Git 的简单原理 本文所涉及的工具只有一个 git-svn , 包含在1.7.1以上的git客户端版本内, 该工具详细介绍见: https://www.kernel.org/pub/softwar

《Puppet权威指南》——3.2 版本控制工具安装与配置

3.2 版本控制工具安装与配置 Puppet是一款配置管理工具,其优势不仅在于配置和管理线上系统文件,还可以利用版本控制工具对线上系统和配置文件进行版本控制,如图3-6所示.这样,当线上系统出现问题时可以根据版本控制工具进行及时回滚,而回滚的功能可以将配置文件回退到上一版本或历史的某一版本,快速的回滚可以让我们将故障时间降到最低.目前流行的版本控制工具有很多,在这里推荐两款版本控制工具--Subversion和Git,这两款工具各有优势,都可以与Puppet结合使用,本书中案例主要使用Subve

github版本库使用详细图文教程(命令行及图形界面版)_其它综合

Git是一个分布式的版本控制系统,作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法. > Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括 Rubinius和Merb在内的很多知名项目都使用了Git.Git同样可以被诸如Capistrano和