Git的正确使用 | 青训营

112 阅读5分钟

什么是Git?

Git是一款分布式源代码管理工具(版本控制工具) 。

Git得其数据更像是一系列微型文件系统的快照。使用Git,每次提交或保存项目状态时,Git基本上都会记录当时所有文件的外观,并存储对该快照的引用。为了提高效率,如果文件没有改变,Git不会再次存储文件,只是指向它已存储的上一个相同文件的链接。Git认为它的数据更像是一个快照流,会将数据作为项目的快照存储一段时间。可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件

为什么要使用Git?

协同工作:

业界绝大多数公司都是基于Git进行代码管理的,因此Git是一个程序员的必备技能

开源社区

目前绝大多数的开源项目都是基于Git维护的,参与这些项目的开发都需要使用Git


常见问题:

  1. 入职后按照文档进行Git配置,但是配置后依然拉取代码有问题,缺少自己排查问题的能力
  2. 研发流程中进行一些异常操作,不符合研发规范,不清楚保护分支,MR/PR等概念

版本控制:

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

为什么需要版本控制?

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

版本控制类型代表性工具解决的问题
本地版本控制RCS本地代码的版本控制
集中式版本控制SVN提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人协作问题
分布式版本控制Git每个仓库都能记录版本历史,解决只有一个服务器保存版本的问题

本地版本控制

最初的方式

通过本地复制文件夹,来完成版本控制,一般可以通过不同的文件名来区分版本

解决方案

开发了一些本地的版本控制软件,起哄最流行的是RCS

基本原理

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

缺点

RCS这种本地版本控制存在最致命的缺陷就是只能在本地使用,无法进行团队合作,因此使用的场景非常有限,因此衍生出了集中式版本控制

集中式版本控制

d877c6102fc038f90d15b5ace633257.png

  • 代表工具:SVN

基本原理

  1. 提供了一个远端服务来保存文件,所有用户的提交都提交到该服务器中
  2. 增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突

优点

  1. 学习简单,更容易操作
  2. 支持二进制文件,对大文件支持更友好

缺点:

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

分布式版本控制

  • 代表工具:Git

基本原理:

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

优点:

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

缺点

  1. 相对SVN更复杂,学习成本更高
  2. 对于大文件的支持不是特别好(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目录

ad1f54481eddd81bf802c2531a51184.png

不同级别·的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/

6030a0cfa9205edcd7a7a2dc69622e4.png

Git命令别名配置
git config --global alias.cin"commit --amend --no-edit"

0e34546367118e973cb5d75be56a7a3.png


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

6582e2def307839db66c88d24a34610.png

HTTP Remote

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


Objects

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

  • Blob:存储文件的内容
  • Tree:存储文件的目录信息
  • Commit:存储提交信息,一个Commit可以对应唯一版本的代码
如何把这三个信息串联在一起呢?
  1. 通过Commit寻找到Tree信息,每个Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID

7421684b242c8d31517f56595e35660.png


2.通过Tree存储的信息,获取到对应的目录树信息