Git 本地仓库(Repository)详解

大纲:php

1、前言java

2、概述git

3、在Windows上安装Gitgithub

4、建立本地仓库bash

5、本地仓库管理详解服务器

6、总结运维

注,测试机 CentOS 5.5 x86_64,Git 服务器版本:git version 1.8.2.1,客户端版本:git version 1.9.2.msysgit.0。全部软件请到这里下载:http://msysgit.github.io/分布式


1、前言ide

原本呢,其实呢。我觉得Git也就几个命令,没什么难的。因而就到网上找了些文章看看,发现这些文章可贵不知道该说什么好。不是简单的写几个命令,就是直接复制粘贴手册中的内容,没有一点连续感,不知道从何学起。总之呢,我想写一个什么都不会的朋友能看懂的、初学朋友能看懂的、运维能看懂的、开发也能看懂的,看完就能干活的教程。svn


2、概述

这个教程呢,有几个部分先和你们说一下:

  • Git 本地仓库详解

  • Git 远程仓库详解

  • Git 分支管理详解

  • Git 标签管理详解

  • GitHub 使用详解

  • Git 全局配置详解

  • Git与GitHub总结

注,本教程呢,只能让你会使用Git干活,至于你呢想深刻了解Git,或者想成为Git领域的专家哟,我想说这只是个起步。还有我想说Git只是个工具嘛,目的只是为了提升咱们的工做效率,咱们没有必要去,也不须要学浪费时间在研究工具上,只要咱们会用就好,嘿嘿!也许有博友不一样意啊,只是我的看法啊,勿喷啊!


3、在Windows上安装Git

注,你们请到这里下载:http://msysgit.github.io/。具体的安装过程我就不演示了,直接双击安装便可。安装完成后桌面上会生成一个Git bash图标,双击打开会弹出一个相似命令行窗口的东西,你们请看下图:

git bash

好了,到这里咱们的Git就安装完成了,嘿嘿!下面咱们来进行基本配置:

git config

$ git config --global user.name "Your Name"
$ git config --global user.email “email@example.com”

注,我这里根据个人状况设置以下(如上图):

$ git config --global user.name "chenmingqian"
$ git config --global user.email “mingqian_chen@163.com”

咱们在上一篇文章说过Git是分布式控制系统,因此,每一个客户端都必须设置:你的名字和邮箱。这样才容易区分是哪一个用户提交的Git版本,嘿嘿!你们能够看到git config 后面接的是--global参数,这表示你的机器上全部的Git仓库都会使用这个配置,但你也能够对不一样的仓库指定不一样的用户名和邮箱。这个咱们会在后面的文章中讲解,这里不做说明,嘿嘿!有兴趣的博友能够先提早google一下。


4、建立本地仓库

1.版本库又称仓库

版本库或者是仓库,英文名Repository,其实啊说白了就是一个目录并且,这个目录中的因此文件都被git管理并且,无论你作什么操做都会被记录,包括:增长、删除、修改文件等,都会被记录下来,以便后来跟踪与修改相关记录,甚至被还原。好了,下面咱们就在咱们客户端(我这里演示的是Windows客户端,其它客户端操做同样)中建立一个版本库:

mkdir

你们能够看到咱们在/c/Users/root/下建立一个空目录pro便可project简写。还有一点须要说明的在Windows系统中目录名称不要使用中文,否则会出现神马问题,我不负责。嘿嘿^_^……


2.目录变成仓库

git init

执行git init命令,便可Initialized empty Git repository in c:/Users/root/pro/.git/,初始化一个空目录,路径为c:/Users/root/pro/.git/。你们能够看到pro目录中生成了一个隐藏目录 .git目录,进入目录中你们能够看到里面有不少文件,没事不要修改或者改动里机的文件,这里面的文件就是控制和管理版本库的,嘿嘿。至于里文件的具体做用咱们会在后面的文章中讲解,想提早了解的朋友能够先google一下。


3.向本地仓库中增长文件

