Git介绍及基本操作
Git基本概念
在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新。
现在我们已经知道什么是repository(缩写repo)了,假如我们现在建立一个仓库(repo),那么在建立仓库的这个目录中有一个“.git”的文件夹。这个文件夹非常重要,所有的版本信息,更新记录,以及Git进行仓库管理的相关信息全部保存在这个文件夹里面。所以,不要修改/删除其中的文件,以免造成数据的丢失。
进一步的讲解请参考下面一张图,大概展示出了我们需要了解的基本知识。

根据上面的图片,下面给出了每个部分的简要说明:
- Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
- WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
- .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
- Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
- Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
- Stash:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
有了上面概念的了解,下面就开始在本地repo上进行Git操作了。
创建仓库
通过“Git Bash”命令行窗口进入到想要建立版本仓库的目录,通过“git init”就可以轻松的建立一个仓库。



这时,我们的仓库中会自动的产生一个“.git”文件夹,这个就是我们前面提到的Git管理信息的目录。
添加
现在我们在仓库中新建一个“test.txt”的文本文件,内容如下。
123
123

通过"git status"可以查看WorkSpace的状态,看到输出显示"test.txt"没有被Git跟踪,并且提示我们可以使用"git add <file>..."把该文件添加到待提交区(暂存区)。
注意,如果添加到暂存区,这时的更新只是在WorkSpace中。

使用"git add test.txt"或者"git add .",然后继续查看WorkSpace的状态。这时发现文件已经被放到暂存区。
这时的更新已经从WorkSpace保存到Stage中。

最后,我们就可以通过“git commit -m”来提交更新了。-m后面跟的是对commit的描述(message)。
这时的更新已经从Stage保存到了Local Repo中。

通过上面的操作,文件"test.txt"就成功的被添加到了仓库中。
更新
假设现在需要对"test.txt"进行更新,修改文件后,查看WorkSpace的状态,会发现提示文件有更新,但是更新只是在WorkSpace中,没有到暂存区中。
莫语常言道知足,万事至终总是空。
理想现实一线隔,心无旁骛脚踏实。
谁无暴风劲雨时,守得云开见月明。
花开复见却飘零,残憾莫使今生留。

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

注意,只有被add到暂存区的更新才会被提交进入repo。提交前,如果对WorkSpace的文件进行修改,而没有被添加到暂存区,那么提交进repo中的只是暂存区的更新,WorkSpace修改的部分不会提交进repo中的。
git diff
"git diff"是个很有用,而且会经常用到的命令,用于显示WorkSpace中的文件和暂存区文件的差异。先将我们之前的test.txt文件中的内容改成纯数字然后提交到repo中,中文字符运行该命令会显示乱码。
123
123
接下来修改成下面内容,我们通过"git diff"可以查看WorkSpace和Stage的diff情况,当我们把更新add到Stage中,diff就不会有任何输出了。
123
123 456
456

当然,我们也可以把WorkSpace中的状态和repo中的状态进行diff,命令如下。
git diff HEAD~n
撤销更新
根据前面对基本概念的了解,更新可能存在三个地方,WorkSpace中,Stage中和repo中。下面就分别介绍一下怎么撤销这些更新。
撤销WorkSpace中的更新
接着上面的例子,先将test.txt中的文本设置如下内容,并提交。
abc
abc
然后将test.txt中的内容进行修改:
abc
123
bca
321

我们可以使用"git checkout --<file>..."来撤销WorkSpace中的更新。执行test.txt中的文本会变成两行"abc"。

注意:使用这种方法撤销更新的时候一定要慎重,因为通过这种方式撤销后,更新将没有办法再找回。
撤销Stage中的更新
由于上个步骤,我们将test.txt修改撤销了。这里再次修改为下面内容,并且使用了"git add"把这个更新提交到了暂存区。这时,"git status"的输出中提示我们可以通过"git reset HEAD <file>..."把暂存区的更新移出到WorkSpace中。
如果想继续撤销WorkSpace中的更新,请参考上面一步。
abc
123
cba
321

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

撤销提交有两种方式:使用HEAD指针和使用commit id
在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本,我们使用"HEAD^",那么再钱一个版本可以使用"HEAD^^",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
git rest --hard HEAD^
git rest --hard HEAD~1
git rest --c2760c5512bc67a8b990c1da508d40cca623f23

