原文:http://www.cnblogs.com/wilber2013/p/4189920.html

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本地仓库的更多相关文章

  1. Git本地仓库与远程github同步的时候提示fatal: remote origin already exists 错误解决办法

    Git本地仓库与远程github同步的时候提示fatal: remote origin already exists 错误解决办法 1.git在本地的电脑创建了仓库,要远程同步github的仓库.使用 ...

  2. Git - Git本地仓库与GitHub远程仓库关联

    前言 Git本地仓库与GitHub仓库的关联逻辑如下 创建Key 在本地仓库下,新建Key文件夹,然后打开Key文件夹,单击鼠标右键,选择Git Bash Here. 输入命令:ssh-keygen ...

  3. 创建Git本地仓库

    一.获取Git仓库 安装好Git后即可创建Git本地仓库,开始项目的版本管理.有两种方法取得Git项目仓库:1.在现有项目或目录下导入所有文件到Git中:2.从一个服务器克隆一个现有的Git仓库. 1 ...

  4. Git本地仓库和远程仓库冲突解决

    场景描述: 在本地创建了一个git repo,并且执行了,git init命令,创建了.gitignore文件,或者README.md文件: 在远程创建了一个git repo,创建时也初始化了.git ...

  5. git本地仓库与github远程仓库链接协议问题

    前提条件:有github账号,本地安装了git,能上网. 环境:ubuntu14.0.4LTS 首先在你得在github上创建一个仓库new repository,然后再本地创建一个文件夹mkdir ...

  6. Git本地仓库push至GitHub远程仓库每次输入账户密码问题解决(亲测可行)

    在使用git push命令将本地仓库内容推送至GitHub远程仓库的每一次git都要让我们输入GitHub的用户名和密码.这着实让我们心烦.我们会有疑问,我明明设置了公钥呀!怎么还需要输入账户和密码? ...

  7. GitHub创建仓库,并与git本地仓库关联

    登录后头像右上角点击: 起名再create 后 会跳转到下面页面: 先在git上复制执行第一条指令,创建一个readme文档 然后再用第二条初始化仓库 第三步将readme文档添加至暂存区 然后提交一 ...

  8. [git] 本地仓库信息的查询

    本地仓库信息查询操作 1.1  git status 查看当前暂存区状态 git  status 显示当前分支信息: 提交的目的分支信息: git 管理的有修改的文件: 当前仓库未被 git 管理的文 ...

  9. IDEA如何初始化Git本地仓库,并提交到远程仓库

    本文转载自:http://blog.csdn.net/two_people/article/details/77008593 1. 首先在远程仓库上新建一个项目,码云和github都可以,我这里使用的 ...

随机推荐

  1. CAD2015安装教程 AutoCAD2015中文版安装激活图文教程

    28年来,Autodesk一直在坚持不懈地帮助客户提高设计流程效率.AutoCAD提供了可靠的三维自由形状设计工具以及强大的绘图和文档制作功能,在全球拥有数百万用户. autocad2015具有广泛的 ...

  2. Linux文件标示

    平时在使用ls -l时可以看到 [root@myserv /]# ls -l total 28 drwxr-xr-x 3 root root 21 Sep 17 11:29 app lrwxrwxrw ...

  3. Docker - Docker国内镜像的配置及使用

    Docker国内镜像 DaoCloud - Docker加速器 阿里云 - 开发者平台 微镜像 - 希云cSphere 镜像广场 - 时速云 灵雀云 网易蜂巢 阿里云的Docker加速器 阿里云 - ...

  4. 对于placeholder浏览器兼容性(包括密码输入框)解决办法

    将以下脚本和样式引入你的页面(对于密码输入框,要设置ID属性值): <script type="text/javascript"> $(function () { // ...

  5. js获取图片的真实大小,字节大小

    在我们上传文件的时候,很多时候都要对他做限制,那么怎么在文件上传的时候,就获得这个文件的大小呢?至少在js前台有一个判断的时候,就不会给后台造成更大的压力了,下面就用js来获得文件的大小 <ht ...

  6. 基于HTML5的WebGL呈现A星算法3D可视化

    http://www.hightopo.com/demo/astar/astar.html 最近搞个游戏遇到最短路径的常规游戏问题,一时起兴基于HT for Web写了个A*算法的WebGL 3D呈现 ...

  7. JavaScript基础—插曲02

    Js学习基础 1:关于js中的数组 这里面可以是键值对的形式来存储的,我们必须利用forIn来输出,这就相当于foreach一样. var dir = new Array(); dir['0'] = ...

  8. 【转载】使用Lucene.NET实现数据检索功能

    1.索引的管理 //指定索引库文件存放文件位置 FSDirectory directory = FSDirectory.Open(new DirectoryInfo(this.IndexDataDir ...

  9. winform水平滚动条联动panel

    需求: 滚动滚动条时显示pnlBack里面的button 文本框里输入数字,改变每行显示的按钮数 源码如下: /// <summary> /// 窗体加载 /// </summary ...

  10. 使用GitHub for Windows客户端管理京东代码库项目

    1.下载并安装 GitHub for Windows 客户端 https://windows.github.com/ 2.在京东代码库中新的代码库,可以创建私有的代码库 https://code.jd ...