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

152 阅读5分钟

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

0. 概要

本文为「Git 的正确使用姿势与最佳实践」课程的部分笔记,记录了课程中讲述的一些知识点,以便于后续回顾。

1.Git基本命令

  • 配置git

    • git config
    • git remote
  • 提交代码

    • git add
    • git commit
  • 远端同步

    • 拉取代码

      • clone
      • pull
      • fetch
    • 推送代码

      • push
  • 2.常见问题

    • 为何配置了Git但还是无法拉取代码

      1. 免密认证没有配。
      2. Instead Of配置没有配,配的SSH免密配置,但是使用的还是HTTP协议访问。
    • 为何Fetch了远端分支,但在本地当前的分支历史无变化

      1. 仅会更新orgin分支
      2. fetch 会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化。

3.Git目录介绍

项目初始化(在移动至项目目录后执行)

  • git init

其他参数

  • --initial-branch

    • 初始化分支
    • 自定义主分支名称
  • --bare

    • 创建一个裸仓库(纯Git目录,没有工作目录)
    • 一般在服务器创建的仓库使用此方式
  • --template

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

git目录内容

  • HEAD:表示当前指向的分支
  • config:存储相关配置
  • hooks:配置一些hook
  • objects:一些文件信息
  • refs:分支信息

其他内容:

  • 工作区:改代码和新建文件
  • 暂存区:修改后的代码通过add添加至暂存区

不同级别的Git配置

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

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

4.常见Git配置

  1. 用户名配置

    1. git config --global user.name "xxx"
    2. git config --global user.email "xxx"
  1. Instead of 配置

    1. git config --global url.git@github.cm:.insteadOf github.com/
  1. Git 命令别名配置

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

      • 输入cin后即等同于输入commit --amend --no-edit

5.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

    •   Http Remote(相关免密配置)

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

    •     硬盘- git config --global credential.helper "strore --file /path/to/credential-file"

      -   不指定目录的情况下默认是 ~/.git-credenetials
      
    •     将秘钥信息存在指定文件中,具体格式: scheme://{scheme}://{user}:${password}@github.com

    •   SSH Remote(相关免密配置)    通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问

    •     Key的类型- dsa:现在已不安全- rsa:默认,现在已不安全- ecdsa- ed25519:现在优先推荐使用

    •     生成公私钥- 例子:ssh-keygen -t ed25519 -C "${MyEmail}"- 钥默认存在 ~/.ssh/id_ed25519.pub- 公钥放在Git仓库(Github)

6.Git Add

  • 将当前新文件添加至版本更新中
    • git cat-file -p ${objects文件夹内的目录+目录内文件名称}

      • 显示此次add的内容
    • git commit -m "add readme"

      • 将add的文件进行commit,并配上文字说明
  • 7.Objects

    • commit/tree/blob 在git里都统一称为Object

    • Blob:存储文件内容

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

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

    • 三者如何串联至一起?

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

      •     切换到分支"test"上

8.Refs

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

  • 9.追溯历史版本

    • 获取当前版本代码:通过Ref指向的Commit可以获取唯一的代码版本
    • 获取历史版本代码:Commit里会存有parent commit字段,通过commit 的串联获取历史版本代
  • 10.修改历史版本

    • commit --amend

      • 修改最近一次commit信息,修改后的commit id会变
    • rebase

      • 通过 git rebase -i HEAD~3 可以实现对最近三个commit的修改

        •       1. 合并commit
        •       2. 修改具体的commit message
        •       3. 删除某个commit
    • filter --branch

      • 可以指定删除所有提交中的某个文件或全局修改邮箱地址等操作
    • 修改commit 后 新增了commit object,但旧的commit object并未被删除,而是悬空,即变成了没有ref指向的object

    • git fsck --lost-found

      • 可以查找悬空的commit
  • 11.Git GC:垃圾回收

    • GC

      • 通过git gc可以删除一些不需要的object,并对object进行一些打包压缩来减少仓库体积
    • Reflog

      • reflog用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期
    • 指定时间

      • git gc prune=now 指定的是修剪多久之前的对象,默认为两周前

12.完整的Git视图

  • 13.Git Clone & Pull & Fetch

    • Clone

      • 拉取完成的仓库到本地,可以指定分支与深度
    • Fetch

      • 将远端某些分支最新代码拉取到本地,不会执行merge操作
      • 会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作。
    • Pull

      • 拉取远端某分支,并和本地代码进行合并,操作等同于git fetch+git merge,适合于对远端代码情况不清楚,很可能会产生冲突时;当对代码非常清楚与了解时,也可以通过git pull-rebase完成git fetch+git rebase操作。
    • 可能存在冲突,需要解决冲突。

  • 14.Git Push

    • 常用命令

      •     一般使用git push origin master命令即可完成
    • 冲突问题

      •     1. 如果本地的commit记录和远端的commit历史不一致,则会产生冲突,比如git commit--amend or git rebase都有可能导致这个问题。
      •     2.如果该分支就自己一个人使用,或者团队内确认过可以修改历史则可以通过git push origin master 一f 来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送。
    • 推送规则限制

      •     可以通过保护分支,来配置一些保护规则,防止误操作,或者一些不合规的操作出现,导致代码丢失。

15.总结

git的操作方式非常丰富,熟练掌握git的操作方法对于提高团队开发效率非常重要。

思维导图: