关于Git|青训营笔记

101 阅读3分钟

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

git 配置

git 初始化

在目录中使用git init命令初始化

部分参数:

  • --initial-branch 初始化的分支
  • --bare 创建纯git目录,没有工作目录
  • --template 可以通过模板构建

git config

git的配置分为3个级别:

  • system: 一般保存在etc/gitconfig
  • global: 一般保存在~/.gitconfig
  • local: 保存在git目录下.git/config 不同级别的配置可以有重复,低级别的配置会覆盖高级别的配置

常见的 git 配置

  1. 用户名
  • git config --global user.name "MY_NAME"
  • git config --global user.email "MY_NAME@example.com"
  1. instead of
  • 可以用作url替换: <原url>:.insteadOf <新url>
  1. 别名
  • alais.<command> "你不想打的很长的命令"

git remote

使用git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <name> <url>命令添加远端仓库

配置ssh免密:

  • 推荐使用ed25519格式:ssh-keygen -t ed25519 [-C 注释]
  • 秘钥默认生成在~/.ssh文件夹中,将.pub公钥添加到远端仓库就可实现ssh免密

git 原理

git 目录

.git/
├── HEAD
├── config
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
    ......
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       ├── heads
│       │   └── main
│       └── remotes
│           └── origin
│               ├── HEAD
│               └── main
├── objects
│   ├── 02
│   │   └── a7f7006e7db6188cfca9855dc9482108105075
        ......
│   ├── ff
│   │   └── 037c0f34b7c6449b6914512ff5e51efc6f62dc
│   ├── info
│   └── pack
│       ├── pack-dcf56a7f71a89d58509cde31ee231b143429f1a6.idx
│       └── pack-dcf56a7f71a89d58509cde31ee231b143429f1a6.pack
├── packed-refs
└── refs
    ├── heads
    │   └── main
    ├── remotes
    │   └── origin
    │       ├── HEAD
    │       └── main
    └── tags
  • config (配置)该文件包含你的仓库配置,比如远程的 url ,你的邮箱和用户名等。
  • description(描述)仓库的描述。
  • hooks (钩子) Git 提供了一套脚本,可以在每个有意义的 Git 阶段自动运行。这些被称为钩子的脚本可以在提交 (commit)、变基 (rebase)、拉取 ( pull ) 操作的前后运行。脚本命预示着它的执行时机。如我们可以编写 pre-push 的作为钩子,进行推送代码前的检查。
  • info (信息)你可以将不想被 git 管理的文件记录到 .gitignore 文件中。排除文件的意思是不想共享这个文件。例如你不想共享你的 IDE 自定义配置,将其添加到 .gitignore 文件中即可。
  • objects(对象) 分为几个不同的类型:
    • Blob 存储文件内容信息
    • Tree 存储目录树信息
    • Commit 存储提交信息
    • Tag 存储标签
  • refs 保存branch和tags对应的commit

代码提交

存储结构

graph LR
Commit --> Tree -->Blob
Tree --> Tree2

每一个commit 相当于一个快照,存储了整个仓库的状态。 commit类型的object会指向一个tree,tree会指向blob

命令

git add

git add命令将文件添加到暂存区,此时objects目录中会添加文件的Blob

git commit

git commit -m "提交消息"命令将创建一个commit,objects目录中会添加tree保存了目录信息,commit保存了对应的tree的id和提交信息

创建分支

git checkout -b <branch_name> 创建一个新的分支,在refs/heads中会出现新的分支

tag

gti tag创建标签, git tag -a 创建附注标签,可以添加一些信息

修改历史

  • commit --amend 修改最近一次的提交信息, 修改之后的commit id会变化
  • rebase 功能很强大,可以
    • 合并commit
    • 修改具体的commit message
    • 删除某个commit
  • filter --branch 该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作