上一篇介绍了Git中的一些基本概念。本篇来实际看一看如何通过几个常用命令来快速上手Git,完成版本管理的日常操作(核心操作)。

0. 准备工作

安装Git后,请先在你的电脑上新建或选择一个目录作为测试用,本教程大部分操作都将在该目录下完成。

另外,我们的操作都是在命令行下完成的,如果你用的是Windows,可以通过右键菜单打开Git Bash这个Git命令行环境:在资源管理器中进入该目录,点击右键,在右键菜单中点击“Git Bash”即可打开Git Bash并自动定位到当前目录下:

1. 简单配置

进入你的测试目录,在Windows中用前面的方法打开Git Bash后就已经在测试目录下了。接下来,由于这是安装后第一次运行Git,我们需要做一点简单配置:

$ git config --global user.name "your name"
$ git config --global user.email "your email"

为了在多人合作时能区分每个人的身份,所以我们需要告诉Git我们是谁。Git有很多设置选项,只有名字和email是一开始就必须设置的,其他大部分都是用来提高工作效率的,我们暂时不去关心。

这里简单解释一下这个命令,Git的所有命令都遵循相同的格式:

  • $是命令提示符,本篇中会在介绍每个命令时以该字符开头,这样就能很方便地知道这是一条命令了
  • git是主命令,用来告诉Shell我想运行git程序
  • config是子命令。Git中的操作都是通过子命令来完成的,git命令本身基本不做什么事情,它根据指定的子命令调用相应的子程序来干活。请记住Git的这种工作模式,后面我在称呼Git命令时会忽略git这个主命令,直接用xx命令来称呼子命令。例如config命令add命令commit命令等等
  • 再后面的就是传递给子命令的具体参数了。后面在介绍具体命令的时候会同时介绍一些常用参数。

2. 创建版本库

下面就来在我们的测试目录中创建一个版本库玩玩。创建版本库非常简单:

$ git init

不需要任何参数,只要一个init命令就可以在当前目录下创建一个版本库。成功后,就会在当前目录下生成一个隐藏的.git目录,这个就是Git的版本库,而当前目录就成为了工作区。

现在版本库还是全新的,里面只有少量的初始配置数据,还没有任何的版本提交记录等信息。工作区暂时也是新的,里面还没有需要被Git管理的文件。

3. 修改与提交

现在我们在当前目录(工作区)中随意创建一个文件例如hello.c。好了,这个文件目前已经处于Git的“监管”中了。你在该文件中所做的任何改动都会被Git看在眼里。

现在就来试一试,用你喜欢的任何编辑器打开该文件,在里面输入一段内容并保存,然后在Git Bash中输入以下命令:

$ git status

显示结果如下:

status命令用来显示工作区当前的状态,例如有哪些文件有改动,哪些文件是新增的等等。从结果可以看出来,工作区中新增了一个hello.c文件,并且该文件正处于untracked状态。

untracked的意思是这个文件正被Git“监视”着,但还没有记录在案。这时候如果你删除了新创建的文件,或者在编辑器中把最新的修改撤销掉了,Git的态度是“事不关己高高挂起”的。

要想让文件真正被Git管理起来,我们需要把这个文件提交到版本库中。也就是让Git把关于这个文件的一些信息记录下来,比如什么时候修改的,由谁修改的、修改了哪些内容,等等。向版本库中提交一个文件需要2个步骤,以我们刚才创建的hello.c文件为例:

$ git add hello.c

$ git commit -m "create hello.c"

第一步add命令用来将文件标记为可以提交的,从而消除了文件的untracked状态。你可以在执行commit命令之前用add添加任意数量的文件,这样下次commit时就会将这些文件一起提交到版本库。实际上,add命令会把文件添加到一个叫做暂存区(stage)的地方,暂存区是版本库中的一个临时场所,如下图所示(图片来自廖雪峰老师的网站):

