Git 常用命令

Git 常用命令

一份面向初学者的 Git 命令速查与教程,涵盖配置、基本操作、分支管理、远程协作、撤销修改等日常开发场景。


1. 配置

Git 的配置分为三个层级,优先级从高到低:

层级 命令 生效范围
仓库级 git config --local 当前仓库
用户级 git config --global 当前用户
系统级 git config --system 整台机器

设置用户名与邮箱(安装后必做)

git config --global user.name "你的名字"
git config --global user.email "your.email@example.com"

常用配置

git config --global core.editor "code --wait"     # 默认编辑器设为 VS Code
git config --global core.autocrlf true             # Windows 下自动转换换行符
git config --global color.ui auto                  # 启用颜色输出
git config --global init.defaultBranch main        # 默认分支名设为 main
git config --global alias.co checkout              # 设置别名(见下文)

查看配置

git config --list             # 列出所有配置
git config --global --list    # 列出用户级配置
git config user.name          # 查看单项配置

设置别名(Alias)

git config --global alias.st status
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.co checkout
git config --global alias.lg "log --oneline --graph --all --decorate"

# 之后就可以用
git st    # 代替 git status
git lg    # 查看漂亮的提交历史图

2. 基本操作

初始化与克隆

git init                    # 初始化一个新仓库
git init my-project         # 创建目录并初始化
git clone <url>             # 克隆远程仓库
git clone <url> my-folder   # 克隆到指定目录
git clone --depth=1 <url>   # 浅克隆(只拉取最新版本,速度更快)

文件的四个状态

工作区  ──git add──▶  暂存区  ──git commit──▶  本地仓库  ──git push──▶  远程仓库
                              ▲
                              └── 新文件/修改后文件

添加与提交

git add file.txt              # 添加单个文件到暂存区
git add .                     # 添加所有变更(当前目录及子目录)
git add -A                    # 添加所有变更(全仓库)
git add -p                    # 交互式分段添加(大改时推荐)

git commit -m "feat: 添加用户登录功能"     # 直接提交
git commit -a -m "fix: 修复崩溃问题"      # 跳过暂存区,直接提交已跟踪文件
git commit --amend -m "新提交信息"        # 修改最近一次提交的信息
git commit --amend --no-edit             # 不修改信息,把暂存区内容合并到上一次提交

提交信息规范(Conventional Commits)

<类型>(<范围>): <简短描述>

# 常用类型
feat:      # 新功能
fix:       # 修复 bug
docs:      # 文档更新
style:     # 代码格式(不影响功能)
refactor:  # 重构(既不是修复也不是新功能)
perf:      # 性能优化
test:      # 测试相关
chore:     # 构建、CI 等杂项
ci:        # CI 配置变更

示例:

git commit -m "feat(auth): 添加 OAuth 2.0 登录支持"
git commit -m "fix(parser): 修复空输入时的空指针异常"

3. 分支管理

创建与切换

git branch                    # 查看本地分支列表(*标记当前分支)
git branch -a                 # 查看所有分支(含远程)
git branch -r                 # 只查看远程分支

git branch feature-login      # 创建新分支(不切换)
git checkout feature-login    # 切换到已有分支
git switch feature-login      # 新版 Git 推荐的方式

git checkout -b feature-login # 创建并切换到新分支(常用)
git switch -c feature-login   # 新版等价写法

git branch -m old-name new-name   # 重命名分支
git branch -d feature-login       # 删除已合并的分支
git branch -D feature-login       # 强制删除(未合并也能删)

分支命名建议

feature/xxx        # 新功能
bugfix/xxx         # 修复 bug
hotfix/xxx         # 紧急修复
release/xxx        # 发布版本

4. 远程协作

远程仓库管理

git remote -v                    # 查看远程仓库地址
git remote add origin <url>      # 添加远程仓库
git remote remove origin         # 移除远程仓库
git remote set-url origin <url>  # 修改远程仓库地址
git remote rename origin upstream # 重命名远程仓库

拉取与推送

git push                          # 推送到默认远程(origin)
git push origin main              # 推送到指定分支
git push -u origin feature-xxx    # 推送并建立上游关联(首次推送常用)
git push --force                  # 强制推送(慎用!)
git push --force-with-lease       # 安全强制推送(检查远程是否有新提交)

git pull                          # 拉取并合并(相当于 git fetch + git merge)
git pull --rebase                 # 拉取并变基(推荐,保持历史线性)

git fetch                         # 获取远程更新但不合并
git fetch origin                  # 获取指定远程的更新
git fetch --prune                 # 获取更新并清理已删除的远程分支