下面咱们向版本库中增长文件,须要注意的是,在版本库中只能跟踪和管理文本文件,比txt文件、js文件、php文件、java文件等,全部的程序代码均可以的。可是像视频、图片等这些二进制文件,虽然能由git管理,可是只能记录大小,没法跟踪具体修改了什么,嘿嘿。你们懂了吧。好了,下面咱们来增长一个readme.txt文件,其内容以下:

This is git test.
Git is a version of the best controller.
……

readme

注意,新建的readme.txt文件,必定要在pro目录,否则git没法管理这里文件哦,嘿嘿!下面咱们把个文件放到版本库中。

git add

1).git status 命令

咱们先用git status命令查看一下,如上图。你们能够看到git记录咱们新增长一个文件readme.txt,而且提示这个文件尚未被提交。下面咱们用git add命令提交一下。

2).git add 命令

git add 命令是告诉git,咱们要把什么文件提交到仓库中去,你们能够看咱们执行git add readme.txt命令后,没有任何提示。那就说明咱们提交完成了。下面咱们经过git commit命令,将readme.txt文件提交到版本库中。

3).git commit 命令

$ git commit -m "add readme.txt"
[master (root-commit) e5d662b] add readme. 
1 file changed, 3 insertions(+) 
create mode 100644 readme.txt

你们能够看到咱们用git commit命令提交readme.txt文件,给出的提示是  1 file changed, 3 insertions(+),一个文件改变,插入了三行内容。与咱们上面增长三行内容一致。嘿嘿!下面咱们简单的说明一下git commit命令,其中的参数-m后面输入的是本次提交的版本说明,能够输入任意内容,但须要说明的是,最好写有意义的说明,便于之后查看。

4).git status 命令

最后咱们再用git status命令查看一下版本库的状态,提示没有任何内容须要提交说明咱们向版本库增长文件成功了,嘿嘿。


4.总结

1).初始化一个Git仓库,使用git init命令

2).添加文件到本地Git仓中,分为两步:

  • 使用git add命令,注意,能够屡次使用,添加多个文件

  • 使用git commit命令,完成添加。

为何Git添加文件须要两步呢?一步add,一步commit。嘿嘿,由于commit命令能够一次提交多个文件,因此你能够屡次使用add命令呢。下面是个案例:(咱们也常常这么用)

$ git add file1.php
$ git add file2.php
$ git add file3.php
$ git commit –m “add file1.php file2.php file3.php”

好了,到这里咱们建立本地git仓库和向仓库中增长文件的内容就讲解完成了,下面咱们来详细讲解一下Git本地仓库的管理,内容有点多请你们慢慢看,嘿嘿!


5、本地仓库管理详解

1.查看工做区的状态(git status)

在上面的文章中咱们成功的增长了一个readme.txt文件,并用git status命令查看了状态,在这节中咱们就详细的说一下git status命令。咱们修改一下readme.txt中的内容以下:

This is git test. 
Git is a version of the best conntroller.

咱们删除了最后一行,如今咱们再用git status命令查看一下状态:

git status

从上图中咱们能够看到,咱们用git status命令查看一下,咱们得知readme.txt文件被修改过了,可是尚未提交这个修改。可是有博友会问了,git提示咱们这个readme.txt这个文件被修改了,但咱们想看看具体修改了什么内容怎么办呢?这个时候咱们须要git diff命令出场了,以下图:

git diff

你们能够从上面图片中能够看到,咱们删除了最后一行的……省略号。嘿嘿,用红颜色标出来的。好了知道修改了什么,下面咱们就提交修改吧,提交修改和提交新文件一致,也是两步,先add,再commit。以下图:

git add readme

你们能够看到咱们执行git add命令,一样没人输出。可是,咱们能够用git status命令查看一下。下面咱们用git commit命令提交到本地版本库,以下图:

git commit read

一样的咱们使用git status命令查看一下状得知咱们修改的readme.txt文件已提交。好了,到这里咱们的git status命令就讲解完成了,同时咱们也讲解一个git diff命令,能够查看咱们修改了哪些内容。下面咱们来说解一下版本回滚。


