Git 基本原理
哈希
![4bcee2cfbd159c74ba1d61c44c07999e.png](https://i-blog.csdnimg.cn/blog_migrate/213e8ea064e2d50f53240a58c3f747bf.jpeg)
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
- 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
- 哈希算法确定,输入数据确定,输出数据能够保证不变
- 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
- 哈希算法不可逆
Git 底层采用的是 SHA-1 算法。
哈希算法可以被用来验证文件。原理如下图所示:
![af5d6c7485327d9bb7d5b18f80e2d3fc.png](https://i-blog.csdnimg.cn/blog_migrate/8684d94e346db40d918029d68ef0dfec.jpeg)
Git 就是靠这种机制来从根本上保证数据完整性的。
Git 保存版本的机制
集中式版本控制工具的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
![29fb2bc63a633985eb7ecf005a4e84be.png](https://i-blog.csdnimg.cn/blog_migrate/76f3681b6742f44b6ad4b0cb6e7894ec.jpeg)
Git 的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。
![86e7e951b327bc3407c4b54c037fcef1.png](https://i-blog.csdnimg.cn/blog_migrate/831d0bee0c871834050f9607ba367a09.jpeg)
Git 文件管理机制细节
- Git 的“提交对象”
- 提交对象及其父对象形成的链条
Git 分支管理机制
分支的创建
![5f3d485c24958768046cd8f710178a9c.png](https://i-blog.csdnimg.cn/blog_migrate/60f4b01ad91597a7fb1f846a9c41d5a1.jpeg)
分支的切换
![9f388d7f4127964cace5da28127d5cbb.png](https://i-blog.csdnimg.cn/blog_migrate/4eaefa252434d7f169d21eda1c3a29df.jpeg)
当再切换的时候,就把head指向master的这个分支就好了:
![76aada6d7c7c6582bf9dfa324ae69a50.png](https://i-blog.csdnimg.cn/blog_migrate/dbdd5e7076a5ad9d0f9acb96e15c45d8.jpeg)
GitHub
GitHub 首页就是注册页面
创建本地库
创建远程库
![33201ac95f0f88d68710161638874c14.png](https://i-blog.csdnimg.cn/blog_migrate/423e5343a9f420e18f786c302b42ea2b.jpeg)
![bd49d13119e4ad2aaa21bdcbf14a46d2.png](https://i-blog.csdnimg.cn/blog_migrate/58411c7e241aa76bd731f6d99e9cd53c.jpeg)
刚创建好,这里会有一些操作的提示:
![bcba1b2cc41cd225574a53e1ffd477ee.png](https://i-blog.csdnimg.cn/blog_migrate/0568eff9bb824a8a0352da17432192fa.jpeg)
创建远程库地址别名
![b7cad8172af5fd030ed0626f739b05e5.png](https://i-blog.csdnimg.cn/blog_migrate/89bcbdf4cfa7fe58385123a28aa5db93.jpeg)
git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址]
fetch表示取回,push表示的就是推送:
![1a5b1a890d4562ca94516dad597c3cf2.png](https://i-blog.csdnimg.cn/blog_migrate/abd2166be27490b43902ce0ff6553295.jpeg)
推送
git push [别名] [分支名]
![411b46b20231f7b4a52c6e8016d2540c.png](https://i-blog.csdnimg.cn/blog_migrate/ed9b6c043c5f05624c92be5acd6ce12b.jpeg)
![b9714cca9a5db8e216c64438ef4d2153.png](https://i-blog.csdnimg.cn/blog_migrate/efa5b7b34ad736992f5db3235e7bf144.jpeg)
我们再到GitHub上就可以看到我们推送过来的文件了:
![42b66b912a39863a56c1868cd4918921.png](https://i-blog.csdnimg.cn/blog_migrate/3dcc1356693cfe172073e0a831ad5845.jpeg)
克隆
- 命令:git clone [远程地址]
- 效果完整的把远程库下载到本地创建远程地址的别名初始化本地库
团队成员邀请
![5be4603e215088c536af5fb27bf69abc.png](https://i-blog.csdnimg.cn/blog_migrate/eec0c38776c4dae7ab89f7ad730a9ee5.jpeg)
在邀请组员后,被邀请的组员就可以通过邀请的访问链接来进行访问:
![cd8e7612747124ed25eef8ad8c579ada.png](https://i-blog.csdnimg.cn/blog_migrate/94640bf6108c521213285a915e783b38.jpeg)
当访问邀请链接的时候,就会出现下面的这个界面:点击接受就可以了
![91927f332ee30be7b41d72eff6c0209c.png](https://i-blog.csdnimg.cn/blog_migrate/7bb6e368b70905a79bc2c319300fb73e.jpeg)
这个时候,被邀请的组员再往远程库里面推送就是可以成功了:
![f1487944d25305ad09dafe929d4c503a.png](https://i-blog.csdnimg.cn/blog_migrate/1c0b7b200341408a22a57a3347fd8d4b.jpeg)
拉取
- pull=fetch+merge
- git fetch [远程库地址别名] [远程分支名]
- git merge [远程库地址别名/远程分支名]
- git pull [远程库地址别名] [远程分支名]
- git fetch只是把远程库里面的文件下载到本地,把远程库的文件抓取下来,此时并没有修改本地工作区的文件,如果我们想查看下载了哪些文件,就可以切换远程的分支来进行查看文件
- git merge这个命令就是把远程的分支合并到本地的master,当合并完了之后,本地就有了新的内容了
解决冲突
![93bded66b2fc00a9a4a32fd75c16e95a.png](https://i-blog.csdnimg.cn/blog_migrate/e19a1879b0c38955e0facba57158c97b.jpeg)
- 要点如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
- 类比债权人:老王债务人:小刘老王说:10 天后归还。小刘接受,双方达成一致。老王媳妇说:5 天后归还。小刘不能接受。老王媳妇需要找老王确认后再执行。
跨团队协作
- Fork
这个图表示正在执行fork的这个操作:
![891c98f2fc6a20351e16e94d189e6068.png](https://i-blog.csdnimg.cn/blog_migrate/82923e99bcc2798ae24f1b7c8880c3dd.jpeg)
![1387cc1e799b40626a785a59ff605c02.png](https://i-blog.csdnimg.cn/blog_migrate/04b3c24f7e865cd9b8acd262ad039b7f.jpeg)
- 克隆下来,本地修改,然后推送到远程
- Pull Request
![16fbeb308907868b59a58ecc2b42f6aa.png](https://i-blog.csdnimg.cn/blog_migrate/fc64ff765088dd3c77eedfcc0242f28f.jpeg)
![0a871907b4382f7a7857e1bd20ddcfda.png](https://i-blog.csdnimg.cn/blog_migrate/9f33f1d0a488c209eea9808918486f25.jpeg)
现在轮到原团队的人来进行操作
![6bf6f9deb3cde06e2a59c0dc54f72c53.png](https://i-blog.csdnimg.cn/blog_migrate/a809f30337606dc8d50204ddadd16a3a.jpeg)
- 对话
可以进行交流
- 审核代码
- 合并代码
![4870f49a3dc95c8f8864fabffd114732.png](https://i-blog.csdnimg.cn/blog_migrate/b06773607fb6b8c706dec1d9afcb79d5.jpeg)
- 将远程库修改拉取到本地
SSH 登录
- 进入当前用户的家目录
$ cd ~ - 删除.ssh 目录
$ rm -rvf .ssh - 运行命令生成.ssh 密钥目录
$ ssh-keygen -t rsa -C nzyh12358@126.com
[注意:这里-C 这个参数是大写的 C] - 进入.ssh 目录查看文件列表
$ cd .ssh
$ ls -lF - 查看 id_rsa.pub 文件内容
把生成的key复制到GitHub里面的SSH and GPG keys里面:
![946dd749df8ae18e32b3a816c483cf5b.png](https://i-blog.csdnimg.cn/blog_migrate/7d80ea63073f3995972dcf3dfc187977.jpeg)
此时就是已经可以了:
![1fc8601958e237617894cebc5079ab5c.png](https://i-blog.csdnimg.cn/blog_migrate/08a03a21bd62b54e76a811e98992c5fe.jpeg)