Git的历史咱们就不多说来,我还是喜欢直白点,直接来干货吧

在Linux上安装Git

不同的系统不同的安装命令,基础的就不说来,centos直接yum就ok。

安装完成后,还需要最后一步设置,在命令行输入:

```

git config --global user.email "you@example.com"

git config --global user.name "Your Name"

```

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

# Git常用的命令:

```

add        添加文件内容至索引

bisect     通过二分查找定位引入 bug 的变更

branch     列出、创建或删除分支

checkout   检出一个分支或路径到工作区

clone      克隆一个版本库到一个新目录

commit     记录变更到版本库

diff       显示提交之间、提交和工作区之间等的差异

fetch      从另外一个版本库下载对象和引用

grep       输出和模式匹配的行

init       创建一个空的 Git 版本库或重新初始化一个已存在的版本库

log        显示提交日志

merge      合并两个或更多开发历史

mv         移动或重命名一个文件、目录或符号链接

pull       获取并合并另外的版本库或一个本地分支

push       更新远程引用和相关的对象

rebase     本地提交转移至更新后的上游分支中

reset      重置当前HEAD到指定状态

rm         从工作区和索引中删除文件

show       显示各种类型的对象

status     显示工作区状态

tag        创建、列出、删除或校验一个GPG签名的 tag 对象

```

#创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

##第一步:创建一个仓库的目录

```
[root@i-kx987cmz /]# mkdir git_test
[root@i-kx987cmz /]# cd git_test/
[root@i-kx987cmz git_test]# pwd
/git_test
```

##第二步:通过git init 命令把这个目录变成git可以管理的仓库

```
[root@i-kx987cmz git_test]# git init
初始化空的 Git 版本库于 /git_test/.git/
[root@i-kx987cmz git_test]# ls -al
总用量 12
drwxr-xr-x   3 root root 4096 5月  10 13:53 .
drwxr-xr-x. 19 root root 4096 5月  10 13:50 ..
drwxr-xr-x   7 root root 4096 5月  10 13:53 .git
```

瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。

##第三步:把文件添加到版本库

首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

现在我们编写一个readme.txt文件,内容如下

```

[root@i-kx987cmz git_test]# cat readme.txt

Git is veryt good tool

auth :cgt

```

一定要放到git_test目录下面,子目录也可以,放到其他地方git找不到文件。

##把一个文件放到Git仓库只需要两步。

###第一步,用命令git add告诉git,把文件添加到仓库

```

[root@i-kx987cmz git_test]# git add readme.txt

```

执行上面的命令,没有任何的显示就对了。Linux的哲学思想:没有消息就是最好的消息,说明添加成功。

###第二步,用命令git commit告诉git,把文件提交到仓库

```

[root@i-kx987cmz git_test]# git commit -m "cgt write a readme file"
[master(根提交) 87818f5] cgt write a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

```

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

嫌麻烦不想输入-m "xxx"行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。

git commit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。

为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

```

[root@i-kx987cmz git_test]# touch file1 file2 file3
[root@i-kx987cmz git_test]# ls
file1  file2  file3  readme.txt
[root@i-kx987cmz git_test]# git add file1 file2 file3
[root@i-kx987cmz git_test]# git commit -m "add 3 files"
[master 827526e] add 3 files
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1
create mode 100644 file2
create mode 100644 file3

```

###再次插足一下,说明一下git的工作流

你的本地仓库由 git 维护的三棵"树"组成。第一个是你的 工作目录,它持有实际文件;第二个是 暂存区(staging),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。

你可以提出更改(把它们添加到暂存区),使用如下命令:
git add <filename>
git add *
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
git commit -m "代码提交信息"
现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

#回滚-让我去哪我去哪

我们已经创建了一个readme.txt文件,现在我们对他进行一些改动操作。

```

[root@i-kx987cmz git_test]# cat readme.txt
Git is veryt good tool
auth :cgt
date:2016-5-10

```

执行git status

```

[root@i-kx987cmz git_test]# git status

# 位于分支 master

# 尚未暂存以备提交的变更:

#   (使用 "git add <file>..." 更新要提交的内容)

#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)

#

# 修改:      readme.txt

#

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

```

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你第二天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看,然后add之后在看一下status,是显示要commit的文件,现在再回想一下那个工作流图

