分布式版本控制系统
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 | 工作目录快照的哈希 |