常见推送问题解决

# 推送被拒绝(远程有本地没有的提交)
git pull --rebase      # 先变基拉取
git push               # 再推送

# 或
git fetch
git rebase origin/main
git push

5. 查看历史与状态

git status                    # 查看工作区状态
git status -s                 # 简洁模式(-s = short)

git log                       # 查看提交历史
git log --oneline             # 一行显示
git log --graph               # 以图形显示分支
git log --oneline --graph --all  # 最常用组合
git log -5                    # 只看最近 5 条
git log --author="张三"       # 按作者过滤
git log --since="2024-01-01"  # 按时间过滤
git log --grep="fix"          # 按提交信息搜索

git log -p                    # 显示每次提交的 diff
git log --stat                # 显示变更文件统计

git show                      # 显示最新提交详情
git show <commit-hash>        # 显示某次提交详情
git show HEAD                 # 显示当前最新提交

查看文件差异

git diff                      # 工作区 vs 暂存区(未暂存的变更)
git diff --staged             # 暂存区 vs 最近提交(已暂存的变更)
git diff HEAD                 # 工作区 vs 最近提交
git diff main..feature        # 两个分支对比
git diff <commit1> <commit2>  # 两次提交对比
git diff --name-only          # 只显示变更文件名

6. 撤销与回退

工作区撤销

git restore file.txt              # 撤销工作区的修改(新版)
git checkout -- file.txt          # 同上(旧版写法)

git restore .                     # 撤销所有未暂存的修改

暂存区撤销

git restore --staged file.txt     # 取消暂存(从暂存区移回工作区)
git reset HEAD file.txt           # 同上(旧版写法)

提交撤销

git reset --soft HEAD~1           # 撤销最近一次提交,保留工作区和暂存区内容
git reset --mixed HEAD~1          # 撤销最近一次提交,保留工作区,清空暂存区(默认)
git reset --hard HEAD~1           # 撤销最近一次提交,工作区和暂存区全部丢弃(⚠️ 慎用!)

git reset --hard <commit-hash>    # 回退到指定提交(丢弃中间所有提交)

git revert HEAD                   # 生成一个新的提交来撤销上一次提交(推荐用于公共分支)
git revert <commit-hash>          # 撤销某次特定提交

reset vs revertreset 会删除历史,不要在公共分支使用;revert 安全地生成反向提交,适合任何分支。


7. 暂存与储藏

当你需要切换分支但不想提交当前工作进度时:

git stash                     # 储藏当前修改
git stash save "描述信息"     # 带描述的储藏
git stash list                # 查看所有储藏列表

git stash pop                 # 恢复最近一次储藏并删除它
git stash apply               # 恢复最近一次储藏但不删除
git stash apply stash@{2}     # 恢复指定储藏

git stash drop stash@{0}      # 删除指定储藏
git stash clear               # 清空所有储藏
git stash branch feature-xxx  # 从储藏创建新分支(可在冲突时恢复)

8. 标签管理

git tag                           # 列出所有标签
git tag -l "v2.*"                 # 按模式搜索标签

git tag v1.0.0                    # 创建轻量标签
git tag -a v1.0.0 -m "发布 v1.0.0"  # 创建附注标签(推荐)
git tag -a v1.0.0 <commit-hash> -m "对历史提交打标签"

git push origin v1.0.0            # 推送单个标签
git push origin --tags            # 推送所有标签

git tag -d v1.0.0                 # 删除本地标签
git push origin --delete v1.0.0   # 删除远程标签

git describe                      # 显示最近的标签名(常用于版本号自动生成)

语义化版本(SemVer)

v主版本.次版本.修订号

# 示例
v1.0.0    # 首个稳定版本
v1.1.0    # 新增功能
v1.1.1    # 修复 bug
v2.0.0    # 不兼容的 API 变更

9. 合并与变基

合并(Merge)

git checkout main
git merge feature-login           # 将 feature-login 合并到 main
git merge --no-ff feature-login   # 禁用快进合并(保留分支历史)
// --no-ff 的效果
// 不加 --no-ff(快进,历史是直线)
main:   A---B---C
                     ↑ 看不出来曾有过 feature 分支

// 加 --no-ff(保留分支节点)
main:   A---B---C---D
                  \ /
            feature

变基(Rebase)

git checkout feature
git rebase main                   # 将 feature 分支变基到 main 之上

# 交互式变基(整理提交历史)
git rebase -i HEAD~3              # 交互式修改最近 3 次提交

交互式变基提供的操作:

