Git是目前世界上最先进的分布式版本控制系统。

操作流程


🧱 一、基本命令

1
2
3
4
5
6
git init                     # 初始化仓库,生成 .git 目录
git status # 查看当前工作区状态(哪些文件被修改/未跟踪)
git diff [file] # 查看文件具体修改内容(不加文件名则查看所有)
git log # 查看提交历史(含 commit id、作者、时间、注释)
git log --oneline # 简洁单行显示
git log --graph --all # 图形化显示所有分支历史

💡 git diff 默认对比工作区与暂存区;若想对比暂存区与最新提交:git diff --cached


📤 二、提交操作

1
2
3
4
5
git add <file>               # 添加指定文件到暂存区
git add . # 添加当前目录所有改动(不包括删除)
git add -A # 添加所有改动(包括新增、修改、删除)→ 推荐替代 `--all`
git commit -m "描述信息" # 提交到本地仓库
git commit -am "描述" # 直接提交已跟踪文件的修改(跳过 add,⚠️不适用新文件)

🚫 注意:git commit -a 仅适用于已跟踪文件,新增文件仍需 git add


🔙 三、版本回退与撤销

回退版本

1
2
3
4
5
6
7
8
git reset --hard HEAD^       # 回退到上一版本(丢弃所有未提交修改)
git reset --hard HEAD~3 # 回退3个版本
git reset --soft HEAD^ # 回退版本,但保留修改在暂存区
git reset --mixed HEAD^ # 回退版本,修改保留在工作区(默认行为)

# 查看操作历史(找回误删 commit)
git reflog # 显示所有 HEAD 变更记录,含被 reset 掉的 commit
git reset --hard <commit_id> # 通过 reflog 找回指定版本

撤销修改

1
2
3
4
5
git checkout -- <file>       # 撤销工作区修改(回到最近一次 add/commit 状态)
git restore <file> # Git 2.23+ 推荐替代 checkout(语义更清晰)

git reset HEAD <file> # 从暂存区撤回文件,回到工作区(不丢弃修改)
git restore --staged <file> # 同上,新语法

⚠️ git checkout -- <file>危险操作,会永久丢弃未提交的修改!


🗑️ 四、删除与恢复

1
2
3
4
5
6
7
rm <file>                    # 手动删除文件(工作区)
git rm <file> # 从版本库中删除文件(需 commit)
git rm --cached <file> # 仅从版本库移除,保留本地文件(常用于 .gitignore 补救)

# 误删恢复
git checkout HEAD -- <file> # 从最新提交中恢复文件
git restore <file> # 同上(推荐新语法)

🌐 五、远程仓库管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git remote add origin <url>           # 关联远程仓库
git remote set-url origin <new-url> # 修改远程地址
git remote -v # 查看远程仓库地址
git remote rm origin # 删除远程关联

git clone <url> # 克隆远程仓库
git clone <url> -b <branch> # 克隆指定分支

git push -u origin main # 推送并关联本地与远程分支(首次推送用 -u)
git push origin main # 后续推送可省略 -u
git push origin --tags # 推送所有标签
git push origin :<tagname> # 删除远程标签

git pull origin main # 拉取远程更新并合并(= fetch + merge)
git pull --rebase origin main # 拉取并变基(保持线性历史)

🔄 git pull = git fetch + git merge
🎯 团队协作推荐 git pull --rebase 避免多余合并提交


🌿 六、分支管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git branch                   # 查看本地分支(* 表示当前分支)
git branch -a # 查看所有分支(含远程)
git branch <name> # 创建分支
git switch <name> # 切换分支(Git 2.23+)
git switch -c <name> # 创建并切换分支
git checkout <name> # 旧版切换分支(仍广泛使用)
git checkout -b <name> # 旧版创建并切换

git merge <branch> # 合并分支到当前分支
git merge --no-ff <branch> # 禁用快进合并,保留合并节点(推荐用于发布分支)

git branch -d <name> # 删除分支(安全删除,未合并会报错)
git branch -D <name> # 强制删除分支

git rebase <branch> # 变基:将当前分支的提交“挪”到目标分支之后

