git使用指南

git 是使用最多的版本控制系统,版本控制系统 (VCSs) 是一类用于追踪源代码(或其他文件、文件夹)改动的工具。顾名思义,这些工具可以帮助我们管理代码的修改历史;不仅如此,它还可以让协作编码变得更方便。VCS通过一系列的快照将某个文件夹及其内容保存了起来,每个快照都包含了文件或文件夹的完整状态。同时它还维护了快照创建者的信息以及每个快照的相关信息等等。

Git 拥有一个经过精心设计的模型,这使其能够支持版本控制所需的所有特性,例如维护历史记录、支持分支和促进协作

git 数据模型

Git 将顶级目录中的文件和文件夹作为集合,并通过一系列快照来管理其历史记录。在Git的术语里,文件被称作Blob对象(数据对象),也就是一组数据。目录则被称之为“树”,它将名字与 Blob 对象或树对象进行映射(使得目录中可以包含其他目录)。快照则是被追踪的最顶层的树。

一个文件就是一个Blob 对象,一个目录对应一个 Tree。

这个顶层的树包含了两个元素,一个名为 “foo” 的树(它本身包含了一个blob对象 “bar.txt”),以及一个 blob 对象 “baz.txt”。

Git 数据模型伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 文件就是一组数据
type blob = array<byte>

// 一个包含文件和目录的目录
type tree = map<string, tree | blob>

// 每个提交都包含一个父辈,元数据和顶层树
type commit = struct {
parent: array<commit>
author: string
message: string
snapshot: tree
}

Git 中的对象可以是 blob、树或提交:

1
type object = blob | tree | commit

Git 在储存数据时,所有的对象都会基于它们的 SHA-1 哈希 进行寻址。

1
2
3
4
5
6
7
8
objects = map<string, object>

def store(object):
id = sha1(object)
objects[id] = object

def load(id):
return objects[id]

Blobs、树和提交都一样,它们都是对象。当它们引用其他对象时,它们并没有真正的在硬盘上保存这些对象,而是仅仅保存了它们的哈希值作为引用。

使用 git cat-file -p 某次object的hash值 可以查看相应具体内容

为了解决方便人们操作,Git 的给某些特定的哈希值赋予可读的名称,master 引用通常会指向主分支的最新一次提交,HEAD,指向当前分支的最新提交,origin 是默认的远程仓库名称。

git 命名行接口

参考文章: https://git-scm.com/book/zh/v2

基础

  • git help <command>: 获取 git 命令的帮助信息

  • git init: 创建一个新的 git 仓库,其数据会存放在一个名为 .git 的目录下

  • git status: 显示当前的仓库状态

  • git add <filename>: 添加文件到暂存区

  • git commit -m ""

    : 创建一个新的提交

  • git log: 显示历史日志

  • git log --all --graph --decorate: 可视化历史记录(有向无环图)

  • git show 查看具体的修改信息

  • 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 merge 会多一条提交记录。merge操作遇到冲突时候,当前merge不能继续下去。手动修改冲突内容后,add 修改,commit 就可以了。git merge –abort 终止合并

  • git mergetool: 使用工具来处理合并冲突

  • git rebase: 将一系列补丁变基(rebase)为新的基线, 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

    rebase 的执行过程是首先找到这两个分支(即当前分支 Featurerebase 操作的目标基底分支 Master) 的最近共同祖先提交 A,然后对比当前分支相对于该祖先提交的历次提交(D 和 E),提取相应的修改并存为临时文件,然后将当前分支指向目标基底 Master 所指向的提交 C, 最后以此作为新的基端将之前另存为临时文件的修改依序应用

    Git rebase 时出现冲突,解决冲突后,git add 后执行git rebase –continue 不要 commit, git rebase 是按照一条一条执行的 commit 信息的。 如何在 rebase 多次提交时防止多次 git 冲突?

远端操作

  • 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: 编辑提交的内容或信息, 如果您只想修改提交消息而不更改提交的内容,可以添加 --only 选项。
  • git reset HEAD <file>: 恢复暂存的文件
  • git checkout -- <file>: 丢弃修改
  • git restore: git2.32版本后取代git reset 进行许多撤销操作,把文件从缓存区撤销,回到未被追踪的状态。

Git 高级操作

  • git config: Git 是一个 高度可定制的 工具
  • git clone --depth=1: 浅克隆(shallow clone),不包括完整的版本历史信息
  • git add -p: 交互式暂存
  • git rebase -i: 交互式变基
  • git blame: 查看最后修改某行的人
  • git stash: 暂时移除工作目录下的修改内容, git stash save、 git stash apply
  • git bisect: 通过二分查找搜索历史记录
  • .gitignore: 指定 故意不追踪的文件

git使用指南
https://curry1998.github.io/2024/01/13/git使用指南/
作者
curry1998
发布于
2024年1月13日
许可协议