Git分布式版本控制系统(上半节)

96 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

Git分布式版本控制系统 | 青训营笔记

Git分布式版本控制系统(上半节)

一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统

为什么需要版本控制?

更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生;也能够随时切换到不同的版本,回滚误删误改的问题代码;

历史演变

  • 本地版本控制:

  • 集中版本控制:SVN

    优点: 1.学习简单,更容易操作 2.支持二进制文件,对大文件支持更友好(游戏)

    缺点: 1.本地不存储版本管理的概念,所有提交都只能联上服务器后才可以提交 2.分支上的支持不够好,对于大型项目团队合作比较困难 3.用户本地不保存所有版本的代码,如果服务端故障容易导致历史版本的丢失。

  • 分布式版本控制: Git 基本原理 1.每个库都存有完整的提交历史,可以直接在本地进行代码提交 2.每次提交记录的都是完整的文件快照,而不是记录增量 3.通过Push等操作来完成和远端代码的同步

优点 1、分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体2.分支管理功能强大,方便团队合作,多人协同开发 3.校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失 缺点

1.相对SVN更复杂,学习成本更高 2.对于大文件的支持不是特别好(git-lfs工具可以弥补这个功能)

常见问题

1.为什么我明明配置了Git配置,但是依然没有办法拉取代码?

  • 没有配置密钥
  • 没有权限 2.为什么我 Fetch 了远端分支,但是我看本地当前的分支历史还是没有变化?
  • Fetch 只会更新ORigin的分支

Git目录介绍

项目初始化

  • mkdir study
  • cd study
  • git init

image.png

--initial-branch初始化的分支 --bare创建一个裸仓库(纯Git目录,没有工作自录) --template可以通过模版来创建预先构建好的自定义git目录

查看树结构

git tree.git 注:win的gitbush是没有tree命令的 如果要使用这个命令

image.png

image.png

查看文件内容

cat .git/HEAD

image.png

  • head master
  • config 配置文件信息
  • objects 数据文件信息
  • refs 分支目录信息

工作区$暂存区

  • 工作区:更改代码,新增目录
  • 暂存区:存储add$commit保存的记录 保存在 .git目录 image.png

2.1.1 Git Config

不同级别的 Git配置

  • global
  • system
  • local 低级别的配置会覆盖高级别的配置

2.1.2 常见的Git配置

  • 用户名配置 git config --global user.name“liaoxingju”

git config --global user.email liaoxingju@bytedance.com

image.png

image.png

  • Git命令别名配置

git config --global alias.cin "commit --amend --no-edit"

image.png

2.2 Git Remote

翻译: remote:遥控装置,遥控器

一般没有配置的newPlayer是没有git remote的

  • 查看remote $ git remote -v
  • 添加Remote源 $ git remote add origin_ssh git@github.com:git/git.git

$ git remote add origin_http github.com/git/git.git

  • 查看帮助 git remote -h
  • 再一次查看remote image.png
  • 查看配置文件 image.png
  • 同一个 Origin设置不同的 Push和Fetch URL git remote add origin git@github.com:git/git

git remote set-url --add --push origin gitegithub.com:MY_REPOSITY/gitgit remote -v

  • vim命令直接编辑内部内容 vim .git/config

2.2.1 HTTP Remote

不推荐使用http的方式来访问GitHub 相对比较不安全

  • URL: github.com/git/git.git
  • 免密配置 内存: git config --global credential.helper 'cache --timegut=3600'

硬盘: git config --global credential.helper "store --file /path/to/credential-file"不指定目录的情况默认是~/.git-credentials

  • 将密钥信息存在指定文件中 具体格式: scheme://{scheme}://{user}:${password}@github.com

2.2.2 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

我们可以通过打开GitHub配置sshKey 点击头像打开设置 -》SSH and GPG keys-》new SSH key

key为之前生成在 文档.pub 里面

image.png

Git Add

功能:

  • 会将文件拉到暂存区
  • 放在objects目录下

1.创建一个readme.md

  • touch readme.md

2.编辑内容

  • vim readme.md

git add 前 image.png

image.png

git add 后

image.png

image.png

  1. 通过objectId(object文件)查看内容
  • git cat-file -p a6c7f60cad44f7196c815944f5faba07614b6e42
  1. commit 提交

然后多了俩个object 子文件

一个是类型信息 一个是提交信息

$ git commit -m "add readme"

  • 看一下object image.png
  • 类型信息 image.png
  • 作者信息

image.png

git log 查看最新提交的信息 image.png

2.5 Objects

  • commit / tree / blob在git里面都统一称为Object,除此之外还有个 tag的object.

  • Blob:存储文件的内容

  • Tree:存储文件的目录信息

  • Commit:存储提交信息,一个 Commit可以对应唯一版本的代码

如何把这三个信息串联在一起呢?

  1. 通过 Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID.
  2. 通过Tree存储的信息,获取到对应的目录树信息。
  3. 从tree中获得 blob的ID,通过Blob ID获取对应的文件内容。

2.6 refs

Refs文件存储的内容

  • 通过 cat [文件目录] refs的内容就是对应的Commit ID

  • 因此把ref 当做指针,指向对应的 Commit来表示当前Ref 对应的版本。

不同种类的ref

  • refs/heads前缀表示的是分支,除此之外还有其他种类的 ref,比如refs/tags前缀表示的是标签。

Branch

  • git checkout 一b 可以创建一个新分支

  • 分支一般用于开发阶段,是可以不断添加Commit进行迭代的

Tag

  • 标签一般表示的是一个稳定版本,指向的Commit一般不会变更

git tag v0.0.1

image.png

创建一个分支

  • $ git checkout -b test

image.png

2.7 Annotation Tag

什么是附注标签?

  • 一种特殊的Tag,可以给Tag提供一些额外的信息。

如何创建附注标签?

  • 通过git tag -a命令来完成附注标签的创建。

image.png

  • 查看该tag object的内容。

image.png

image.png

image.png