Git初探


原文: Git初探
date: 2016-03-02 12:39:04


[TOC]

前言

早就听说了GitHub的强大. 一直没有机会去看, 在公司实习的几个月里也没机会接触SVN和Git ]

抱着对Linus大神的崇敬, 和开源的崇敬之情. 趁着不忙的几天来学习一下Git. 希望以后能够用到.

其实Git还是十分好学. 用不了多久, 你就能体会到它的高效简洁之美!

这里我是在本地虚拟机Centos来学习. . . 只是学习他的简单原理和操作, 并没有真正的尝试项目.

同时借鉴了网上一些有经验的前辈们的理解.. 来自己操作和学习

很多地方简单的例子我都有做图解,,做PPT真的好难阿!!!

并且花了两天时间来学习并整理这个小的文档.

希望能有所收获!


1. 介绍Git

一款免费, 开源, 高效的分布式版本控制系统

SVN和Git的主要区别:

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑

所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。

既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,

这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

2. 全局配置git

  • 安装 : sudo apt-get install git

  • 查看版本: git –version

  • 全局配置:

    > git config --global user.name xxx
    > git config --global user.email xxx
    > git config --global color.ui true
    

    配置用户名和邮箱是为了提交代码时的团队标识

git config –list 查看git全局配置

cat ~/.gitconfig 全局配置都保存在用户目录下这个.gitconfig隐藏文件中, 也可以vi编辑

可以通过以下命令获取git帮助

git help

可以通过以下命令获取特定某个指定的的帮助

git help 特定指令

可以查看仓库提交的历史记录

git log

3. 创建Repository

初始化一个新的Git仓库

git init : 初始化git目录环境(创建出新的空的repository) 并生成隐藏文件夹.git

.git(Git仓库文件, 所有相关的数据都保存在这儿)

> $ ls -A  查看到隐藏文件.git
> $ cd .git/

[图片上传失败...(image-8b249f-1558407122757)]

另一种方式:

git clone https://github.com/kennethreitz/requests.git

克隆网上的git项目,会自动创建repository

4. Git的对象类型

Git中有四种基本对象类型,组成了Git更高级的数据结构:

● Blobs
每个blob代表一个(版本的)文件,blob只包含文件的数据,而忽略文件的其他元数据,如名字、路径、格式等。

● trees

每个tree代表了一个目录的信息,包含了此目录下的blobs,子目录(对应于子trees),文件名、路径等元数据。因此,对于有子目录的目录,git相当于存储了嵌套的trees。

● commits

每个commit记录了提交一个更新的所有元数据,如指向的tree,父commit,作者、提交者、提交日期、提交日志等。每次提交都指向一个tree对象,记录了当次提交时的目录信息。一个commit可以有多个(至少一个)父commits。

● tags

tag用于给某个上述类型的对象指配一个便于开发者记忆的名字, 通常用于某次commit。

5. 提交及添加文件

git status –查看git repository的状态

[图片上传失败...(image-96a622-1558407122757)]
Untracked files: 没有登记的文件

a).添加

git add hello.py命令进行添加

[图片上传失败...(image-6d3dc6-1558407122757)]

b).提交

git commit -m ‘init commit’

(不加-m会默认打开vi, ‘ ’里面是操作的描述,这里的init commit表示首次提交,)

[图片上传失败...(image-7b74b7-1558407122757)]

可以直接提交到仓库(不暂存)

git commit -a -m (或-am) “modify hello.txt”

注意:

1.其实不是在暂存区不存, 而是帮我们跳过(git add暂存区)这一步骤.

2.他不会自动提交 未追踪文件, 也就是新文件没有add过是不行的.

[图片上传失败...(image-ae1241-1558407122757)]

关于这三个文件状态及工作区域:

● History 也可以说 Git repository(git仓库):

最终确定的文件能保存到仓库, 成为一个新的版本, 并且对他人可见

