xxyi

git 基础与常用命令

2026-04-30

什么是 git?

git 是一个版本工具,核心是 .git 目录中的文件。git init 以后,目录下就会自动创建 .git 以及 .gitignore。.gitignore 中输入文件或者目录,git 仓库将不追踪这些文件的改动,.gitignore 支持通配符。

git 的直觉

一个 git 仓库,里面所有的提交构成一张 DAG(有向无环图),一个 commit 就是一个节点,每个 commit 都会指向它的上一个 commit。

分支可以理解为指针(实际称呼为 ref),指向某一个节点(commit)。HEAD 是当前目录下的指针,当前目录呈现 git 仓库哪个版本(commit 节点)依靠 HEAD 指针,而 HEAD 指针要指向某个分支。

tips:不过 HEAD 也可以走"分离指针头"状态,直接指向具体的某个 commit,绕过分支。一个 commit 可能会指向多个父节点(考虑合并提交的情况)。

常见 git 仓库图结构(不考虑边的出入方向):

                    fix/login

                  ─── X ──┐
                 /        ↓
main:  A ─ B ─ C ─────── M1 ── D ── E ────────── M2 ── F   ← main
                  \                              /
                   P ── Q ── R ──── S ── T ─────┘    
                         \                ↑
                          U ── V         feature/api

                        feature/ui

git 常用命令

### 起步
git init
git clone <url>
 
### 三件套(每天用 N 次)
git status                          # 我现在啥情况?
git add <file> / git add -A         # 把改动暂存
git commit -m "msg"                 # 提交
 
### 看历史
 
git log --oneline --graph --all      
git diff / git diff --staged
 
### 分支操作(现代写法用 switch, 也可以用 checkout)
 
git branch                           # 列分支
git switch <branch>                  # 切分支
git switch -c <new-branch>           # 新建并切过去 (c = create)
git branch -d <branch>               # 删
 
### 同步
 
git fetch                            # 拉远端最新 ref, 不动本地
git pull --rebase                    # 拉 + 把本地提交 rebase 到远端之上 (推荐)
git push / git push -u origin <br>   # 首次推送加 -u

tips:

  • 对新起的项目,git init 让 git 接管目录下文件
  • git add -A 将整个项目工作区中的修改添加到暂存区;git add . 只提交当前目录下的修改
  • git diff 看工作区修改但是还没提交到暂存区的代码;git diff --staged 看暂存区的改动(已经 git add 但是还没有 git commit
  • git checkout 也可以切分支,根据后续的参数不同,可以实现 git switchgit restore 的功能。现在最佳实践是分两个命令,意图更清晰
  • git pull = git fetch + git merge