0%

git

分布式版本控制系统

git下载

git for windown
https://github.com/git-for-windows/git/releases/download/v2.18.0.windows.1/Git-2.18.0-64-bit.exe

下载完的git没有快捷方式,只是一个工具,右键就可以使用

创建新仓库

打开文件夹,打开,然后执行git init以创建新的git仓库

检出仓库

执行git clone /path/to/reposity 创建一个本地仓库的克隆版
执行git clone username@host:/path/to/reposity 创建远端仓库的克隆版

工作流

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

work dir—>index(stage)–>HEAD

添加和提交

你可以使用git add <filename> git add * git add -A 将你在工作目录的改动提交的暂存区,这是git基本工作流程的第一步;
使用git commit -m '代码提交信息' 将改动提交到HEAD,但是它们还没有提交到远程仓库。

推送改动

提交已经到本地仓库的HEAD了,执行git push origin master git push将改动提交到远端仓库

如果你还没有克隆现有仓库,你想将你的仓库推送到某个远程仓库,使用git remote add orgin <server> 这样就把改动推送到所添加的服务器上。

分支

分支是用来将特性开发分离开来,

.gitignore详解

今天讲讲Git中非常重要的一个文件——.gitignore。

首先要强调一点,这个文件的完整文件名就是“.gitignore”,注意最前面有个“.”。这样没有扩展名的文件在Windows下不太好创建,这里给出win7的创建方法:

创建一个文件,文件名为:“.gitignore.”,注意前后都有一个点。保存之后系统会自动重命名为“.gitignore”。

一般来说每个Git项目中都需要一个“.gitignore”文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。

实际项目中,很多文件都是不需要版本管理的,比如Python的.pyc文件和一些包含密码的配置文件等等。

这个文件的内容是一些规则,Git会根据这些规则来判断是否将文件添加到版本控制中。

下面我们看看常用的规则:

/mtk/ 过滤整个文件夹

*.zip 过滤所有.zip文件

/mtk/do.c 过滤某个具体文件

很简单吧,被过滤掉的文件就不会出现在你的GitHub库中了,当然本地库中还有,只是push的时候不会上传。

需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中:

!*.zip

!/mtk/one.txt

唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。

为什么要有两种规则呢?想象一个场景:我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理。那么我们就需要使用:

/mtk/

!/mtk/one.txt

假设我们只有过滤规则没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!

最后需要强调的一点是,如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理。

简单来说,出现这种问题的原因就是Git已经开始管理这些文件了,所以你无法再通过过滤规则过滤它们。

所以大家一定要养成在项目开始就创建.gitignore文件的习惯,否则一旦push,处理起来会非常麻烦。

1
2
3
4
5
6
7
# 此为注释 – 将被 Git 忽略

*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

.git详解

http://blog.jobbole.com/98634/

当你创建一个仓库的时候,使用 git init 指令, git 将会创建一个神奇的目录:.git。这个目录下包含了所有 git 正常工作所需要的信息。说白一点,如果你想从你的项目中删除 git 但是又要保留项目文件,只需要删除 .git 文件夹就可以了。但是,你确定要辣么做?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
├── HEAD
├── branches
├── config
├── description
├── hooks
│ ├── pre-commit.sample
│ ├── pre-push.sample
│ └── ...
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags

这就是你第一次提交之前 .git的样子:

Git 提供了一系列的脚本,你可以在git每一个有实质意义的阶段让它们自动运行。这些脚本就是 hooks,可以在 commit/rebase/pull…. 的前后运行。脚本的名字表示它什么时候被运行。例如一个有用的预推送 hook 可能会测试关于保持远程仓库一致性的式样原则。

你可以把你不想让 git 处理的文件放到 .gitignore 文件里。那么,exclude文件也有同样的作用,不同的地方是它不会被共享,比如当你不想跟踪你的自定义的IDE相关的配置文件时,即使通常情况下 .gitignore 就足够了

每次你在控制台使用“git config…”指令时,修改的就是这里。

commit 的真相

每一次你创建一个文件并跟踪它会发现,git 会对其进行压缩然后以 git 自己的数据结构形式来存储。这个压缩的对象会有一个唯一的名字,即一个哈希值,这个值存放在 object 目录下。

在探索 object 目录前,我们先要问自己 commit 到底是何方神圣。commit 大致可以视为你工作目录的快照,但是它又不仅仅只是一种快照。

实际上,当你提交的时候,为创建你工作目录的快照 git 只做了两件事:

如果这个文件没有改变,git 仅仅只把压缩文件的名字(就是哈希值)放入快照。
如果文件发生了变化,git 会压缩它,然后把压缩后的文件存入 object 目录。最后再把压缩文件的名字(哈希值)放入快照。
这里只是简单介绍,整个过程有一点复杂,以后会作说明的。

一旦快照创建好,其本身也会被压缩并且以一个哈希值命名。那么所有的压缩对象都放在哪里呢?答案是object 目录。

1
2
3
4
5
6
7
8
├── 17
│ └── 4b628096c17f5d68d558e7352f6a5f94ebdc6c // hash
├── 29
│ └── 9975e7c8f30f41149317023a6ef77ac8c69233 // hash
├── 62
│ └── 89942b059434181521c6ecd568b553de33ff52 // hash
├── info // let's ignore that
└── pack // let's ignore that too

这就是我创建一个空文件 test1.txt 并提交后 object 目录看起来的样子。请注意如果你的文件的哈希值是“89faaee…”,git 会把这个文件存在 “89” 目录下然后命名这个文件为 “faaee…”。

你会看到3个哈希。一个对应 test1.txt ,另一个对应在提交时所创建的快照。那么第三个是什么呢?其实是因为 commit 本身也是一个对象并且也被压缩存放在 object 目录下。

现在,你需要记住的是一个 commit 包含四个部分:

1
2
3
4
工作目录快照的哈希
提交的说明信息
提交者的信息
父提交的哈希值