Git的基本使用方式| 青训营笔记

151 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第13天。

由于最近写大项目团队需要使用Git,因此基于字节跳动廖兴桔讲师的课程先学习了一些Git的基本知识。

Git是什么?

Git是分布式板块控制系统,是现在大部分分布式项目的版块控制工具。

版本控制历史

本地版本控制

代表工具:RCS

基本原理

本地保存所有变更的补丁集,可以理解为就是所有的Diff,通过这些补丁计算出每个版本的实际的文件内容。

image.png

集中式版本控制

代表工具:SVN 提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人协作问题。

基本原理

所有的用户的代码都提交到远端服务器中,增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突。

image.png

分布式版本控制

代表工具:GIT 每一个仓库都能记录历史版本,解决只有一个服务器保存版本的问题。仍是今天一些美术、游戏团队的首选工具,因此他们所迭代的产品的资源都比较大。

基本原理:

  • 每个库都存有完整的提交历史,可以直接在本地进行代码提交
  • 每次提交记录的都是完整的文件快照,而不是像SVN或RCS一样记录增量
  • 通过Push等操作来完成和远端代码的同步

优点

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

缺点

对于大文件的支持不是特别好,但git-ifs工具可以弥补这个功能。

image.png

Git的衍生平台

Github

全球最大的代码托管平台。

Gitlab

全球最大的开源代码托管平台,项目的所有代码都是开源的,便于在自己的服务器上完成Github的搭建,具备更高的自由度来实现企业的个性化。

Gerrit

由Google开发的一个代码托管平台,Android这个开源项目就托管在Gerrit之上。

Git基本使用方式

Git基本命令

配置

git config
git remote

提交代码

git add
git commit

远端同步

拉取代码:

  • clone
  • pull
  • fetch

推送代码:

  • push

Git目录介绍

项目初始化

git init --> 默认分支是monster分支 然后就会有一个.git文件啦,代表git可以操作该文件了。

其他参数

  • --initial-branch 初始化时确定分支

  • --bare 创建一个裸仓库(纯Git目录,没有工作目录)

  • --template 可以通过模板来创建预先构建好的自定义git目录

  • HEAD:

    • 表示当前指向的分支
  • config:

    • 当前仓库的配置
  • objects:

    • 存储一些文件信息
  • refs:

    • 存一些分支信息

Git config

不同级别的Git配置

三种级别

  • --global
  • --system
  • --local

每个级别的配置可能重复,但是低级别的配置会覆盖高级别的配置。

常见Git基本配置

  • 用户名配置
    • git config --global user.name "steakSunflower"
  • instead of 配置
  • Git命令别名配置
    • git config --global alias.cin "commit --amend --no-edit"(用于简化命令)

Git Remote

表示本地和远端仓库的一些关联信息。

查看remote

remote -v

添加remote

git remote add origin_ssh git@github.com:git/git.git
git remote add origin_http github.com/git/git.git

同一个Origin设置不过不同的Push和Fetch URL
get remote set-url --add --push origin git@github.com:my_repo/git.git

HTTP Remote

走的是HTTP协议做身份认证。
URL:github.com/git/git.git

免密配置

  • 密码存内存:git config --global credential.helper 'cache --timeout=3600'

  • 密码存硬盘:git config --global credential.helper "store --file /path/to/credential-file"

  • 不指定目录的情况默认是~/.git-credentials

  • 将密钥信息存在指定文件中

  • 具体格式:scheme://{scheme}://{user}:${password}@github.com

    但这是相对不太安全的。

SSH Remote

URL:git@github.com:git/git.git

免密配置

SSH可以通过公私钥的机制,将生成公钥存在服务端,从而实现免密访问。

目前的Key的类型四种:dsa、rsa、ecdsa、ed25519。
默认使用的是rsa,由于一些安全问题,现在已经不推荐使用rsa和dsa了,优先推荐使用ed25519

公私钥配置:

ssh-keygen -t ed25519 -C "steak1452560640@163.com"

Git add

git cat-file -p xxxxxxxxxxx(id) --> 查看文件内容

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获取对应的文件内容

Refs

Branch

git checkout -b test 创建一个新分支 分支一般用于开发阶段,是可以不断添加Commit进行迭代的,

Tag

标签一般表示的是一个稳定版本,指向的Commit一般不会变更,
通过git tag 命令生成tag

Refs在创建后会多一个test的分支。

Refs的内容就是对应的Commit ID。 因此把ref当做指针,指向对应的Commit来表示当前Ref对应的版本。

以上内容若有不正之处,恳请您不吝指正!