一、核心原理
1.1 三个区域
工作目录 (Working Directory) [你随便改,还没决定要保存]
│ git add
▼ 暂存区 (Staging Area) [你想保存哪些文件?可以只选一部分]
│ git commit
▼ 本地仓库 (Local Repository) [真正保存版本,可以随时回去]
│ git push
▼ 远程仓库 (Remote Repository)
1.2 文件状态
| 状态 | 含义 | git status 显示 |
|---|
| Untracked | 新文件,Git 从未见过 | 红色 Untracked files |
| Modified | 已追踪的文件被修改了 | 红色 Changes not staged |
| Staged | 已 add,等待提交 | 绿色 Changes to be committed |
| Committed | 已提交,版本已保存 | nothing to commit |
二、配置命令
2.1 用户身份配置
| 命令 | 说明 |
|---|
git config --global user.name "用户名" | 设置全局用户名 |
git config --global user.email "邮箱" | 设置全局邮箱 |
git config --list | 查看所有配置 |
git config --global --unset <key> | 删除配置 |
注意:这只是“签名”,告诉别人代码是你写的,不验证身份。真正的鉴权用 SSH 或 Token。
2.2 配置层级
优先级:local > global > system
| 层级 | 命令 | 文件位置 | 作用范围 |
|---|
| local | git config --local | .git/config | 仅当前仓库 |
| global | git config --global | ~/.gitconfig | 当前用户所有仓库 |
| system | git config --system | Git 安装目录 | 整台电脑 |
实际使用:90% 的情况用 --global,特殊项目用 --local 覆盖。
2.3 SSH 鉴权配置
| 命令 | 说明 |
|---|
ssh-keygen -t ed25519 -C "邮箱" | 生成密钥对 |
cat ~/.ssh/id_ed25519.pub | 查看公钥,复制后添加到 GitHub |
ssh -T git@github.com | 测试连接 |
~/. ssh /config 配置示例:
| 配置项 | 值 |
|---|
| Host | github.com |
| HostName | github.com |
| User | git |
| IdentityFile | ~/.ssh/id_ed25519 |
2.4 .gitignore
| 命令 | 说明 |
|---|
echo ".env" >> .gitignore | 忽略单个文件 |
echo "*.log" >> .gitignore | 忽略所有 .log 文件 |
echo "node_modules/" >> .gitignore | 忽略整个目录 |
git rm --cached <file> | 停止追踪(保留本地) |
git rm --cached -r <dir> | 停止追踪整个目录 |
常见问题:.gitignore 对已追踪的文件无效
| 步骤 | 命令 |
|---|
| 1 | git rm --cached <file> |
| 2 | git rm --cached -r <dir> |
| 3 | echo "<file>" >> .gitignore |
验证 .gitignore 是否生效:
| 命令 | 说明 |
|---|
git status | 被忽略的文件不会出现 |
git check-ignore -v <file> | 查看是哪个规则忽略了该文件 |
三、基础操作
3.1 仓库初始化与克隆
| 命令 | 说明 |
|---|
git init | 在当前目录创建 Git 仓库 |
git clone <url> | 克隆远程仓库到本地 |
git clone <url> <dir> | 克隆到指定目录 |
git clone 会自动设置 origin 远程地址,并切换到默认分支。
3.2 查看状态
| 命令 | 说明 |
|---|
git status | 查看文件状态(最常用) |
git log --oneline -5 | 查看最近5条提交 |
git log --oneline --graph --all | 图形化查看所有分支 |
git ls-files | 查看被追踪的文件列表 |
3.3 查看差异
| 命令 | 说明 |
|---|
git diff | 工作目录 vs 暂存区 |
git diff --staged | 暂存区 vs 上次提交 |
git diff HEAD | 工作目录 vs 上次提交 |
git diff --name-only | 只显示文件名 |
git diff --name-status | 显示文件名+状态(A/M/D) |
注意:git diff 只显示被 Git 追踪的文件的修改,新文件(Untracked)需要用 git status 或 cat 查看。
四、提交流程
4.1 添加与提交
| 命令 | 说明 |
|---|
git add <file> | 添加指定文件 |
git add . | 添加当前目录所有修改(最常用) |
git add -p | 交互式添加 |
git commit -m "message" | 提交 |
git commit -am "message" | 跳过 add,提交已追踪文件的修改 |
git commit --amend -m "new message" | 修改上一次提交信息 |
注意:-a 参数不会添加 Untracked 文件,新文件必须先 git add。
4.2 推送与拉取
| 命令 | 说明 |
|---|
git push | 推送到关联的远程分支 |
git push -u origin main | 第一次推送并建立关联 |
git pull | 拉取并合并(= fetch + merge) |
git fetch | 只拉取,不合并 |
-u 参数的作用:在 .git/config 中记录关联关系,之后可直接用 git push。
fetch vs pull:
| 命令 | 联网 | 修改工作目录 | 适用场景 |
|---|
git fetch | ✅ | ❌ | 先看看远程有什么更新 |
git pull | ✅ | ✅ | 直接同步最新代码 |
五、分支管理
5.1 分支操作
| 命令 | 说明 |
|---|
git branch | 查看本地分支 |
git branch -r | 查看远程分支 |
git branch -vv | 查看分支关联信息 |
git branch <name> | 创建分支 |
git switch <name> | 切换分支(推荐) |
git switch -c <name> | 创建并切换(推荐) |
git branch -d <name> | 删除分支 |
git branch -D <name> | 强制删除 |
switch vs checkout:
| 操作 | 旧命令 | 新命令(推荐) |
|---|
| 切换分支 | git checkout main | git switch main |
| 创建并切换 | git checkout -b new | git switch -c new |
| 恢复文件 | git checkout -- file | git restore file |
5.2 合并与变基
| 命令 | 说明 |
|---|
git merge <branch> | 合并分支 |
git merge --abort | 放弃合并 |
git rebase <branch> | 变基 |
git rebase -i HEAD~n | 交互式变基 |
git rebase --continue | 继续变基 |
git rebase --abort | 放弃变基 |
git cherry-pick <commit-id> | 挑选提交到当前分支 |
merge vs rebase:
| 场景 | 用 merge | 用 rebase |
|---|
| 公共分支(main) | ✅ 推荐 | ❌ 不要用 |
| 个人分支(feature) | 可以 | ✅ 推荐 |
| 已推送的分支 | ✅ 用 | ❌ 不要用 |
5.3 远程跟踪分支
| 概念 | 说明 |
|---|
origin/main | 本地存储的远程跟踪分支 |
git pull | git fetch + git merge origin/main |
origin/main 不联网也能操作,因为它是本地存储的。
六、撤销与恢复
6.1 工作目录与暂存区
| 状态 | 命令 | 效果 |
|---|
| 刚修改,没 add | git restore . | 恢复到上次 commit |
| 已 add,没 commit | git restore --staged . | 撤出暂存区,保留修改 |
| 已 add,没 commit | git reset --hard HEAD | 彻底放弃修改 |
注意:git restore 只恢复被追踪的文件,不影响 Untracked 文件。
6.2 提交撤销
| 命令 | 效果 | 适用场景 |
|---|
git reset --soft HEAD~1 | 撤销 commit,保留暂存区 | 提交信息写错了 |
git reset --mixed HEAD~1 | 撤销 commit+add,保留工作目录 | 想重新 add |
git reset --hard HEAD~1 | 全部撤销,丢弃修改 | 完全不想要了(危险) |
git revert HEAD | 用新提交撤销 | 已推送的提交 |
HEAD~1 的含义:
| 写法 | 含义 |
|---|
HEAD | 当前提交 |
HEAD~1 | 上一个提交 |
HEAD~2 | 上两个提交 |
6.3 临时保存(git stash)
| 命令 | 说明 |
|---|
git stash | 临时保存 |
git stash list | 查看保存列表 |
git stash pop | 恢复并删除记录 |
git stash apply | 恢复并保留记录 |
git stash drop | 删除记录 |
git stash -u | 包含 Untracked 文件 |
使用场景:正在改代码,突然要切分支修 bug,又不想提交。
6.4 找回丢失的提交(git reflog)
| 命令 | 说明 |
|---|
git reflog | 查看 HEAD 移动历史 |
git checkout <commit-id> | 恢复到那个提交 |
git branch <name> <commit-id> | 创建分支指向它 |
git reflog 是本地操作,不能推送到远程,但关键时刻能救命。
七、远程仓库
7.1 远程仓库管理
| 命令 | 说明 |
|---|
git remote -v | 查看远程仓库地址 |
git remote add origin <url> | 添加远程仓库 |
git remote set-url origin <new-url> | 修改远程地址 |
git remote show origin | 查看远程详细信息 |
git remote rm origin | 删除远程关联 |
7.2 提交范围
| 命令 | 说明 |
|---|
git fetch | 先更新远程分支信息 |
git log HEAD..origin/main --oneline | 远程有但本地没有(待 pull) |
git log origin/main..HEAD --oneline | 本地有但远程没有(待 push) |
git diff HEAD..origin/main | 查看远程比本地多了什么 |
八、标签
| 命令 | 说明 |
|---|
git tag | 查看所有标签 |
git tag v1.0.0 | 轻量标签 |
git tag -a v1.0.0 -m "message" | 附注标签(推荐) |
git tag -a v0.9.0 <commit-id> -m "b" | 给历史提交打标签 |
git push origin v1.0.0 | 推送单个标签 |
git push --tags | 推送所有标签 |
git tag -d v1.0.0 | 删除本地标签 |
git push origin --delete v1.0.0 | 删除远程标签 |
九、冲突解决
9.1 冲突标记示例
| 标记 | 内容 |
|---|
<<<<<<< HEAD | 你的修改开始 |
return price * 0.8 | 你的代码 |
======= | 分隔线 |
return price * 0.9 | 同事的代码 |
>>>>>>> origin/main | 同事的修改结束 |
9.2 解决流程
| 步骤 | 命令 |
|---|
| 1 | git pull |
| 2 | git status |
| 3 | 手动编辑文件,删除冲突标记 |
| 4 | git add <file> |
| 5 | git commit -m "merge: 解决冲突" |
| 6 | git push |
| 放弃合并 | git merge --abort |
9.3 减少冲突的最佳实践
| 实践 | 说明 |
|---|
| 频繁 pull | 每天开始工作先 git pull |
| 小步提交 | 每个提交改得少,冲突概率低 |
| 分工明确 | 不要多人同时改同一个文件 |
| 功能分支 | 每个功能独立分支 |
| 先 rebase 再 merge | git rebase main 提前解决冲突 |
十、调试命令
10.1 git blame
| 命令 | 说明 |
|---|
git blame <file> | 查看每行代码的作者 |
git blame -L 10,20 <file> | 只看第10-20行 |
git blame --author="张三" <file> | 只看某个作者 |
10.2 git bisect
| 命令 | 说明 |
|---|
git bisect start | 开始二分查找 |
git bisect bad | 标记当前为坏 |
git bisect good <commit-id> | 标记好版本 |
git bisect reset | 退出 |
十一、常用别名
| 命令 | 说明 |
|---|
git config --global alias.co checkout | 别名 co |
git config --global alias.br branch | 别名 br |
git config --global alias.st status | 别名 st |
git config --global alias.lg "log --oneline --graph --all" | 图形化日志 |
git config --global core.quotepath false | 显示中文文件名 |
十二、常见问题速查表
| 问题 | 解决方案 |
|---|
| 提交信息写错了 | git commit --amend -m "新信息" |
| add 多了文件 | git restore --staged <file> |
| 工作目录改乱了 | git restore .(未 add)或 git reset --hard HEAD(已 add) |
| commit 错了想重来 | git reset --soft HEAD~1 |
| 已经 push 错了 | git revert HEAD → git push |
| 切分支时不让切 | git stash |
| 合并时想放弃 | git merge --abort |
| 找回被 reset 的提交 | git reflog → git checkout <id> |
十三、核心流程图
日常开发流程
| 步骤 | 命令 |
|---|
| 1 | git pull |
| 2 | 修改代码 |
| 3 | git add . |
| 4 | git commit -m "..." |
| 5 | git push |
撤销流程
| 状态 | 命令 |
|---|
| 未 add | git restore . |
| 已 add | git restore --staged . → git restore . |
| 已 commit | git reset --soft/mixed/hard HEAD~1 |
| 已 push | git revert HEAD → git push |
分支流程
| 步骤 | 命令 |
|---|
| 1 | git switch -c feature |
| 2 | 开发 |
| 3 | git add . |
| 4 | git commit -m "..." |
| 5 | git switch main |
| 6 | git merge feature |
总结
| 场景 | 核心命令 |
|---|
| 配置 | git config |
| 提交 | git add + git commit + git push |
| 拉取 | git pull / git fetch + git merge |
| 分支 | git branch + git switch + git merge |
| 撤销 | git restore + git reset + git revert |
| 查看 | git status + git log + git diff |
| 调试 | git blame + git reflog |
| 临时保存 | git stash |
记住:Git 是工具,多练习才能真正掌握。建议在实际项目中反复使用这些命令。