文件从添加到暂存区开始就会受到Git的保护,假如工作区中该文件丢失了,我们可以从暂存区中恢复它。

暂存区的另一个主要功能或者说优点是它可以用来标记出哪些文件是需要提交的而哪些是暂时不想提交的。因为有时候我们的工作区中有很多文件都被修改过,但某一次提交可能只想提交其中的一部分,其他的,例如还没有最终完成的功能,或者一个只修复了一半的bug等,这些文件我们暂时不想提交。这是很常见的情况,利用暂存区可以很方便地满足这种需求。

暂存区只是临时的,我们的最终目标是将修改后的文件提交到版本库中。commit命令用来将暂存区中的文件提交到版本库,并且在版本库中形成一个新的版本记录。commit需要一个-m参数,用来对本次提交做出说明。例如提交了哪些文件、修改了什么地方、或者修复了哪个bug等。默认情况下说明信息是必需的,为每次提交写一点描述也是一个很好的习惯,我们应当养成并坚持这一习惯。

4. 比较修改前后的差异

很多时候,我们在决定将一个文件提交到版本库之前希望能够确认一下修改的内容。这时候就可以使用diff命令:

$ git diff hello.c

Git提供的diff命令和Linux下常用的diff差不多,输出格式也基本一样。如下图所示:

diff命令会将工作区中该文件的内容与暂存区中内容或版本库中最后一次提交的内容做对比,并显示两者的差异。如果这个文件之前被添加到了暂存区但还没有提交,那么比较的将是工作区和暂存区之间的差异;否则就会比较工作区和版本库中最后一次提交的内容之间的差异;如果暂存区和版本库中都没有该文件的记录(例如文件是新建的)那么将不会执行比较(什么都不显示)。

从图中可以看出来,相比上次提交,hello.c文件新增加了一行:# I will code it later^M(这个^M了解Windows和Linux差异的应该都清楚吧)。

5. 另一种创建版本库的方法:克隆

init用来创建一个全新的版本库。但有时候我们并不是想创建一个新的版本库,而是希望将别的地方已有的版本库复制一份过来。例如公司的代码服务器上的公共版本库,你希望将其复制一份到自己的电脑上。或者你希望把你在GitHub上的某个版本库复制一份到本地,等等。

这时候,我们就可以使用克隆命令,命令中的url是要克隆的版本库的访问地址:

$ git clone url

关于这个后面介绍GitHub时再细说。

6. 总结

本节介绍了以下几个常用命令:

  • status命令用来查看工作区的当前状态
  • init命令用来在当前目录下初始化一个版本库
  • diff命令用来比较文件在工作区和版本库(或暂存区)之间的差异
  • add命令用来将工作区中修改过的文件添加到暂存区
  • commit命令将暂存区中的文件提交到版本库
  • clone命令是另一种创建版本库的方法,它将另一个版本库复制一份到当前目录下(clone命令暂时只需了解即可)

Git中最常见的一组操作是修改文件->比较差异->放到暂存区->提交到版本库,掌握了这几个操作对应的命令以后就算入门了,可以初步利用Git管理你的代码了。

下一节会更介绍另外几个实用的命令,从而更好地完成修改->提交操作。

如果觉得本文对你有帮助请顺手点个赞吧

