什么是Git?
Git是一款分布式源代码管理工具(版本控制工具) 。
Git得其数据更像是一系列微型文件系统的快照。使用Git,每次提交或保存项目状态时,Git基本上都会记录当时所有文件的外观,并存储对该快照的引用。为了提高效率,如果文件没有改变,Git不会再次存储文件,只是指向它已存储的上一个相同文件的链接。Git认为它的数据更像是一个快照流,会将数据作为项目的快照存储一段时间。可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件
为什么要使用Git?
协同工作:
业界绝大多数公司都是基于Git进行代码管理的,因此Git是一个程序员的必备技能
开源社区
目前绝大多数的开源项目都是基于Git维护的,参与这些项目的开发都需要使用Git
常见问题:
- 入职后按照文档进行Git配置,但是配置后依然拉取代码有问题,缺少自己排查问题的能力
- 研发流程中进行一些异常操作,不符合研发规范,不清楚保护分支,MR/PR等概念
版本控制:
一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况的系统
为什么需要版本控制?
更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生;也能够随时切换到不同的版本,回滚误删误改的问题代码
| 版本控制类型 | 代表性工具 | 解决的问题 |
|---|---|---|
| 本地版本控制 | RCS | 本地代码的版本控制 |
| 集中式版本控制 | SVN | 提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人协作问题 |
| 分布式版本控制 | Git | 每个仓库都能记录版本历史,解决只有一个服务器保存版本的问题 |
本地版本控制
最初的方式
通过本地复制文件夹,来完成版本控制,一般可以通过不同的文件名来区分版本
解决方案
开发了一些本地的版本控制软件,起哄最流行的是RCS
基本原理
本地保存所有变更的补丁集,可以理解成就是所有的Diff,通过这些补丁,我们可以计算出每个版本的实际文件内容
缺点
RCS这种本地版本控制存在最致命的缺陷就是只能在本地使用,无法进行团队合作,因此使用的场景非常有限,因此衍生出了集中式版本控制
集中式版本控制
- 代表工具:SVN
基本原理:
- 提供了一个远端服务来保存文件,所有用户的提交都提交到该服务器中
- 增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突
优点:
- 学习简单,更容易操作
- 支持二进制文件,对大文件支持更友好
缺点:
- 本地不存在存储版本管理的概念,所有提交都只能联上服务器后才能提交
- 分支上的支持不够好,对于大型项目团队合作比较困难
- 用户本地不保存所有版本的代码,如果服务端故障容易导致历史版本的丢失
分布式版本控制
- 代表工具:Git
基本原理:
- 每个库都存在有完整的提交历史,可以直接在本地进行代码提交
- 每次提交记录的都是完整的文件快照,而不是记录增量
- 通过Push等操作来完成和远端代码的同步
优点:
- 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
- 分支管理功能强大,方便团队合作,多人协同开发
- 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失
缺点:
- 相对SVN更复杂,学习成本更高
- 对于大文件的支持不是特别好(git-lfs工具可以弥补这个功能)
Git的使用
Git基本命令
-
配置
-git config
-git remote
-
提交代码
-git add
-git commit
-
远端同步
**·**拉取代码:
-cione
-pull
-fetch
**·**推送代码:
-push
项目初始化:
-mkdir study
-cd study
-git init
其他参数:
--initial-branch 初始化的分支
--bare 创建一个裸仓库(春Git目录,没有工作目录)
--template 可以通过模板来创建预先构建好的自定义git目录
不同级别·的Git配置——每个级别的配置可能重复,但是低级别的配置会覆盖高级别的配置
常见Git配置
用户名配置:
git config --global user.name "xiaoming1"
git config --global user.email xiaoming@bytedance.com
Instead of 配置
git config --global url.git@github.com:.insteadOf https://github.com/
Git命令别名配置
git config --global alias.cin"commit --amend --no-edit"
Git Remote
查看Remote: git remote -v
添加Remote:
git rempte add origin_ssh git@github.com:git/git.git
git remote add origin_http https://github.com/git/git.git
同一个Origin设置不同的Push和Fetch URL
HTTP Remote
免密配置
-
内存: git config --global credential.helper'cache --timeout=3600'
-
硬盘: git config --global credential.helper"store --file/path/to/credential-file"
不指定目录的情况默认是-/.git-credentials
Objects
commit/tree/blob在git里面都统一称为Object,除此之外还有个tag的object
- Blob:存储文件的内容
- Tree:存储文件的目录信息
- Commit:存储提交信息,一个Commit可以对应唯一版本的代码
如何把这三个信息串联在一起呢?
- 通过Commit寻找到Tree信息,每个Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID
2.通过Tree存储的信息,获取到对应的目录树信息