💡 --no-ff 合并会生成一个“合并提交”,便于追踪功能分支的生命周期。


🏷️ 七、标签管理(用于版本发布)

1
2
3
4
5
6
7
8
9
10
git tag                          # 查看所有标签
git tag v1.0 # 打轻量标签
git tag -a v1.0 -m "说明" # 打附注标签(推荐)
git tag -a v1.0 <commit_id> # 为历史提交打标签

git show <tagname> # 查看标签详情
git tag -d <tagname> # 删除本地标签
git push origin :refs/tags/v1.0 # 删除远程标签
git push origin <tagname> # 推送单个标签
git push origin --tags # 推送所有标签

✅ 发布版本时建议使用 git tag -a,便于写入发布说明和签名。


🚫 八、忽略文件(.gitignore)

在项目根目录创建 .gitignore 文件,语法示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 忽略文件
Thumbs.db
.DS_Store

# 忽略目录
node_modules/
dist/
logs/

# 忽略特定类型文件
*.log
*.tmp
*.class
*.exe

# 不忽略例外(! 开头)
!important.log

# 注释行以 # 开头

强制操作

1
2
git add -f <file>                # 强制添加被忽略的文件
git check-ignore -v <file> # 查看文件被哪条规则忽略

📌 .gitignore 只对未跟踪文件生效。若文件已被跟踪,需先 git rm --cached <file>


🧰 九、进阶技巧

1. 储藏(Stash)——临时保存工作现场

1
2
3
4
5
6
git stash                # 保存当前修改(回到干净工作区)
git stash list # 查看储藏列表
git stash apply # 恢复最近一次储藏(不删除)
git stash pop # 恢复并删除储藏
git stash drop # 删除最近储藏
git stash apply stash@{1} # 恢复指定储藏

🎒 适合临时切换分支、紧急修复 bug 时使用。

2. 交互式添加(Interactive Add)

1
git add -p               # 逐块(hunk)选择添加哪些修改

✍️ 适合一次修改多个功能,想分开提交时使用。

3. 查看某行代码是谁改的

1
git blame <file>         # 显示文件每行最后修改者和 commit

⚠️ 十、常见问题 & 避坑指南

问题 解决方案
fatal: refusing to merge unrelated histories git pull origin main --allow-unrelated-histories
推送被拒绝(non-fast-forward) git pullgit pull --rebase
误操作 git reset --hard 丢了代码 git reflog 找回 commit id 再 reset
想撤销 git commit 但未推送 git reset --soft HEAD~1
想撤销已推送的 commit git revert <commit_id>(生成反向提交,安全)
中文文件名乱码 git config --global core.quotepath false

🛡️ 团队协作黄金法则:

  • 不要强制推送共享分支(如 maindev
  • 提交前先 pull
  • 多用 --dry-run 测试命令效果
  • 重要操作前 git status + git log 确认状态

📋 十一、命令速查表(Cheat Sheet)

场景 命令
初始化仓库 git init
查看状态 git status
查看差异 git diff / git diff --cached
添加文件 git add . / git add -A
提交 git commit -m "msg"
查看日志 git log --oneline --graph --all
回退版本 git reset --hard HEAD~1 + git reflog
撤销修改 git restore <file>
删除文件 git rm <file>
克隆仓库 git clone <url>
推送 git push -u origin main
拉取 git pull --rebase origin main
创建分支 git switch -c feature/login
合并分支 git merge --no-ff feature/login
打标签 git tag -a v1.0 -m "release"
忽略文件 编辑 .gitignore
临时保存 git stash / git stash pop

✍️ 示例:初始化并推送新项目

1
2
3
4
5
6
7
echo "# MyProject" >> README.md
git init
git add README.md
git commit -m "🎉 初始化项目"
git branch -M main # 重命名主分支为 main(兼容 GitHub)
git remote add origin git@github.com:username/MyProject.git
git push -u origin main # 首次推送

🎁 最后

  • 使用 git config --global alias.st status 等设置别名提升效率。
  • 图形化工具推荐:VS Code Git 面板SourcetreeGitKraken
  • 学习资源推荐:Pro Git 中文版