● Staging area (暂存区,Cache, Index):

暂存已经修改的文件

● Working directory(工作区):

编辑, 修改文件

6. 查看git状态

[图片上传失败...(image-5dee3b-1558407122757)]

git status -s 列出简要状态信息

文件前面有两个flag. 第一个是Staging area, 第二个是Working directory

再次vi hello.py后查看状态:

[图片上传失败...(image-b44f7a-1558407122757)]

出现两个M, 第一个M表示Staging area里的文件发生变化, 第二个M表示Working directory发生了变化.

两个区完全一致, 标志位就是空白, 有发生变化导致不一致, 标志位就是M

再次进行commit, 三个区完全一致. 两个标志位都为空

[图片上传失败...(image-f0f65c-1558407122757)]

7. 查看文件差别

git diff 是查看第二个flag(也就是Staging area和Working directory) 具体变化信息的命令

[图片上传失败...(image-6ca6e8-1558407122757)]

在modify操作后可以用:

git diff –staged 可以查看第一个flag(也就是Staging arae和History 之间的变化), 产生相同的效果

git diff HEAD 可以看History 和 Working 之间的变化

git diff –stat 后面加stat可以简化变化信息

8. 撤销误操作

[图片上传失败...(image-e70ef6-1558407122757)]

9. 移除及重命名文件

删除文件

1.系统级别删除

rm filename

2.从git中删除文件

git rm filename

3.提交操作

git commit -m “delete filename”

注意: 只是删除当前版本中的文件, 文件依然被记录在Git仓库历史中

git rm –cached filename

删除Staking arae中的文件, 文件还存在Working directory中, 可以通过git add 或 git reset 恢复

重命名文件

git mv xxx new xxx

git commit -m “rename xxx”

重命名相当于执行了以下三条命令:

  1. mv xxx newxxx (先系统级别上改名mv)
  2. git rm xxx
  3. git add newxxx

10. 暂存工作区

[图片上传失败...(image-39d6b7-1558407122757)]

假如出现这种情况(MM), 工作区修改完(修改1)后add到暂存区, 还未commit到仓库中, 此时发现一个遗漏或紧急情况, 需要在工作区中在修改1之前做修改(修改2), 但是又不想放弃修改1, 此时可以暂存工作区后进行修改.

git stash 暂存工作区
[图片上传失败...(image-909024-1558407122757)]

此时就回到了修改一之前的现场, 此时可以做自己的代码修复vi

git commit -am ‘quick fix’

修改完后就可以提交这个紧急修复
[图片上传失败...(image-9bc43a-1558407122757)]

git stash list 查看暂存工作区的列表
[图片上传失败...(image-1d5f6-1558407122757)]

可以看到一个

git stash pop 弹出这个现场
[图片上传失败...(image-6c46f1-1558407122757)]

然后在进行add和commit后, 修改1和修改2的作用就同时生效了.

11. 图解commit对象

为了理解HEAD,commit,和commit下对象之间的结构关系, 我们用图来理解:

[图片上传失败...(image-787278-1558407122757)]

下面实际来看一下

git log 后, 出现最近的操作日志如下:

[图片上传失败...(image-db4c45-1558407122757)]

每个commit后面都有一个哈希码来唯一标识这个commit.

HEAD默认指向第一个commit

git cat-file -t : show object type
[图片上传失败...(image-c0e96c-1558407122757)]

git cat-file -p: print object’s content
[图片上传失败...(image-b78921-1558407122757)]

当然, 用commit 前的哈希值也可以看到这个对象.
[图片上传失败...(image-ba71d7-1558407122757)]

这里就可以看到前面commit图解中的信息

找到这个commit对象了, 我们再来看看这个对象中的tree里面有什么.

[图片上传失败...(image-52222a-1558407122757)]

也可以继续追踪下去. 这样你就可以自由的找到commit对象里面的所有内容.

12. 理解tree-ish表达式

