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:从远程仓库获取代码库到本地
- 已修改 Modified (工作区已更改,未进入暂存区)
文件相对上一次提交或暂存区发生了变化,但这些变化只存在于工作目录里,尚未被Git记录到下一次提交的候选集合中。相关命令包括:
新建仓库指令
- 初始化一个本地仓库:
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