基础概念与配置
像 CVS、Subversion、Perforce等版本控制系统存储的是每个文件与初始版本的差异。
而Git更像是把数据看做是对小型文件系统的一组快照,存储的是项目随时间改变的快照。
Git基础概念- SHA1
SHA1
- 所有用来表示项目历史信息的文件,是通过一个40个字符的“对象名”来索引
- “对象名”看起来像这样:82e777898ff32f0be3c247b2a7132ac90f8f99cf
优点
- Git只要比较“对象名”,就可以很快的判断两个对象是否相同
- 因为在每个仓库的“对象名”的计算方法都完全一样,如果同样的内容存在两个不同的仓库中,就会存在相同的“对象名”下。
- Git可以通过检查对象内容的SHA1的哈希值和“对象名”是否相同,来判断对象内容是否正确。
Git基础概念-blob、tree、commit、tag
blob: 用来存储文件数据(文件内容而非文件名),通常是一个文件。
tree: 有点像一个目录,它管理一些“tree”或者“blob”(就像文件和子目录)
commit:指的是Git的一个提交对象。指向一个“tree”,并且带有相关的描述信息。
tag:用来标记某一个commit的方法。
Git基础概念-对象模型
可以类比为文件系统
Git基础概念-三个区域
工作区工作目录是对项目的某个版本独立提取出来的内容。
暂存区是一个文件,保存了下次将提交的文件列表信息,一般在Git仓库目录中。有时候也被称作“索引”,不过一般说法还是叫暂存区域。
Git仓库目录是Git用来保存项目的元数据和对象数据库的地方。
基本的Git工作流程
- 在工作目录中修改文件
- 暂存文件,将文件的快照放入暂存区域
- 提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库目录。
Git首次配置&获取帮助
配置文件优先级(从高到低)
-
.git/config
(只会影响当前仓库) ->~/.gitconfig
(会影响到所有仓库) ->/etc/gitconfig
必须配置
$ git config --global user.name "John Doe"
$git config --global user.email johndoe@oppo.com
常用配置
-
$ git config --global core.editor vim
(改编辑器) -
$ git config --list
(查看所有配置项)
获取帮助
-
git help config
(查看 git config 命令的帮助文档)
Git首次配置-Gerrit SSH
Gerrit SSH
-
$ ssh-keygen
-> 一路回车 ->cat ~/.ssh/id_rsa.pub
-> 复制 - Gerrit -> 账号 -> Settings -> SSH Public Keys -> Add Key -> 粘贴 -> Add
Git首次配置-Gerrit HTTP
Gerrit HTTP 避免每次输入用户名和密码
获取、修改并提交到仓库
clone with commit-msg hook
会自动添加 Change-Id footer(当前没有Change-Id,推送会失败)
可以通过 --reference
来加速clone,先检查本地 mirror仓库路径
例子:
git clone ssh://ssh地址 --reference /地址
修改并提交到仓库 - 文件状态
文件地状态变化周期只有两种:已跟踪和未跟踪
已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。
工作目录中,除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。
修改并提交到仓库 - git status
$git status
修改并提交到仓库 - git add
git add -A
和 git add .
一样,会将new files, modified files 和 deleted files都放到暂存区。
git add -u
new files需要手动放入暂存区。
修改并提交到仓库 - git diff
-
git diff
查看详细修改,工作区和暂存区比较 -
git diff --cached
暂存区和HEAD比较 -
git diff HEAD
工作区和HEAD比较
修改并提交到仓库 - git commit
每次准备提交前,先用 git status
检查一下,然后再运行提交命令 git commit
基本操作:
git clone
-> 修改,会文件总共有四种状态 -> git status
-> git diff
查看修改内容 -> git status
-> git add
-> git status
检查状态,没问题后 -> git commit
提交