2.版本回滚

在上面一个章节中咱们演示修改文件并提交文件,再用git status命令查看状态,下咱们再修几个版本并提交:

git a free

git a dis

好了,就这样咱们不断的修改并提交到本地的版本库中。一会你测试的时候发现前修改的版本有问题想回滚到前面的版本,或者你误删除了一些文件,想回到上一个commit中去,而后继续工做。咱们应该怎么办呢?在Git版本控制中,咱们全部的操做都是有历史记录的,咱们用git log命令查看一下(以下图):

git log

你们能够看到,用git log命令能够查看最近几回提交的版本。若是你发现内容太多,能够用这个命令查看(以下图):

git log oneline

上面你看到的一大串数字,实际上是commit id(即,版本号),和svn不同,Git的commit id不是1,2,3……这样的递数字,而是一相SHA1计算出来的哈希数,用16进制表示。有博友会问了,为何Git的commit id不是1,2,3……这样的递增数字,而是用SHA1算出来的哈希数来表示呢?你们应该知道Git是分布式管理系统,咱们会有多我的同时开发,若是你们都用1,2,3……这样的递增数字,做为版本号,那不就冲突了嘛,嘿嘿。好了,下面咱们来讲版本回滚,准备把readme.txt回滚到“add readme.txt“的那个版本,咱们应该怎么作?


咱们先来讲一下,Git的当前是在哪一个版本,在Git中咱们用HEAD表示当前版本,也就是咱们最新提交的”749f84ccb87……ff2q6ad“,上一个版本就应该这么表示”HEAD^“,再上一个版本就这样表示”HEAD^^“,固然若是有几十个版本或者1000个版本,咱们还要写1000个^,这是不可能的,因此哟。咱们写成这样HEAD~1000。好了,如今咱们就用git reset命令,将咱们的版本回退到”add readme.txt“中吧,以下图:

git reset add

你们能够看到,咱们回到了”add readme.txt“版本中了,下面咱们再来查看一下git log,以下图:

git log2

有个问题哦,有没有发现咱们最后提交的那个版本不见了,如上图。如今只有三个版本了,这说明什么问题呢?举个简单的例子说明一下,就比如你从如今回到了18世界,想再回到21世界已经回不去了,那应该怎么办呢?只要咱们找到最新版本的commit id,我这里新版本的commit id是”749f84ccb87……ff2q6ad“,因而就能够回到将来的某个版本,就比如咱们知道如今的时间,就能回到如今。下面咱们来演示一下(以下图):

git reset 2

好了,你们能够看到咱们又回到最新版本,嘿嘿。如今你回退到某个版本中,已经关掉了Git bash。可是呢,你又后悔了,想恢复到新版本中,可是呢?你又找不到commit id了,那又该怎么办呢?在Git中,咱们当时用$ git reset --hard HEAD^^^,回退到“add readme.txt”版本时,再想恢复到最新版的 “add a line distributed” 中,必须有commit id才行,这时咱们已经关闭了Git bash。在Git中提供了一个git reflog命令,是用来记录你每一次执行的命令,下面咱们来演示一下(以下图):

git reflog

嘿嘿,如今咱们又能够回去最新版了。好了,到这里咱们的回滚版本就讲解完成了。下面咱们来讲一下,工做区、提交区/暂存区(stage/index)、版本库。


3.工做区、提交区/暂存区(stage/index)、版本库

work

其实呢,工做区、提交区/暂存区(stage/index)、版本库的概念问题,从上图中就能看的很清楚,原本不想细讲的,但想一想仍是说一下。Git与其余版本版本控制器其中之一的不一样之处就在于有提交区/暂存区(stage/index)的概念。下面咱们先来看一下工做区:

workdir

gitworkdir

其实呢,工做区就是咱们开发目录了,在电脑中是可能看到的,好比咱们这里的pro目录,就是一个工做区。你们再来看一下,下面的两张图:

git .git

git .git2

