基础知识
1 Git 分布式版本控制系统
2 集中式和分布式版本控制系统有什么区别?
集中式版本控制系统:版本库是集中放在中央服务器的;必须有联网才能工作;工作前必须从中央服务器取得最新的版本
分布式版本控制系统:没有“中央服务器”,每个人的电脑都是一个完整的版本库;安全性比集中式要高很多;多人协作时通过一台充当“中央服务器”的电脑来交换大家的修改。
3 什么是版本库?
版本库,也叫仓库,英文叫repository。版本库是一个有很多文件的目录,它被Git管理,能够跟踪每个文件的修改,删除等,方便追踪历史和“还原”。
在某个文件夹中,我们通过命令行执行git init后,当前目录下会生成一个.git的目录,它是隐藏的文件夹。Git通过该目录来跟踪管理版本库。
4 commit
commit可以理解为“保存一个快照”。
Git的commit id 不是1,2,3......递增的数字,而是一个SHA1计算出来的数字,这个数字用十六进制表示。
5 版本
HEAD表示当前版本
HEAD^表示上一个版本
HEAD^^表示上上个版本
HEAD~100表示上第100个版本
6 Git的工作区和暂存区
工作区:电脑中可见的文件夹(目录)
版本库:工作区中的隐藏目录.git
暂存区:存在于版本库中,名字叫stage
执行命令git add filename,它会把工作区文件的修改被放入暂存区。
执行命令git commit -m "xxx",它会把暂存区中的修改提交。
7 master分支和HEAD指针
在某个文件夹中,我们通过命令行执行git init后,当前目录下会生成一个.git的目录。
在版本库中,Git为我们自动创建了第一个分支master,和指向master的HEAD指针。
HEAD指向master,master指向提交。HEAD指向的是当前的分支。
8 分支和HEAD
Git的分支创建非常快!它通过指针实现。Git创建一个分支dev时,Git创建了一个指针dev,指向master相同的提交。
分支:每次提交所形成的的时间线。主分支,也叫master分支。
Git的分支本质上仅仅是指指向提交对象的可变指针。Git的默认分支名字是master。在多次提交操作之后,你其实已经有一个指向最后那个提交对象的master分支。它会在每次的提交操作中自动向前移动。
Git的分支实质上仅是包含所指对象校验和(长度为40的SHA-1值字符串)的文件。???
创建一个新分支相当于往一个文件中写入41个字节(40个字符和一个换行符)。???
使用GIt创建新分支的本质是在当前所在的提交对象上创建了一个可以移动的新的指针。 ----> git branch <branch-name>
Git知道当前在哪一个分支的机制是它有一个名为HEAD的特殊指针,它指向当前所在的本地分支。
执行git checkout <branch-name>命令能让HEAD指针指向另一个分支,即切换分支,即HEAD运动。
Git是如何保存数据的?
Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。
在进行提交操作时,Git会保存一个提交对象(commit object)。
提交对象包含的内容:一个指向暂存内容快照的指针、作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。
首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象,而多个分支合并并产生的提交对象有多个父对象。
多次修改后再次提交,这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针。
git add <file1> <file2> <file3> :为每一个文件计算校验和(SHA-1哈希算法),然后会把当前版本的文件快照保存到Git仓库中(Git使用blob对象来保存它们),最终将校验和加入到暂存区域等待提交。
git commit -m "xxxx":Git先计算每一个子目录的校验和,然后在Git仓库中这些校验和保存为树对象。随后,Git便会创建一个提交对象,它不仅包含提到的信息,还包含指向这个树对象的指针。
Git中涉及到的对象:
1 blob对象:保存着文件快照。
2 树对象:记录着目录结构和blob对象索引。
3 提交对象:包含着指向树对象的智者和所有提交信息。
分支开发工作流
长期分支:三方合并。
特性分支:短期分支,用来实现单一特性或相关工作。
相关概念:流水线(work silos),上下文切换(context-switch),分支策略(branching scheme)
远程分支
远程引用:对远程仓库的引用(指针),包括分支、标签等
远程跟踪分支:远程分支状态的引用,不能移动的本地引用,当做网络通信操作时,它们会自动移动。
它们的命名形式:(remote)/(branch)
"master"是当你运行git init时默认的起始分支名字。
"origin"是当你运行git clone时默认的远程仓库名字。
9 指针
Git内部有个指向当前版本的HEAD指针
Git分支的创建,修改,提交,合并,删除等操作,实质上是对指针的操作。
10 修改
Git 跟踪并管理的是修改,而不是文件
11 远程仓库
本地仓库,本地仓库和远程仓库关联,克隆远程仓库
一个远程仓库通常只是一个裸仓库,即一个没有当前工作目录的仓库。
裸仓库就是你工程目录内的,git子目录内容。
12 Git用符号<<<<<<<
,=======
,>>>>>>>标记出不同分支的内容。
一般地,<<<<<<< 是当前分支的内容,>>>>>>>是分支的内容,=======用来分隔两个分支的冲突的内容
13 分支的合并
fast-forward模式的git merge:删除分支后,它会丢掉分支信息(丢失提交历史)
--no-ff方式的git merge(两个分支分别有新的提交):先手动解决冲突,再提交;它会生成一个新的commit(提交历史会存在)
当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么Git在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧,这就叫做“快进”。
14 克隆远程仓库
Git自动把本地的master分支和远程的master分支对应起来了,远程仓库的默认名称是origin。
推送分支:把该分支上的所有本地提交推送到远程仓库。
本地分支和远程分支的链接关系:--set-upstream-to
15 rebase变基
rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。
缺点是本地的分叉提交已经被修改过了。
变基:将一系列提交按照原有次序依次应用到另一分支上。
合并:把最终结果合在一起。
无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样,只不过提交历史不同罢了。
使用变基操作的总的原则:只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作。
16 标签
版本库的一个快照。本质是指向某个commit的指针,它跟某个commit绑定在在一起。
给历史中某一个提交打上标签,以示重要。比如发布结点。
Git标签类型:轻量标签和附注标签
轻量标签:它只是一个特定提交的引用。它的本质是将提交校验和存储到一个文件中。它可以充当一个临时的标签。
附注标签:存储在Git数据库中的一个完整的对象。通常建议创建附注标签。
17 .gitignore文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
.gitignore文件本身要放到版本库里,并且可以对.gitignore文件做版本管理
18 git config工具
它帮助设置控制Git外观和行为的配置变量。这些变量存储在系统的三个不同的位置:
1当前使用仓库的.git目录中的config文件:.git/config。它生效的范围:针对当前仓库。
2 /home/$USER/.gitconfig。它生效的范围:针对当前用户。
3 /etc/gitconfig。它生效的范围:每一个用户和它们仓库。
1会覆盖2,3;2会覆盖3。
19 Git支持多种协议
本地协议(Local):file:// 或者直接使用指定路径
HTTP协议:https://
SSH(Secure Shell)协议:ssh://
GIt协议:git://
参考资料: