分布式版本控制系统
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 | # 此为注释 – 将被 Git 忽略 |
.git详解
http://blog.jobbole.com/98634/
当你创建一个仓库的时候,使用 git init 指令, git 将会创建一个神奇的目录:.git。这个目录下包含了所有 git 正常工作所需要的信息。说白一点,如果你想从你的项目中删除 git 但是又要保留项目文件,只需要删除 .git 文件夹就可以了。但是,你确定要辣么做?
1 | ├── HEAD |
这就是你第一次提交之前 .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 | ├── 17 |
这就是我创建一个空文件 test1.txt 并提交后 object 目录看起来的样子。请注意如果你的文件的哈希值是“89faaee…”,git 会把这个文件存在 “89” 目录下然后命名这个文件为 “faaee…”。
你会看到3个哈希。一个对应 test1.txt ,另一个对应在提交时所创建的快照。那么第三个是什么呢?其实是因为 commit 本身也是一个对象并且也被压缩存放在 object 目录下。
现在,你需要记住的是一个 commit 包含四个部分:
1 | 工作目录快照的哈希 |