跳转至

1. 概念

  • 版本控制系统 (VCSs) 是一类用于追踪源代码(或其他文件、文件夹)改动的工具→标准:Git
  • 在Git的术语里,文件被称作Blob对象(数据对象),也就是一组数据。目录则被称之为“树”,它将名字与 Blob 对象或树对象进行映射
  • Git 的数据模型及伪代码表示:

    Text Only
    // 文件就是一组数据
    type blob = array<byte>
    
    // 一个包含文件和目录的目录
    type tree = map<string, tree | blob>
    
    // 每个提交都包含一个父辈,元数据和顶层树
    type commit = struct {
        parent: array<commit>
        author: string
        message: string
        snapshot: tree
    }
    

  • Git 中的每个快照都有一系列的“父辈”,也就是其之前的一系列快照。注意,快照具有多个“父辈”而非一个,因为某个快照可能由多个父辈而来。例如,经过合并后的两条分支。

    • for e.g. 假设同时开发两个不同的特性,它们之间是相互独立的;开发完成后,这些分支可能会被合并并创建一个新的提交,这个新的提交会同时包含这些特性
  • Git中的对象可以是blob,树或提交;当他们引用其他对象的时候,都仅仅保存哈希值作为引用,就可以基于SHA-1哈希进行寻址
  • 哈希值可读的名字:分支

\(\Rightarrow\) Git仓库的定义:对象引用

  • 暂存区(staging area)机制【?】

2. Git 的命令行接口

2.1 基础

2.1.1 获取帮助的方式

Bash
git help <verb>

![[Pasted image 20240624155836.png]]

  • git help <command>: 获取 git 命令的帮助信息
  • git init: 创建一个新的 git 仓库,其数据会存放在一个名为 .git 的目录下
  • git status: 显示当前的仓库状态
  • git add <filename>: 添加文件到暂存区
  • git commit: 创建一个新的提交
  • git log: 显示历史日志
  • git log --all --graph --decorate: 可视化历史记录(有向无环图)
  • git diff <filename>: 显示与暂存区文件的差异
  • git diff <revision> <filename>: 显示某个文件两个版本之间的差异
  • git checkout <revision>: 更新 HEAD 和目前的分支

分支和合并

  • git branch: 显示分支
  • git branch <name>: 创建分支
  • git checkout -b <name>: 创建分支并切换到该分支
    • 相当于 git branch <name>; git checkout <name>
  • git merge <revision>: 合并到当前分支
  • git mergetool: 使用工具来处理合并冲突
  • git rebase: 将一系列补丁变基(rebase)为新的基线

远端操作

  • git remote: 列出远端
  • git remote add <name> <url>: 添加一个远端
  • git push <remote> <local branch>:<remote branch>: 将对象传送至远端并更新远端引用
  • git branch --set-upstream-to=<remote>/<remote branch>: 创建本地和远端分支的关联关系
  • git fetch: 从远端获取对象/索引
  • git pull: 相当于 git fetch; git merge
  • git clone: 从远端下载仓库

撤销

  • git commit --amend: 编辑提交的内容或信息
  • git reset HEAD <file>: 恢复暂存的文件
  • git checkout -- <file>: 丢弃修改
  • git restore: git2.32版本后取代git reset 进行许多撤销操作