在.git文件中有一个HEAD

cat HEAD
ref: refs/heads/master

我们查看这儿

cat refs/heads/master
[图片上传失败...(image-4f08f1-1558407122757)]

git log –oneline
[图片上传失败...(image-3bcf74-1558407122757)]

可以看到, 这个master分支就指向的是最新的commit

git rev-parse HEAD
[图片上传失败...(image-fb0e93-1558407122757)]

可以看到, 这里HEAD和master的最终指向是一致的, 都是commit.

git show 和 git cat -file -p类似, 能更简便的看到content

如果要定位到commit下的tree. 可以用tree-ish表达式

HEAD ~3^{tree}
[图片上传失败...(image-59e29b-1558407122757)]

如果要定位到tree下的hello.py, 不用先定位到tree. 也可以用表达式

HEAD~3:
[图片上传失败...(image-20ea69-1558407122757)]

tree-ish表达式的引入, 让我们更方便的定位到任意一个对象和文件

13. 创建及删除分支

  • 查看分支:

git branch

– master

  • 新建一个分支:

git branch newBranch
git branch
– master
newBranch

  • 切换分支:

git checkout newBranch
创建分支和切换分支可以合并一步进行:
git checkout -b newBranch

  • 删除分支

git branch -d newBranch

注意: 切换分支实际就是把head指向了不同的branch

[图片上传失败...(image-cd7981-1558407122757)]

cd heads目录, 就会发现有两个分支,master和newBranch

他们都指向一个commit

[图片上传失败...(image-b26474-1558407122757)]

14. 合并分支(上)

这里我们介绍合并分支的做法, 和两种合并机制

我们在新创建的分支newBranch中进行代码的升级(hello.py)提交后,

再删除newBranch, 会出现一个error.

[图片上传失败...(image-5dc4bc-1558407122757)]

这是因为newBranch原本指向的呢个新commit, 删除后, 这个新commit就没有被指向了. 如图:

[图片上传失败...(image-179abb-1558407122757)]

所以应该需要在删除newBranch之前让master指向新commit. 也就是进行分支合并, 合并后的效果如图:

[图片上传失败...(image-220360-1558407122757)]

使用git merge newBranch

然后就可以删除newBranch了

这种合并机制叫Fast-forword

15. 合并分支(下)

如果出现这种情况: 在两个分支都出现了代码的修改

两个分支master和bugFix

在bugFix分支上做了两次fix (fix1和fix2) 并提交

[图片上传失败...(image-1e57d2-1558407122757)]

然后切换到master分支, 做一次Modify.

[图片上传失败...(image-eea32d-1558407122757)]

进行git merge bugFix后, 两个分支的操作都被合并了

[图片上传失败...(image-de7cdc-1558407122757)]

但是此时的合并方式就不是Fast-forwrd那么简单了. 而是另一种机制3-way merge

它的合并原理如下:

[图片上传失败...(image-470fc0-1558407122757)]

  1. 先找到两个分支的共同分支对象

  2. 将fix code2和B进行比对, 形成对比信息.

  3. 然后将对比信息添加应用到Modify code上. 形成新的对象NEW.

    master重新指向NEW. 分支合并完毕!

16. Git远程仓库

远程仓库的实现:

1 使用现有的Git网络仓库服务

Github: https://github.com (创建开源免费哦)

Bitbucket: https://bitbucket.org

2 搭建自己的Git仓库服务器

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • Git飞行规则(Flight Rules) 前言 英文原版README 翻译可能存在错误或不标准的地方,欢迎大家指...
    骑摩托马斯阅读 1,628评论 0 8
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,804评论 0 8
  • (预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料) 一:Git是什么? Git是目前世界上最先进的...
    axiaochao阅读 1,927评论 1 8
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,648评论 9 163
  • 一、Git是什么? 是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常 大的项目版本管理。 Git ...
    名字谁不会取阅读 1,037评论 0 0