-
版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 -
分布式版本控制系统
客户端并不只是提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样任何一处协同用的工作服务器故障,事后都可以用任何一个镜像出来的本地仓库恢复。
因为每一次clone操作,都是对代码仓库的完整备份。 -
直接记录快照,而非差异比较
其他版本控制系统存储的是每个文件与初始版本的差异,git更像是把数据看作对小型文件系统的一组快照。每次你提交更新,或是在git中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。git对待数据更像一个快照流。 -
git三种状态
已暂存,已修改,已提交
已提交表示数据已经安全的保存在本地数据库中。已修改表示修改了文件。已暂存表示对一个已修改文件的当前版本做了标记。
git仓库目录是git用来保存项目元数据和对象数据库的地方。从其他计算机clone仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。这些从git仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。 -
初次运行git前配置
.git/config 针对当前使用仓库的目录中的config文件。 -
用户信息
每一次git提交都会使用这些信息,并且会写到每一次提交当中,不可更改:
git config --global user.name
git config --global user.email
如果想针对特定项目使用不同的用户名与邮件地址,只要去除--global就可以
- 获取git仓库
有两种取得git项目仓库的方法。第一种是在现有项目或者目录下导入所有文件到git;第二种是从服务器clone一个仓库。
git init将创造一个名为.git的子目录,这个子目录含有初始化git仓库中所有的必须文件。
-
clone现有仓库
git clone默认配置下远程仓库中的每一个文件的每一个版本都将被拉取下来。 -
记录每次更新到仓库
工作目录下的每一个文件只有两种状态:已跟踪或未跟踪。已跟踪的文件是那些被纳入版本控制的文件,在上一次快照中有它们的记录,未跟踪的文件既不存在于上次快照的记录,也不再暂存区。未跟踪的文件意味着git在之前的快照中没有这些文件;
git add 可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态。git只不过暂存了运行git add命令时的版本,如果现在提交,运行的是最后一次Git add命令时的版本。 -
忽略文件
一般有些文件无需纳入git管理,也不希望它们总出现在未跟踪文件列表。
gitignore文件中的匹配模式就是简化的正则,代表任意中间目录
所有空行和#开头都会被git忽略。
doc//*.doc -
移除文件
要从git移除某个文件,就必须从已跟踪清单移除,然后提交。
可以使用git rm命令完成此项工作,并连带从工作目录中删除指定文件。 -
移动文件
-
撤销操作
注意,有些撤销操作不可逆
git commit --amend
有时候我们提交完裁发现漏了几个文件没有添加,或者提交信息写错了,我们可以运行--amend重新提交
这个命令会提交暂存区的文件。如果自上次提交以来还未做任何修改,那么快照会保持不变。 -
取消暂存文件
git reset HEAD <file>
来取消暂存,不加选项的调用git reset并不危险,他只会修改暂存区域。
- 撤销对文件的修改
git checkout -- [file]
- 从远程仓库拉取数据
git fetch [remote-name]
只有当有克隆服务器的写入权限,并且之前没有人提交过。这条命令才能生活。
- 创建标签
git主要有两种标签:轻量标签与附注标签
一个轻量标签很像一个不会改变的分支 - 他只是一个特定提交的引用。
附注标签是存储在git数据库中的一个完整对象。附注标签拥有打标签者的名字,电子邮件,日期时间,标签信息。
git tag -a v1.4 -m '附注信息'
git show
git tag -a v1.5 commitId
git show查看标签信息
- 共享标签
默认情况下,git push命令并不会传送标签到远程仓库上。必须显示的推送到服务器上。
git push origin [tagname]
- git分支
git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。
git提交时,会保存一个提价对象。该提交对象包含一个指向暂存内容快照的指针。该提交对象还包含了各种信息,以及指向它父对象的指针。首次提交产生的提交对象没有父对象。
暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照保存git仓库中,最终将校验和加入到暂存区域等待提交。
当git commit时,git会计算每一个子目录的校验和,然后在git仓库中这些校验和保存为树对象。随后,git会创建一个提交对象,它除了包含各种信息外,还包含指向这个树对象(项目根目录)的指针。git在需要的时候就可以重现此次保存的快照。
git仓库有五个对象:3个blob对象、一个树对象(记录文件目录和blob对象索引)以及一个提交对象。
-
快进
由于当前master分支所指向的提交是你当前提交的直接上游,所以git只是简单将指针向前移动。 -
远程跟踪分支
远程跟踪分支是远程分支状态的引用。它们是你不能移动的本地引用,远程跟踪分支是你上次连接到远程仓库时,那些分支所处状态的书签。 -
推送
当你想要公开分享一个分支时,需要将其推送到有写入权限的远程仓库上。
将分支push上去之后,下一次其他作者从服务器上抓取数据时,他们会在本地生成一个远程分支。 -
跟踪分支
从一个远程跟踪分支检出一个本地分支叫做跟踪分支。跟踪分支是一个与远程分支有直接关系的本地分支。如果在一个跟踪分支上git pull,git能自动识别去哪个服务器抓取数据。
当clone一个仓库时,通常会自动创建一个跟踪分支。 -
变基
在git中整合来自不同分支的修改主要有两种方法:merge和rebase,在c4中引入补丁和修改,然后在c3的基础上应用一次。
git checkout exp
git rebase master
在master所指向的分支中应用exp分支的修改,并创建一个新的提交对象。它的原理是首先找到这两个分支的共同祖先,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底c3,最后将之前另存为临时文件的修改依序应用。现在回到master进行一次快进合并。
例如向某个其他人维护的项目贡献代码时。首先在自己的分支里进行开发,开发完成时需要先将自己的代码变基到master上,然后在向主项目提交修改。
变基是将一系列的提交应用到另一分支上,而合并则是把最终结果和到一起。
使用快进合并将分支指向同一个提交
-
变基风险
如果你已经将提交推送至某个仓库,而其他人已经从该仓库拉取提交并进行了后续工作,此时
,如果用git rebase重新整理提交。。。 -
变基原则
只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送处别处的提交执行变基操作。
服务器上的git
- smart HTTP协议
可以直接使用各种http的验证机制,使用http协议的用户名/密码的基础授权,免去设置ssh公钥。
smart http既支持git协议一样设置匿名服务,也可以像ssh协议一样提供传输时的授权和加密。
分布式Git
-
集中式工作流
如果两个开发者从中心仓库clone代码下来,同时做一些修改,那么只有第一个开发者可以把数据推送回共享服务器。 -
集成管理者工作流
Git允许多个远程仓库存在,每个开发者拥有自己仓库的读写权限和其他开发者的读权限。这种情形会有一个权威仓库。要为这个项目做贡献,你需要从该项目clone一个自己的公开仓库,然后将自己的修改推送上去。 -
私有管理团队
我们假设o和e在一个特性上工作,同时o和e在第二个特性上工作。
- 首先e创建了一个featureA
- e又创建了一个featureB
- o推送了一个分支featureBee
- 此时e将featureB分支上合并的工作推送到featureBee上。
- o推送改动到了featureA
-
合并工作流
首先,我们会维护两个长期分支,分别是master和develop,master分支只会在一个非常稳定的版本发布时才会更新,而所有的新代码首先会被整合进develop分支。当打标签发布的时候,需要将master分支快进到develop分支,实际上就是将develop分支merge进master分支。 -
大项目合并工作流
Git项目包含四个长期分支:master,next,用于新工作的pu和用于维护性向后移植工作的maint分支。贡献者的新工作会收入特性分支中。之后对特性分支进行评估,检查能否合并。安全的特性分支会被合并入next分支 -
为发布打标签
留下一个标签的目的是在之后任何一个提交点都可以重新创建该发布。
如果标签被签名,在版本库以blob对象的形式包含它们的公钥,并添加一个直接指向该内容的标签,首先找到所想要的key。
之后可以通过导出key并通过管道传递给git hash-object来直接将key导入git数据库中,git hash-object命令会向Git中写入一个包含其内容的新blob对象,并向你返回sha1值,然后通过sha1的值创建一个指向它的标签:
然后通过git push o--tags,标签将会被共享给所有人。
github
- Fork
如果想参与某个项目,但是没有推送权限,可以进行fork,github将在你的空间中创建一个完全属于你的项目副本,且你对其具有推送权限。然后通过pull request让它们的改动进入源版本库,
网友评论