你们能够看到,工做区中有个隐藏的目录“.git”,这个不是工做区哦,这个就是Git的版本库。你们再看下面两张图:

git index1

git index2

你们能够看到,在“.git”目录中有不少文件,其中一个重要的文件index,就是咱们说的提交区/暂存区(stage/index)。暂存区(stage, index)是 Git 最重要的概念之一,理解了这个概念不少 Git 命令就再也不那么神秘了。对于 Git 暂存区(stage) ,不知道您的感想如何?

  • “被眼花缭乱的 Git 魔法完全搞糊涂了?”

  • “Git 为何这么折磨人,修改的文件直接提交不就完了么?”

  • “看不出 Git 这么作有什么好处?”


我认为 Git 暂存区(stage或称为 index)的设计是 Git 最成功的设计之一,也是最难理解的一个设计。 在版本库(.git)目录下,有一个 index 文件,相信你们在上图中已经看到了。下面咱们好好说一说他们之间关系,一样的咱们先看一张图:

git-stage

在上图中,咱们能够看到部分 Git 命令是如何影响工做区和暂存区(stage/index)的。

  • 图中左侧为工做区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所表明的目录树(关于分支问题在下面的文章中会详解)。

  • 图中咱们能够看出此时 "HEAD" 实际是指向 master 分支的一个“指针”。因此,图示的命令中出现 HEAD 的地方能够用 master 来替换(HEAD的概念咱们在后面的文章中也会详解)。

  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,咱们会在后面的文章中将重点介绍,嘿嘿!。

  • 当对工做区新增或修改的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工做区新增或修改的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。(如上图)

  • 当执行提交操做 "git commit" 时,暂存区的目录树写到版本库的对象库(objects)中,master 分支会作相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。(如上图)

  • 当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,可是工做区不受影响。 当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工做区则不作出改变。

  • 当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区所有或指定的文件替换工做区的文件。这个操做很危险,会清除工做区中未添加到暂存区的改动。

  • 当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的所有或者部分文件替换暂存区和以及工做区中的文件。这个命令也是极具危险性的,由于不但会清除工做区中未提交的改动,也会清除暂存区中未提交的改动。

好了,到这里咱们的工做区、暂存区、版本库就讲解到这里了,因为本人能力有限有什么不正确的地方欢迎你们指出。好了,下面咱们继续讲解……


4.修改管理

1).关于修改

在上面的文章中咱们讲解了工做区、暂存区和版本库的概念,有了这些概念有理解。下面咱们说一说为何Git比其它版本控制软件优秀?嘿嘿,是由于Git跟踪管理的是咱们每一次的修改(或操做),而不是文件。好比你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至建立一个新文件,也算一个修改。下面咱们来简单演示一下:咱们先查看一下readme.txt文件,以下图:

modify1

下面咱们修改一下readme.txt内容,增长一行:Git rest 1.以下图:

modify2

下面咱们用 git add 命令提交一下,以下图:

modify3

下面咱们再修改一下readme.txt文件,以下图:

modify4

咱们又增长一行 Git test 2. 以下图:

modify5

modify6

下面咱们提交一下,以下图:

modify7

下面咱们再查看一下状态,以下图:

modify8

你们能够看到咱们第二次没有被提交,怎么会这样呢?细心的博友能够看到咱们第二次修改后,直接执行 git commit了。没有执行 git add 命令,前面咱们说了,当你用“git add”命令后,在工做区的第一次修改被放入暂存区,准备提交。可是,在工做区的第二次修改并无放入暂存区,因此,“git commit”只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。下面咱们用 git diff 命令查看一下工做区与版本库里面的区别:

modify9

你们能够从图上看到,咱们增长 Git test 2. 尚未提交,嘿嘿!那么第二次修改怎么提交呢?其实咱们再add再commit,就能够了。以下图:

modify10

好了,如今,你又理解了Git是如何跟踪修改的,每次修改,若是不add到暂存区,那就不会加入到commit中。那么咱们想取消修改的版本,又该怎么取消呢?下面咱们继续……