Git简明教程二、开始进行版本管理的更多相关文章

  1. Git简明教程一、基本概念

    文本是写给新手的Git入门教程.本文的目的是让新手能够快速了解并开始使用Git,因此只会介绍最基本.同时也是最核心的知识.其中包括使用Git的基本步骤和Git中最常用的命令,以及如何使用GitHub托 ...

  2. Git系列教程二 基础介绍

    一.存储方式 如果让我们设计一个版本控制系统,最简单的方式就是每做一次更改就生成一个新的文件. 这样的方式太占用空间,所以传统的版本控制系统都是保存一个文件的某个版本的全部内容以及其他版本相对于这个版 ...

  3. git学习教程二之远程仓库学习

    首先你需要注册一个github用户名,我的github账户是:1654218052@qq.com 由于本地的git仓库和github的仓库是通过SSH加密的,所以我们还需要设置一点东西哦 第1步:创建 ...

  4. 【笔记】Git简明教程

    前言 Git这个东西我曾经有学过,但学的内容太多了,有点懵,不太理解,磕磕碰碰的,走了不少弯路.不过最近我在B站上发现了一个讲的很好的教程:<表严肃讲Git>.因此,我决定用文字的方式分享 ...

  5. Git 简明教程

    其他Git资料: Git Community Book 中文版

  6. ZH奶酪:Git简明教程

    这里是原网站:https://try.github.io/levels/1/challenges/1 这篇博文就当是笔记+翻译吧. 几个名词相关 changes:变更 repository:仓库 st ...

  7. [Git高级教程(二)] 远程仓库版本回退方法 - 梧桐那时雨 - CSDN博客

    1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 问题 如果提交了一个错误的版本,怎么回退版本? 如果提交了一个错误的版本到远程分支,怎么回退远程分支 ...

  8. Git简明教程

    http://www.jianshu.com/p/16ad0722e4cc http://www.jianshu.com/p/f7ec8310ccd2

  9. HTML简明教程(二)

    HTML简明教程(二) 一.HTML 图像 二.HTML 表格 三.HTML 列表 四.HTML div和 span 五.HTML 布局 六.HTML 表单和输入 七.HTML 框架 八.HTML内联 ...

随机推荐

  1. 【题解】新型城市化 HAOI2017 网络流 二分图最大匹配 强连通分量

    Prelude 好,HAOI2017终于会做一道题了! 传送到洛谷:→_→ 传送到LOJ:←_← 本篇博客链接:(●'◡'●) Solution 首先要读懂题. 考场上我是这样想的QAQ. 我们把每个 ...

  2. tp5.1 高级查询之 表里2字段比较大小

    $map = [ 'status' => 1, 'is_show' => 1,]; $result = Db::name('coupon') ->where($map) ->w ...

  3. a标签--超链接

    一.链接到其他网站 <body> <a href="https://www.baidu.com" target="_blank">百度& ...

  4. python3.6爬虫总结-01

    1. HTTP 简介 HTTP常见状态码 200/OK: 请求成功 201/Created: 请求已被实现,且一个新资源已根据请求被建立,URI跟随Location头信息返回. 202/Accepte ...

  5. python---函数补充(变量传递),语句执行顺序(入栈顺序)

    一:函数补充 默认作为函数参数的数据,是浅拷贝传递.不是和C等语言一样,产生一个临时变量. class T: def __init__(self,num): print(id(num)) self.n ...

  6. Git之原有基础开发新功能

    场景描述 当一个项目已经上线,同时又在原有基础上新增功能模块,于是乎就要在原有代码的基础上进行开发,在新增模块功能的开发的过程中,项目发现了一个紧急Bug,需要修复.操作流程如下:

  7. a标签伪元素选择器

    a{ color: black; } /*未访问的链接*/ a:link{ color: red; } /*访问过的链接*/ a:visited{ color: green; } /*鼠标经过时*/ ...

  8. JedisCluster实践

    1. Spring中运用JedisCluster http://blog.csdn.net/u010739551/article/details/52438101[spring集成 JedisClus ...

  9. maven本地库更新失败

    当我们在项目中遇到有些依赖在第三方仓库特别是maven仓库里面没有的时候我们会怎么办? 答案1.通过私服,上传到公司的一个私服上然后进行下载 答案2.通过本地安装,这样非常方面进行使用,今天我们就采用 ...

  10. 多角度看.NET面试题

    1.ASP.NET中的身份验证有那些?你当前项目采用什么方式验证请解释        身份验证是从用户获取名称和密码等标识凭证并根据某些机构验证这些凭据的过程.如果凭据有效,则提交该凭据的实体被视为通 ...