一、Git原理
1. Git采用的是全量存储方案
所谓全量方案,就是每个版本都保存所有的数据(多是代码,文件占据空间较小)。优点:快速;缺点:浪费空间。
与此相对的是增量方案:保存的是上一个版本 + 补丁。优点:节省空间;缺点:要进行运算,费时。
2. 文件变动信息的存储
git把每次文件的改动都存在项目根目录下的.git文件夹中。
3. .git文件夹中的文件
-
利用哈希算法SHA-1计算得到文件的哈希值,依据此哈希值来判断文件内容是否有改变。
注:由于哈希值是唯一的(几乎不会重复),所以可以保证同一个文件只存储一份。
-
使用
tree
结构来存储文件是叶节点,文件夹是非叶节点
4. 暂存区(index文件)
5. 快照链表
HEAD
指针指向最新的快照。
想恢复某个版本,就把指针指向那个版本,然后使用 checkout
命令;或者直接 checkout
那个版本的哈希值。
6. 协同和分支
项目需要多人分别开发时(假设两人开发),可以在 master
主分支进行 checkout
操作,分出两个分支,每个人在自己的分支进行开发工作,开发完成后进行合并操作。有两种合并方式:
-
merge
:合并时,两个分支和这两个分支的公共祖先进行三方合并。 -
rebase
:将A分支保存到一个临时目录下,然后撤销此分支上所有commit,再将B分支的commit接到这条分支上(此时两个分支基本一致),最后再将临时目录下保存的内容接到这条分支后。若此时删掉B分支,则此时就只有一条包含所有功能的分支注:rebase会修改提交记录
二、Git命令
1. 本地库初始化
在项目的根目录进行操作
git init
# 注意:生成的 .git 目录中存放的是本地库相关文件,不要删除
2. 设置签名
签名的作用是区分不同操者身份。用户信息在每一个版本提交中能够看到,以此确认本次提交是谁做的。
-
项目(仓库)级别
仅在当前本地库有效
git config user.name tom # 设置用户名tom git config user.email du@qq.com # 设置用户邮箱
-
系统用户级别
仅在当前登录的操作系统用户有效
git config --global user.name tom git config --global user.email du@qq.com
仅仅加了一个
--global
优先级别:
项目级别
>系统级别
信息保存位置:
~/.gitconfig 文件
,即C盘下的用户目录
3. 添加文件(到暂存区)
git add fileName # 指定文件
git add . # 所有
# 将工作区的文件添加到暂存区
4. 查看状态
git status
# 查看工作区、暂存区状态
5. 提交(到本地库)
git commit -m 'commit message'
# 将暂存区内容提交到本地库
6. 创建分支
git branch dev_dxx
# 创建名称为dev_dxx的分支
7. 切换分支
git checkout dev_dxx
# 切换到dev_dxx分支
8. 查看分支
git branch -v
9. 合并分支
git branch dev_aaa
git checkout dev_aaa # 新建一个分支并切换过来
# ... 对文件进行更改
# 合并分支的时候要明确谁谁合并
git checkout master # 回到master分支进行merge
git merge dev_dxx # 先合并dev_dxx,不会有冲突,因为此分支相当于是对master进行后续操作
git merge dev_aaa # 再合并dev_aaa,若修改过同一个文件,则此时会有冲突conflict
10. 解决merge冲突
-
放弃合并
git merge --abort
-
手动合并冲突
-
打开有冲突的文件,文件内有冲突的部分会以下述形式分隔开来
<<<<<<<<<<<<<< 当前分支的代码 ============== 合并过来的代码 >>>>>>>>>>>>>>
-
重新添加并提交
git add fileName git commit -m 'merged'
-
11. 查看日志
git log # 查看所有的版本记录
git reflog # 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
三、Git结合Github
1. 创建远程仓库
在 Github 上新建远程仓库
2. 添加远程版本库
git remote add 别名 远程地址
# 例子:git remote add origin https://github.com/Du-xx/gitTest.git
3. 查看远程地址别名
git remote -v
4. 推送 push
git push 别名 分支名
git push -u 别名 分支名 # -u指定默认主机
# 例子:git push origin master
5. 克隆 clone
将远程仓库的项目克隆到本地,clone进行一次从无到有的过程,更新用 pull
git clone 远程地址
# 例子:git clone https://github.com/Du-xx/gitTest.git
6. 拉取 pull
本地已经存在 clone 下来的文件,用 pull 进行更新
# pull = fetch + merge
git fetch 别名 分支名
git merge 别名 分支名
# 等价于
git pull 别名 分支名
# 例子:git pull origin master
7. 删除git与github的联系
git remote remove origin # origin是本仓库在github上的别名
8. fork
用于团队外协作,其他人员使用 fork 将代码拉到自己的远程仓库中,可以直接进行更改,也可以 pull 到本地更改后 push 到远程仓库,之后进行 pull request,等待原有团队审核后 merge 即可