```

[root@i-kx987cmz git_test]# git diff

diff --git a/readme.txt b/readme.txt

index b7cffdb..43b7253 100644

--- a/readme.txt

+++ b/readme.txt

@@ -1,2 +1,3 @@

Git is veryt good tool

auth :cgt

+date:2016-5-10

```

```

[root@i-kx987cmz git_test]# git add readme.txt

[root@i-kx987cmz git_test]# git status

# 位于分支 master

# 要提交的变更:

#   (使用 "git reset HEAD <file>..." 撤出暂存区)

#

# 修改:      readme.txt

```

接下来进行commit操作

```

[root@i-kx987cmz git_test]# git commit -m "add date"

[master de00305] add date

1 file changed, 1 insertion(+)

```

提交之后,在查看status

```

[root@i-kx987cmz git_test]# git status

# 位于分支 master

无文件要提交,干净的工作区

```

#版本的回退

现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下:

```

[root@i-kx987cmz git_test]# cat readme.txt
Git is veryt good tool
auth :cgt
date:2016-5-10
version:1

```

```

[root@i-kx987cmz git_test]# git add readme.txt
[root@i-kx987cmz git_test]# git commit -m "version"
[master 8b7d4ee] version
1 file changed, 1 insertion(+)

```

目前我们已经提交了三次,暂时你还能记住,但是在实际工作中我们是记不住的,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

```

[root@i-kx987cmz git_test]# git log
commit 8b7d4eebe4e03809162f8193d6b2338926896ab4
Author: caoxiaojian <1099415469@qq.com>
Date: Tue May 10 14:59:16 2016 +0800
version
commit de003058c91312f695b57f42724f826f6ef42f17
Author: caoxiaojian <1099415469@qq.com>
Date: Tue May 10 14:52:10 2016 +0800
add date
commit 827526ee243c93bfaf8f4f2f9dc22d31325cb47a
Author: caoxiaojian <1099415469@qq.com>
Date: Tue May 10 14:23:08 2016 +0800
add 3 files
commit 87818f5454a2bc41cfbeca4b923a510d11fe72ac
Author: caoxiaojian <1099415469@qq.com>
Date: Tue May 10 14:19:08 2016 +0800
cgt write a readme file

```

git log 显示从最近到最远的提交日志,我们可以看到四次提交,最近的一次是version,上一次是date,最早的一次是cgt write a readme  file 。

如果嫌输出的信息太多,可以使用--pretty=oneline

```

[root@i-kx987cmz git_test]# git log --pretty=oneline

8b7d4eebe4e03809162f8193d6b2338926896ab4 version

de003058c91312f695b57f42724f826f6ef42f17 add date

827526ee243c93bfaf8f4f2f9dc22d31325cb47a add 3 files

87818f5454a2bc41cfbeca4b923a510d11fe72ac cgt write a readme file

```

需要友情提示的是,你看到的一大串8b7d4eebe4e03809162f8193d6b2338926896ab4类似的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

我们现在开始回滚,

准备把readme.txt回退到上一个版本,也就是“date”的那个版本,怎么做呢?

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

回滚,我们可以使用git reset这个命令

```

[root@i-kx987cmz git_test]# git reset --hard HEAD^
HEAD 现在位于 de00305 add date
[root@i-kx987cmz git_test]# cat readme.txt
Git is veryt good tool
auth :cgt
date:2016-5-10

```

可以看出,他没有version那行,说明回滚成功。

在看git log

```

[root@i-kx987cmz git_test]# git log

commit de003058c91312f695b57f42724f826f6ef42f17

Author: caoxiaojian <1099415469@qq.com>

Date:   Tue May 10 14:52:10 2016 +0800

add date

commit 827526ee243c93bfaf8f4f2f9dc22d31325cb47a

Author: caoxiaojian <1099415469@qq.com>

Date:   Tue May 10 14:23:08 2016 +0800

add 3 files

commit 87818f5454a2bc41cfbeca4b923a510d11fe72ac

Author: caoxiaojian <1099415469@qq.com>

Date:   Tue May 10 14:19:08 2016 +0800

cgt write a readme file

```

