前面一篇文章简单介绍了Git,并前在Windows平台上搭建了Git环境,现在就正式的Git使用了。

Git基本概念

在开始Git的使用之前,需要先介绍一些概念,通过这些概念对Git有些基本的认识,这将会对我们后面的操作有很大的帮助。

在Git中,每个版本库都叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新。

现在我们已经知道什么是repository(缩写repo)了,假如我们现在建立一个仓库(repo),那么在建立仓库的这个目录中会有一个".git"的文件夹。这个文件夹非常重要,所有的版本信息、更新记录,以及Git进行仓库管理的相关信息全都保存在这个文件夹里面。所以,不要修改/删除其中的文件,以免造成数据的丢失。

进一步的讲解请参考下面一张图,大概展示出了我们需要了解的基本知识(注意,".git"目录中还有很多别的东西,图中并没有涉及,这里也不做解释了)。

根据上面的图片,下面给出了每个部分的简要说明:

  • Directory:使用Git管理的一个目录,也就是一个仓库;包含我们的工作空间和Git的管理空间。
  • WorkSpace:从仓库中checkout出来的,需要通过Git进行版本控制的目录和文件;这些目录和文件组成了工作空间。
  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
  • Index/Stage:暂存区,或者叫做待提交更新区;在提交进入repo之前,我们可以把所有的更新放在暂存区。
  • Local Repo:本地仓库,一个存放在本地的版本库;HEAD会指示当前的开发分支(branch)。
  • Stash:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

有了上面概念的了解,下面就开始在本地repo上进行Git的操作了。

创建仓库

通过"Git Bash"命令行窗口进入到想要建立版本仓库的目录,通过"git init"就可以轻松的建立一个仓库。

这时,我们的仓库目录中会自动的产生一个".git"文件夹,这个就是我们前面提到的Git管理信息的目录。

添加

现在我们在仓库中新建一个"calc.py"的文件,文件内容如下。

def add(a, b):
print a + b if __name__ == "__main__":
add(2, 3)

通过"git status"可以查看WorkSpace的状态,看到输出显示"calc.py"没有被Git跟踪,并且提示我们可以使用"git add <file>..."把该文件添加到待提交区(暂存区)。

注意,这时的更新只是在WorkSpace中。

使用"git add calc.py"或者"git add .",然后继续查看WorkSpace的状态。这是发现文件已经被放到暂存区。

这时的更新已经从WorkSpace保存到了Stage中。

最后,我们就可以通过"git commit -m"来提交更新了。-m后面跟的是对commit的描述(message)。

这时的更新已经又从Stage保存到了Local Repo中。

通过上面的操作,文件"calc.py"就成功的被添加到了仓库中。

更新

假设现在需要对"calc.py"进行更新,修改文件后,查看WorkSpace的状态,会发现提示文件有更新,但是更新只是在WorkSpace中,没有存到暂存区中。

def add(a, b):
print a + b def sub(a, b):
print a - b if __name__ == "__main__":
add(2, 3)

同样,通过add、commit的操作,我们可以把文件的更新先存放到暂存区,然后从暂存区提交到repo中。

注意,只有被add到暂存区的更新才会被提交进入repo。比如下面的一系列操作,操作结束后只有"multi"函数的更新会被提交到repo中,"div"函数的更新还在WorkSpace中。这点应该也是比较容易理解的。

def multi(a, b):
print a * b def div(a, b):
if b != 0:
print a / b

git diff

"git diff"是一个很有用,而且会经常用到的命令。基于上面的例子,我们通过"git diff"来查看WorkSpace和Stage的diff情况,当我们把更新add到Stage中,diff就不会有任何输出了。

当然,我们也可以把WorkSpace中的状态跟repo中的状态进行diff,命令如下,关于HEAD,将在后面解释。

git diff HEAD~n

撤销更新

根据前面对基本概念的了解,更新可能存在三个地方,WorkSpace中、Stage中和repo中。下面就分别介绍一下怎么撤销这些更新。

撤销WorkSpace中的更新

接着上面的例子,我们想撤销WorkSpace中的"div"函数的更新,可以看到"git status"的输出中有提示,我们可以使用"git checkout -- <file>…"(注意一定不要漏掉--)来撤销WorkSpace中的更新。

注意,在使用这种方法撤销更新的时候一定要慎重,因为通过这种方式撤销后,更新将没有办法再被找回。

撤销Stage中的更新

加入我们在WorkSpace中重新添加了"div"函数的更新,并且使用了"git add"把这个更新提交到了暂存区。这时,"git status"的输出中提示我们可以通过"git reset HEAD <file>..."把暂存区的更新移出到WorkSpace中。

如果想继续撤销WorkSpace中的更新,请参考上面一步。

撤销repo中的更新

介绍撤销repo中的更新之前,我们先看一下"git log"这个命令,通过这个命令我们可以查看commit的历史记录。可以看到我们进行的三次提交。

其中"WilberTian"和"Wilber***com"就是我们在前面一片文章中配置的用户名和邮箱。

假设我们现在要撤销"add mulit function in calc.py"这个提交,有两种方式:使用HEAD指针和使用commit id

在Git中,有一个HEAD指针指向当前分支中最新的提交,在上面的例子中HEAD就是对应1a72f49ae49c1716e52c12f2b93fdcef6aac0886(commit id)这次提交。

所以可以使用下面的命令来撤销"add mulit function in calc.py"这个提交。注意,当前版本,我们使用"HEAD^",那么再前一个版本可以使用"HEAD^^",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)

git rest --hard HEAD^