命令 缩写 含义
pick p 保留该提交
reword r 保留但修改提交信息
edit e 保留但修改提交内容
squash s 合并到上一个提交
fixup f 合并到上一个提交并丢弃提交信息
drop d 删除该提交

解决冲突

# 合并或变基时出现冲突
# 1. 打开文件,搜索 <<<<<<<, =======, >>>>>>>
# 2. 手动保留需要的代码,删除冲突标记
# 3. 保存文件

git add file.txt                  # 标记冲突已解决
git commit                        # 完成合并(merge 时)
git rebase --continue             # 继续变基(rebase 时)

git rebase --abort                # 放弃变基,回到开始前状态
git merge --abort                 # 放弃合并,回到开始前状态

10. 高级技巧

二分查找(Bisect)

快速定位引入 bug 的提交:

git bisect start
git bisect bad                    # 标记当前版本为有 bug
git bisect good v1.0.0            # 标记一个已知的好版本
# Git 会帮你二分查找,每次告诉你还剩多少步
# 测试后标记:
git bisect good                   # 当前版本无 bug
git bisect bad                    # 当前版本有 bug
# 重复直到找到第一个有 bug 的提交
git bisect reset                  # 结束 bisect

查找谁修改了某行

git blame file.txt                # 查看每行是谁改的
git blame -L 10,20 file.txt       # 只看第 10-20 行
git blame -w file.txt             # 忽略空格变更

清理

git clean -n                      # 预览将被删除的未跟踪文件
git clean -f                      # 删除未跟踪文件
git clean -fd                     # 删除未跟踪文件和目录

选择提交(Cherry-pick)

# 将某个分支的特定提交应用到当前分支
git cherry-pick <commit-hash>
git cherry-pick <hash1> <hash2>   # 挑选多个提交
git cherry-pick A..B              # 挑选 A 到 B 之间(不含 A)的所有提交

子模块

git submodule add <url> path              # 添加子模块
git clone --recurse-submodules <url>      # 克隆项目并初始化子模块
git submodule update --init --recursive   # 拉取所有子模块更新

11. 常见工作流

个人项目(最简单)

git init
git add .
git commit -m "init"
git remote add origin <url>
git push -u origin main
# 日常:
git add . && git commit -m "xxx" && git push

功能分支工作流(Feature Branch)

# 从 main 创建功能分支
git checkout -b feature/user-profile

# 在功能分支上开发
git add . && git commit -m "feat: 添加用户资料页"

# 同步主分支(定期变基)
git fetch origin
git rebase origin/main

# 提交 PR / Merge Request 前
git rebase -i HEAD~3     # 整理提交历史
git push -u origin feature/user-profile

# 合并到 main(通常通过 PR 在平台操作)
git checkout main
git pull
git branch -d feature/user-profile

Git Flow

# 经典分支模型
main          # 生产分支,保持稳定
develop       # 开发主分支
feature/*     # 功能分支,基于 develop
release/*     # 发布分支,基于 develop
hotfix/*      # 紧急修复,基于 main

紧急修复(Hotfix)

git checkout main
git checkout -b hotfix/crash-fix
# 修复代码
git add . && git commit -m "fix: 修复崩溃"
git push -u origin hotfix/crash-fix
# 合并到 main 和 develop

附:配置速查表

.gitignore 常用模式

# 编译产物
*.exe
*.dll
*.so
*.o
*.class
target/
build/
dist/

# 依赖
node_modules/
vendor/
.venv/

# 环境与配置
.env
.env.local
*.config.js

# IDE
.idea/
.vscode/
*.swp
*.swo
.DS_Store
Thumbs.db

# 日志与临时文件
*.log
*.tmp

.gitattributes 常见配置

# 文本文件自动转换换行符
* text=auto

# 指定特定文件的换行符
*.sh text eol=lf
*.bat text eol=crlf

# 二进制文件声明
*.png binary
*.jpg binary
*.zip binary

常用命令速查卡

操作 命令
初始化 git init
克隆 git clone <url>
添加 git add .
提交 git commit -m "msg"
推送 git push
拉取 git pull --rebase
创建分支 git switch -c <name>
切换分支 git switch <name>
合并分支 git merge <name>
查看状态 git status
查看历史 git log --oneline --graph
撤销工作区 git restore <file>
撤销暂存区 git restore --staged <file>
储藏 git stash
恢复储藏 git stash pop
打标签 git tag -a v1.0 -m "msg"
推送标签 git push --tags

生成时间:2025-01
数据来源:Git 官方文档、Pro Git 书籍、社区实践总结

上一篇 LaTeX 常见语法
下一篇 从Markdown到WordPress的邮件发布流水线