目录
Git基础知识
Git简史
2005年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权利。为了Linux Kernel的持续开发,Linux的缔造者Linus Torvalds与众多Linux开源社区的开发者基于使用BitKeeper时的经验教训进行了Git的设计和开发。
初版Git就发行于2005年,随着时间的发展,Git日臻成熟完善。如今它依然是世界上最先进的分布式版本控制系统。
Git仓库
Git仓库的组成
典型的Git仓库由以下三部分组成:
- 本地的CMDB(Configuration Management Database,配置管理数据库)
- 工作目录
- 暂存区
本地的CMDB存在于Git仓库中.git目录(通常是隐藏的)下,存储着所有的版本控制数据;
工作目录即本地文件系统,存储Git仓库中的文件;
暂存区隔离工作目录和Git仓库,被称为区域但其实只是在文件上打标记来区分(见下一节:Git仓库的文件状态)。
Git仓库的文件状态
每个文件处于以下三种状态之一(打标记实现):
- 已修改(Modified)
- 已暂存(Staged)
- 已提交(Committed)
三者的互相转换可参考下图:
Git版本管理
Git中的版本演化关系图
版本演化关系图(Object Graph)是一个有向无环图,体现了一个Git仓库的历史。下图是一个简单的例子:
图中一条边A->B表示“在版本B的基础上作出变化,形成了版本A”,除此之外,还要注意以下几点:
- HEAD指向当前commit对象
- 分支(branch)只是一个指向commit对象的名称
- 除去初始commit外,每个commit对象指向一个父对象
- 一个commit对象最多有两个父对象——通常只有一个,合并(Merge)操作才会有两个
- 多个commit对象可以指向同一个父对象——创建分支(branch)后产生
Git版本变化的存储方式
传统的版本控制工具存储版本之间变化的代码行,而Git存储版本之间变化的文件。这样做方便了使用者创建不同的分支,但缺点在于如果要查看两个版本间的差异则需要进行比较处理。
下图为变化在Object Graph中表现方式的一个示例:
Git常用命令
本地Git仓库部分
获取Git仓库
1、本地初始化创建仓库
$ git init
此命令将把当前目录初始化为Git仓库(生成隐藏的.git目录)。
2、克隆现有的仓库
$ git clone <url>
从url克隆同名仓库至当前目录。
假如要指定仓库的名字,可在命令后添加额外的参数指定。
暂存与放弃修改操作
$ git add .
# 将当前目录下所有已修改文件添加到暂存区
$ git add *
# 将仓库所有已修改文件添加至暂存区(不包括文件名以'.'开头的文件)
$ git add [filename]
# 将指定文件添加到暂存区
$ git rm [filename]
# 同时删除暂存区和本地文件
$ git rm --cached [filename]
# 从暂存区删除但不删本地文件
撤销操作
$ git commit --amend
# 重新提交上次提交(一般用于添加漏掉的文件)
$ git checkout -- <file>
# 撤销对文件所做的修改
$ git reset HEAD <file>
# 撤销文件暂存
查看操作
$ git status
# 查看未暂存、已暂存的修改,如果关联了远程库还包括本地库与远程库的比较
$ git diff
# 查看未暂存文件变化
$ git diff --cached
# 查看已暂存文件与上次提交之间的变化
$ git diff HEAD
# 查看未暂存和已暂存的所有差异,是对以上两种的复合
$ git branch -a
# 查看所有分支
$ git branch -v
# 查看每一个分支的最后一次提交
分支与合并操作
$ git checkout -b [branch]
# 新建一个分支,并切换到此分支
$ git branch [branchname]
# 新建一个分支,但仍停留在当前分支
$ git branch –d [branch]
# 删除指定分支
$ git checkout [branchname]
# 切换到指定分支,并更新工作区
$ git merge [branch]
# 合并分支到当前分支
$ git branch -m old_name new_name
# 修改分支名
以下为部分操作的示意图:
远程Git仓库部分
查看、添加远程仓库
$ git remote
# 查看远程仓库(使用-v参数会显示简写和地址)
$ git remote add <shortname> <url>
# 添加远程仓库
Git支持多个远程仓库关联同一个本地仓库,使用git clone命令实际上自动添加了一个远程仓库。
抓取、拉取与推送
$ git fetch <remote>
# 访问远程仓库,从中拉取所有你还没有的数据,而且会自动添加此远程仓库
$ git pull
# 从最初克隆的服务器上抓取并自动尝试合并到当前所在的分支
$ git push <remote> <branch>
# 推送到远程仓库,若未指定remote和branch则推送至默认远程仓库的默认分支
参考资料
- Git官方手册(中文版)
- 哈工大软件构造课程Ch3-Software Construction Process and Configuration Management课件