没有了之前的version,那我要怎么才能恢复呢,回你的终端上,看看version的commit id,我们找到了:

8b7d4eebe4e03809162f8193d6b2338926896ab4 version,执行恢复。恢复的时候ID不需要写全部的

```

[root@i-kx987cmz git_test]# git reset --hard 8b7d4eebe4

HEAD 现在位于 8b7d4ee version

[root@i-kx987cmz git_test]# cat readme.txt

Git is veryt good tool

auth :cgt

date:2016-5-10

version:1

```

#回滚原理解析:

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从当前的version,指到date

回滚后

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

到了这里肯定有童鞋要问,那我要是不知道我前面的ID了,我去哪里回滚,我是不是该收拾工位回滚到家中了,git早就替你想好了,可以使用git reflog,把之前的ID都显示出来

  1. [root@i-kx987cmz git_test]# git reflog
  2. 8b7d4ee HEAD@{0}: reset: moving to 8b7d4eebe4
  3. de00305 HEAD@{1}: reset: moving to HEAD^
  4. 8b7d4ee HEAD@{2}: commit: version
  5. de00305 HEAD@{3}: commit: add date
  6. 827526e HEAD@{4}: commit: add 3 files
  7. 87818f5 HEAD@{5}: commit (initial): cgt write a readme file

#工作区和暂存区

不知道你是不是理解了我之前说的那个工作流,咱们这里再来啰嗦一遍。

Git和其他版本控制系统如svn不同之处是有暂存区的概念

先弄清楚这几个名次

##工作区:

就是在你的电脑里能看到的目录,比如咱们创建的git_test

##版本库:

工作区中

Git(未完待续)的更多相关文章

  1. git安装与使用,未完待续... ...

    ​ 目录 一.git概念 二.git简史 三.git的安装 四.git结构 五.代码托管中心-本地库和远程库的交互方式 六.初始化本地仓库 七.git常用命令 1.add和commit命令 2.sta ...

  2. GitHub 入门不完全指南(未完待续)

    我一直认为 GitHub 是一座宝藏,想让更多人的知道它.加入到这个社区中.本人能力有限,如果文中出现不对的地方,欢迎指正交流. 一.前言 大家好,我是削微寒(xuē wēi hán),一个走在进阶路 ...

  3. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  4. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  5. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  6. 关于DOM的一些总结(未完待续......)

    DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...

  7. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  8. virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)

    virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...

  9. MVC丶 (未完待续······)

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

  10. 一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

随机推荐

  1. leetcode记录-组合两个表

    表1: Person +-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | | Firs ...

  2. 20155206 2016-2017-2 《Java程序设计》第4周学习总结

    20155206 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承: 避免多个类间重复定义共同行为,在编写程序的过程中可能会出现部分代码重复的现象,把重复 ...

  3. 20155330 实验三 敏捷开发与XP实践

    20155330 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程. ...

  4. 20155338 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155338 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 1.用JDK编译.运行简单的java程序 步骤一(新建文件夹): 打开windows下的 ...

  5. c#字符串加载wpf控件模板代码 - 简书

    原文:c#字符串加载wpf控件模板代码 - 简书 ResourceManager resManagerA = new ResourceManager("cn.qssq666.Properti ...

  6. 4040 EZ系列之奖金 (拓扑)

    4040 EZ系列之奖金 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond         题目描述 Description 由于无敌的WRN在2015年世界英俊帅 ...

  7. 图论-最短路径 2.Dijkstra算法O (N2)

    2.Dijkstra算法O (N2) 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处 ...

  8. grep 文件内容搜索

    比如现在我们要查找在/home/userlan/目录中哪些文件中包含foobar这个关键字 1. 打开终端2. 输入命令 grep -rl "foobar" /home/userl ...

  9. MySQL5.6.14从安装到启动全过程

    1.下载 地址:http://dev.mysql.com/downloads/mysql/ 这里选择的是Linux-Generic平台,下载了MySQL-5.6.14-1.linux_glibc2.5 ...

  10. IO多路复用(二) -- select、poll、epoll实现TCP反射程序

    接着上文IO多路复用(一)-- Select.Poll.Epoll,接下来将演示一个TCP回射程序,源代码来自于该博文https://www.cnblogs.com/Anker/p/3258674.h ...