再次查看,发现最新的提交已经被撤销了,查看test.txt中的文件,发现内容又变成两行"abc"文本。
那么问题就来了,我现在又想恢复被撤销的提交,当然Git是支持这样的操作。
下面来看看"git reflog"这个命令。"git log"只是包括了当前分支中的commit记录,而"git reflog"中会记录这个仓库中所有的分支的所有更新记录,包括已经撤销的更新。

有了这个,我们就可以恢复撤销操作。
git reset --hard HEAD@{1}
git reset --hard f752570
再次查看,发现我们撤销的内容已经回来了。

--hard和--soft
前面在使用reset来撤销更新的时候,我们都是使用的"--head"选项,其实与之对应的还有一个"--soft"选项,区别如下:
--head:撤销并删除相应的更新
--soft:撤销相应的更新,把这些更新的内容放到Stage中
删除文件
在Git中,如果我们要删除一个文件,可以使用下面的命令,"git rm"相比"rm"只是多了一步,把这次删除的更新发到Stage中。
rm <file>
git rm <file>

Git介绍及基本操作的更多相关文章
- Git与TortoiseGit基本操作
Git与TortoiseGit基本操作 1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(C ...
- CI 知识 :Git介绍及常用操作
Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...
- git介绍-常用操作(一)
Table of Contents 1 系列文章 2 git说明 3 git常用命令 3.1 基本操作 3.2 远程操作 4 查看git的配置 4.1 查看已配置项 4.2 其他配置 ...
- git常用命令-基本操作
git常用命令-基本操作 1) 新增文件 新增了Test_1.java git add Test_1.java git commit –m “新增了Test_1.java” git push ...
- git 分支的基本操作
git分支的基本操作. 创建私有分支: $git branch branchName commitID $git checkout -b branchName commitID 注意: ...
- Git介绍及常用操作演示(一)--技术流ken
Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发 ...
- 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]
Learn Android Studio 汉化教程 [翻译]Git介绍 Git版本控制系统(VCS)快速成为Android应用程序开发以及常规的软件编程领域内的事实标准.有别于需要中心服务器支持的早期 ...
- 【转】Git介绍
版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业论文_修改2.doc 毕业论文_修改3. ...
- git介绍和常用指令
Git介绍和常用指令 介绍:Git和SVN一样都是版本控制工具.不同的是Git是分布式的,SVN是集中式的.Git开始用可能感觉难点,等你用习惯了你就会觉得svn是有点恐怖.(如果一个项目有好多人一起 ...
随机推荐
- s5_day11作业
# 1 文件内容如下,标题为:姓名,性别,年纪,薪资 # # egon male 18 3000 # alex male 38 30000 # wupeiqi female 28 20000 # yu ...
- vue-cli的utils.js文件详解
转载自:http://www.cnblogs.com/ye-hcj/p/7078047.html utils.js文件 // 引入nodejs路径模块var path = require('path' ...
- flex graphiclar symbol的不同比例尺切换
private var cityGraL:GraphicsLayer;//标记城市 maxScale=50000 private var siteGraL:GraphicsLayer;//标记站点 m ...
- Entity FrameWork Code First无法生成数据库 解决办法
我是控制台应用程序,没有connectionStrings,试了几个方法也都不可以. 这是别人的博客用其他方法. http://www.cnblogs.com/Gyoung/archive/2013/ ...
- [mongodb] MMAPv1 Storage Engine
MMAPv1 是mongodb 在3.2以前默认的存储引擎,在3.2 之后默认的存储引擎为WiredTiger,MMAPv1存储引擎基于内存映射文件,它擅长高容量的插入,读取和更新. Journal ...
- iOS日常学习 - App之间常用的五种通信方式及适用场景总结
本文为转载学习,原文地址 iOS系统是相对封闭的系统,App各自在各自的沙盒(sandbox)中运行,每个App都只能读取iPhone上iOS系统为该应用程序程序创建的文件夹AppData下的内容,不 ...
- 基于mysql数据库集群的360度水平切割
1.why sharding? 我们都知道,信息行业发展日益迅速,积累下来的数据信息越来越多,互联网公司门要维护的数据日益庞大.设想一下,假如腾讯公司只用一个数据库的一张表格来存储所有qq注册用户的登 ...
- struts2——文件下载自定义文件名,包括中文
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- handle 机制的原理是什么
作者:milter链接:https://www.zhihu.com/question/19703357/answer/107984017来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- Pandas系列
系列(Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组.轴标签统称为索引. pandas.Series Pandas系列可以使用以下构造函数创建 - p ...