Git基本命令和操作流程

%%{init: {'flowchart':{'curve':'basis'}}}%%
flowchart LR
  %% ====== Nodes ======
  subgraph Local["本地仓库"]
    W["工作目录
(Working Directory)"] S["暂存区/缓存区
(Staging Area)"] L["本地库/版本库
(Local Repository)"] end subgraph Remote["远程仓库"] R["远程仓库
(Remote Repository)"] end %% ====== Flows ====== R -- clone/fetch --> L W -- add --> S S -- commit --> L L -- push --> R L -- checkout --> W R -- pull=fetch+merge--> W

Git文件状态

在Git的日常工作流里,所有本地文件存在三种核心状态——工作区暂存区本地仓库,了解这些概念及其交互方式是掌握Git的关键。

  • 工作区
    工作区也称工作目录,是你在本地计算机上能看到的项目文件,也是你实际执行各项操作,包括查看、编辑、创建和删除文件的地方。所有对文件的更改首先发生在工作目录中。
  • 暂存区
    暂存区也称缓存区或索引,是一个临时存储区域,用于保存即将提交到本地仓库的更改。你可以选择性地将工作目录中的更改提交到暂存区,例如提交一个文件/多个文件/所有文件的更改。
  • 本地仓库
    本地仓库是一个隐藏在.git目录中的数据库,用于存储项目的所有提交历史记录。每次你提交更改时,Git会将暂存区中的内容保存到本地仓库中。

Git文件在三种状态之间的切换存在以下几个层次(可通过git status命令查询):

  • 未跟踪 Untracked (不存在于Git版本库中的文件)
    当你本地新建或复制进来一个文件,且还没有执行git add命令时,该文件存在于工作目录中,但从未被Git纳入跟踪,执行git status时会出现在Untracked files下。
  • 已跟踪 Tracked (Git已经在版本库中记录过该文件)
    一旦一个文件被添加到暂存区或被提交过,它就属于“已跟踪文件”。已跟踪文件又可分为以下三种状态:
    • 已修改 Modified (工作区已更改,未进入暂存区) 文件相对上一次提交或暂存区发生了变化,但这些变化只存在于工作目录里,尚未被Git记录到下一次提交的候选集合中。相关命令包括:
      • git add <file>:进入暂存区
      • git restore <file>:丢弃工作区改动
      • git diff:比较工作区和暂存区的区别
    • 已暂存 Staged (已进入暂存区,等待提交) 文件的某个版本已经被放入暂存区,表示你选定它成为下一次提交的一部分。
      注:一个文件可同时存在“modified + staged”两种状态,如暂存的是A版本,但工作区又继续改到了B版本。相关命令包括:
      • git commit -m "<msg>":提交更改
      • git reset <file>:把某文件从暂存区中移除,但不影响工作区
      • git diff --staged:比较暂存区和已提交的当前分支的区别
    • 已提交 Committed (已记录在本地仓库) 文件当前快照已写入Git本地仓库对象数据库,并被某次提交引用。若此时工作区/暂存区没有额外变动,则已提交的文件代表当前分支的最新版本。相关命令包括:
      • git log:查看提交日志
      • git push <remote> <branch>:将本地分支上传到远程并合并
      • git fetch:从远程仓库获取代码库到本地

新建仓库指令

  • 初始化一个本地仓库:git init
  • 拷贝一个远程仓库到本地,即下载一个项目(默认主分支):git clone <url>
    • 若下载仓库的指定分支:git clone -b <name> <url>

分支管理指令

  • 查看分支
    • git branch:查看本地分支
    • git branch -r:查看远程分支
    • git branch -a:查看所有分支
  • 创建/切换分支
    • git branch <name>:创建新分支
    • git checkout <name>:切换分支
    • git checkout -b <name>:创建并切换分支
  • 重命名分支
    • git branch -m <old> <new>:重命名分支
  • 合并分支
    • git merge <name>:将某分支合并到主分支
  • 删除分支
    • git branch -d <name>:安全删除本地分支(已合并才删除)
    • git branch -D <name>:强制删除本地分支
    • git push <remote> <name> --delte:强制删除远程分支

查看历史指令

  • 查看commit提交记录git log [--param] [branch]
    • git log:查看全部提交日志
    • git log -<num>:查看最近<num>次的提交日志
    • git log -p:查看所有提交日志的具体修改内容
    • git log --author=<auth>:仅查看由<auth>提交的日志
    • git log --since=<time>:仅查看<time>日期以后的提交日志(格式xxxx-x-x
    • git log --until=<time>:仅查看<time>日期之前的提交日志
    • git log --graph:以图形化方式显示分支和合并历史
    • git log --oneline:以简洁的一行格式显示提交信息
  • 查看Git对象的详细信息git show [--param] [object]
    [--param]的选项包括:
    • -p/--patch:显示提交的差异补丁
    • --no-patch:不显示补丁,仅显示提交信息
    • --name-only:仅显示更改的文件名
    • --stat:显示提交的统计信息,包括更改的文件、行数和文件变化
    • --oneline:以一行格式显示
      注:[--param]缺失时默认等价于git show -p
    [object]的范围包括:
    • 提交 (Commit):提交哈希(完整或前缀)、相对引用(HEAD, HEAD~1)、分支名(main、master)
    • 文件内容对象:某提交中的某文件<commit>:<path>,例:git show HEAD~1:README.md
      注:[object]缺失时默认等价于git show HEAD
  • 查看仓库当前状态git status
    该命令用于查看自上次提交之后,是否有对文件进行再次修改。
    该命令会输出以下信息:
    • 当前分支的名称
    • 当前分支与远程分支的关系(例如超前/滞后多少次提交)
    • 未暂存的修改(已修改但尚未添加到暂存区的文件)
    • 未跟踪的文件(尚未纳入版本控制的新文件)
  • 比较文件不同状态的差异git diff [--param] [path]
    [path]表示只看指定文件/目录的差异,可省略
    • git diff:工作区 vs 暂存区
    • git diff --staged/--cached:暂存区 vs 本地仓库
    • git diff HEAD:工作区 vs 本地仓库(算上未暂存和已暂存的)
    • git diff <commit-A> <commit-B>:提交A vs 提交B

提交与修改