这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
Git的使用 |青训营笔记
为什么学习Git
协调工作
大部分公司都是提供Git对代码进行管理的,所以git是必备技能
开源社区
大部分开源社区都是Git维护,想参与进去就要学习Git
版本控制
Git简介
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Linus为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
版本控制是什么
一个记录或者若干文件内容变化,以便将来提供特定版本修订情况的系统
为什么进行版本控制
更好的关注变更,了解每个版本变动的是什么,方便对改动的代码进行检查,预防事故发生
也可以随时进行代码版本的切换,回滚误删误改的问题代码
版本控制的类型
主流的版本控制器:
- Git
- SVN (Subversion)
- CVS (Concurrent Version System)
- VSS (Microsoft Visual SourceSafe)
- TFS (Team Foundation Server)
- Visual Studio Online 版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN
本地版本控制
2集中式版本控制
3、分布式版本控制 Git
每个人都拥有全部的代码!安全隐患!
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
不会因为服务器损坏或者网络问题,造成不能工作的情况!
Git与SVN的主要区别
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件!
Git是目前世界上最先进的分布式版本控制系统。
Git发展历史
Git基本使用
Git目录介绍
常见Git配置
配置用户名
git config --global user.name "用户名"
配置邮箱
git config --global user.email "用户名邮箱"
配置ssh免密登录
ssh-keygen -t rsa -C "注册时的邮箱"
查看公钥
cat ~/.ssh/id_rsa.pub
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 remote add orgin_ssh git@github.com:git/git.git
git remote add orgin_http https://github.com/git/git.git
Http Remote
URL:http://github.com/git/git.git
免密配置:
'内存':git config --global credential.helper 'cache --timeout=3600'
硬盘:git config --global credential.helper "store --file /path/to/credential-file"
将密钥信息存在指定文件中
具体格式:${scheme}://${user}:${password}@github.com
SSH Remote
URL:git@github.com:git/git.git
免密配置:
SSH可通过公钥私钥的机制,将生成公钥存放在服务器,从而实现免密访问
目前Key的类型有四种:dsa rsa ecdsa ed25519
默认rsa,由于安全问题,现在不推荐使用dsa和rsa,优先推荐ed25519
ssh-keygen -t ed25519 -C "your_email@example.com" 默认密码在~/.ssh/id_ed25519.pub
Git add
Git commit
Object
commit /tree /blob 在git里面统称为Object ,除此之外还有个tag的object Bolb 存储文件的内容
Tree 存储文件的目录信息
Commit 存储提交信息,一个Commit可以对应唯一的版本代码
Refs
Refs文件存储的内容
refs的内容就是对应的Commit ID 因此把ref当成指针,指向对应的Commit来表示当前Ref的版本,
不同种类的ref refs/heads 前缀表示的是分支,除此之外还有其他类型的ref,比如refs/tags表示的是标签
Branch git checkout -b可以创建一个新分支 分支一般用来开发阶段,是可以不断添加commit进行迭代的
Tag 标签一般表示的是一个稳定的版本,指向commit的一般不会变更
通过Git tag生成tag
Annotation Tag
什么是附注标签 一种特殊的Tag,可以给Tag提供一些额外的信息
如何创建附注标签 通过git tag -a 命令完成附注标签的创建
查看该tag object的内容
追溯历史版本
获取当前版本的代码 通过Ref指向的Commit可以获得唯一的代码版本
获取历史版本代码 Commit里面会存有parent commit字段,通过commit的串联获取历史版本代码
修改历史版本
- commit -amend
通过一个命令可以修改最近一次的commmit信息,修改之后commit id会变
2.rebase
通过git rebase -i HEAD~3 可以实现对最近三个Commit的修改:
合并commit修改具体的commit message删除某个commit
3.filter -branch 该命令可以指定删除所有的提交中的某个文件或者全局修改邮箱地址等操作
Git GC
GC 通过git gc命令,可以删除一些不需要Object以及会对Object一些打包和压缩来减少仓库的体积
Reflog 是记录操作日志,防止误删除后数据的丢失,通过reflog来找到丢失的数据,手动将日志设置为过期
指定时间 git gc prune=now 指定的是修建多久之前的对象,默认是两周前
Git Clone & Pull & Fetch
Clone
拉取完整的代码到本地目录,可以指定分支,深度
Fetch
将远端的某些分支的最新代码拉取到本地,不会执行merge操作
会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作
PULL
拉取远端分支,并和本地代码合并,操作等同于 git fetch + git merge
可以通过git pull --rebase 完成git fetch + git rebase的操作
可能存在冲突,需要解冲突
Git Push
常用命令 将本地代码同步到远端 一般使用git push orgin master命令即可完成
为什么产生冲突 1.本地的commit记录和远端的commit历史不一致