等价于

git rest --hard 1a72f49ae49c1716e52c12f2b93fdcef6aac0886

再次查看,发现"add mulit function in calc.py"的commit已经被撤销了,查看"calc.py"文件,"multi函数"也已经被删除了。

那么问题就来了,我现在又想要恢复"add mulit function in calc.py"这个提交了,当然Git是支持这样的操作。

下面来看看"git reflog"这个命令。"git log"只是包括了当前分支中的commit记录,而"git reflog"中会记录这个仓库中所有分支的所有更新记录,包括已经撤销的更新。

有了这个,我们就可以查找到"add mulit function in calc.py"提交,然后可以通过下面命令来恢复对"add mulit function in calc.py"的撤销操作。

git reset --hard HEAD@{}

等价于

git reset --hard 1a72f49

再次查看,发现我们的"add mulit function in calc.py"更新已经回来了。

--hard和--soft

前面在使用reset来撤销更新的时候,我们都是使用的"--hard"选项,其实与之对应的还有一个"--soft"选项,区别如下:

  • --hard:撤销并删除相应的更新
  • --soft:撤销相应的更新,把这些更新的内容放的Stage中

这里就不再对--soft进行演示了。

删除文件

在Git中,如果我们要删除一个文件,可以使用下面的命令,"git rm"相比"rm"只是多了一步,把这次删除的更新发到Stage中。

rm <file>
git rm <file>

删除操作还是很简单的,这里就不多做演示了。

总结

通过这篇文章,了解了Git的一些基本概念。

然后介绍了Git中常用的命令来操作本地repo,内容比较多,但是都是基本的,只要自己动手操作一遍就清楚了。

到这里,下面命令流图中的命令都已经被介绍到了。相信通过这些命令,我们已经可以对自己的本地repo进行Git的版本管理了。

最后,同样share出文章中的两个visio图

Git Step by Step – (2) 本地Repo的更多相关文章

  1. Git Step by Step – (8) Git的merge和rebase

    前面一篇文章中提到了"git pull"等价于"git fetch"加上"git merge",然后还提到了pull命令支持rebase模式 ...

  2. Git Step by Step – (6) Git远程仓库

    前面文章中出现的所有Git操作都是基于本地仓库的,但是日常工作中需要多人合作,不可能一直都在自己的代码仓库工作.所以,这里我们就开始介绍Git远程仓库. 在Git系统中,用户可以通过push/pull ...

  3. Step by step Dynamics CRM 2013安装

    原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处   SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...

  4. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

  5. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (二) 图片验证码的识别

    上一篇文章讲了“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 一 京东 商品搜索 ...

  6. enode框架step by step之消息队列的设计思路

    enode框架step by step之消息队列的设计思路 enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by ste ...

  7. Linux 学习 step by step (2)

      Linux 学习 step by step (2) Linux,想要我说爱你真的不容易了,尽管,你是ubutun,尽管,你有蛮界面.但是,操作你,还是没有操作windows那么的如鱼得水了.为了更 ...

  8. Devops step by step

    接着上次分享的devops历程[Followme Devops实践之路], 大家希望能够出一个step by step手册, 那今天我就来和手把手来一起搭建这么一套环境, 演示整个过程! 实验环境需要 ...

  9. Neural Networks and Deep Learning(week4)Building your Deep Neural Network: Step by Step

    Building your Deep Neural Network: Step by Step 你将使用下面函数来构建一个深层神经网络来实现图像分类. 使用像relu这的非线性单元来改进你的模型 构建 ...

随机推荐

  1. elasticsearch 服务安全配置

    elasticsearch安装与使用(5)-- search guard安装与配置   一.安装search guard插件必须要安装两部分: ①search-guard-xx ②search-gua ...

  2. SpringMVC接受JSON参数详解及常见错误总结

    SpringMVC接受JSON参数详解及常见错误总结 SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一 ...

  3. 在C++中调用DLL中的函数(2)

    本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...

  4. 关于Unity中表面着色器的使用

    写shader其实就是在两个工位顶点shader工位和着色shader工位插入代码,供GPU使用运行 表面着色器四个函数的入口 1:表面着色器包括4个函数: (1): 顶点变换函数; (2): 表面着 ...

  5. latin-1 codec cant encode characters in position 42-48: ordinal not in range256 下载文件时候报错

    python后端写下载文件, 这个时候出现了这个错误 latin-1 codec cant encode characters in position 42-48: ordinal not in ra ...

  6. Linux编程_Shell脚本练习题

    1,编写shell脚本,计算1~100的和. #! /bin/bash `;do sum=$[$i+$sum] done echo $sum 2,编写shell脚本,输入一个数字n并计算1~n的和. ...

  7. Java如何比较两个数组?

    在Java中,如何比较两个数组? 示例 以下示例使用equals方法来检查两个数组是否相等. package com.yiibai; import java.util.*; public class ...

  8. 采用MiniProfiler监控EF与.NET MVC项目

    今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC MiniProfiler是Stack Overflow团队 ...

  9. lua------------------Unity3D研究院编辑器之打开unity不可识别的文件(十三)

    Unity3D研究院编辑器之打开unity不可识别的文件(十三) 雨松MOMO [Unity3D拓展编辑器] 围观8597次 9 条评论 编辑日期:2017-03-02 字体:大 中 小   有些特殊 ...

  10. 嵌入式开发值zynq---zynq中tlv320aic23b spi的驱动移植

    http://blog.csdn.net/djason43/article/details/52876742 http://blog.csdn.net/lxmky/article/details/68 ...