2).取消(撤消)修改

下面咱们来说解怎么撤消修改,通常状况下咱们是不会出错的,可是项目比较紧,总是有人在催你(这个你懂的),忽然出错了,咱们想取消修改那又怎么办呢?以下图:

modify11

在你要提交以前,你发如今有错误了,应该是101。既然错误发现得很及时,就能够很容易地纠正它。你能够删掉最后一行,手动把文件恢复到上一个版本的状态。我信先用git status查看一下,以下图:

modify12

如上图,Git会告诉你有你个文件被修改,你有两个选择,一个用 git add 提交到暂存区,另外一个是用git checkout能够丢弃工做区的修改。命令git checkout -- readme.txt意思就是,把readme.txt文件在工做区的修改所有撤销,这里有两种状况:

  • 一种是readme.txt自修改后尚未被放到暂存区,如今撤销修改就回到和版本库如出一辙的状态;

  • 另外一种是readme.txt已经添加到暂存区后,又做了修改,如今撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。下面咱们来演示一下,以下图:

modify13

你们能够看一下 readme.txt 文件果真还原到上一个版本了,嘿嘿!你们注意哦,git checkout -- file命令中的“--”很重要,没有“--”,就变成了“建立一个新分支”的命令,咱们在后面的文章中将详细讲解分支管理。真是祸不单行啊,咱们不但程序写错了,还 git add 到暂存区了,以下图:

modify14

无论怎么样,咱们先查看一下状态吧,以下图:

modify15

你们能够看到Git告诉咱们,用 git reset HEAD file 能够把暂存区中的修改撤消掉,从新放回工做区,以下图:

modify16

git reset命令既能够回退版本,也能够把工做区的某些文件替换为版本库中的文件。当咱们用HEAD时,表示最新的版本。咱们再用 git status 查看一下发现,如今的暂存区是干净的,工做区有修改。

那说明咱们撤消成功,嘿嘿!下面咱们再执行 git checkout命令撤消工做区修改,以下图:

modify17

好了,到这里咱们终于撤消回来了,嘿嘿。如今,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?能够回退到上一个版本。不过,这是有条件的,就是你尚未把本身的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?咱们后面会讲到远程版本库,一旦你把错误提交推送到远程版本库,你就真的惨了……你们当心就好,哈哈……好了,下面咱们来总结一下:

  • 当你改乱了工做区某个文件的内容,想直接丢弃工做区的修改时,用命令git checkout -- file。

  • 当你不但改乱了工做区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了第1步,第二步按第1步进行操做,就是执行一下git checkout -- file。

  • 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考咱们前面讲解的版本回退,不过前提是没有推送到远程库。嘿嘿,祝你回退成功。

好了,撤消管理咱们已经讲了不少了,下面咱们来讲一下文件删除的问题,终于快通关了。嘿嘿……


5.文件删除

删除文件就比较简单了,咱们快速的过一下了,嘿嘿!下面咱们新增长一个文件并提交到Git版本库中,以下图:

add index

通常咱们直接在目录中把没用的文件删了,或者用rm命令删了,下面咱们来演示一下:

git rm

你们能够看到,咱们用 git status 查看一下状态,如今咱们有两个选择,一个是从版本库中删除该文件,就 git rm 命令删除掉并用 git commit提交,另外一种状况删错了,由于版本库里还有因此能够很容易的恢复。下面咱们来演示一下状况1:

git delete

好了,下面咱们来看一下状况2:

git check

git rm 命令用于删除一个文件。若是一个文件已经被提交到版本库,那么你永远不用担忧误删,可是要当心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。好了,到这里咱们删除文件就讲解完成,嘿嘿。


6、总结

在一篇博客中咱们讲解了Git 本地版本库的讲解,在下一篇博客中咱们主要讲解Git 远程仓库详解,好了到这里这篇博客到这里就所有完成。本人能力有限,有任何问题欢迎你们提出并讨论。最后,但愿你们有所收获^_^……