一、配置与初始化
1.1 git config------配置 Git 环境
分为三个层级:--local(当前仓库)、--global(当前用户)、--system(全系统)。优先级:local > global > system。
常用配置示例:
bash
git config --global user.name "你的名字"
git config --global user.email "you@example.com"
git config --global core.editor "vim"
git config --global alias.st status # 设置别名,之后可用 git st
git config --list # 查看所有配置
git config --global --unset user.name # 删除某项配置
别名可以大幅减少重复输入,例如 alias.lg "log --oneline --graph --all" 可以简化为 git lg 查看图形化日志。
1.2 git init------初始化仓库
bash
git init # 在当前目录创建 .git
git init <目录名> # 在指定目录初始化
初始化后会生成隐藏的 .git 目录,所有版本信息都存储在这里。
二、仓库克隆与远程管理
2.1 git clone------克隆远程仓库
bash
git clone <url>
git clone <url> <本地目录名> # 指定本地目录名
git clone -b <分支名> <url> # 克隆指定分支
git clone --depth 1 <url> # 浅克隆,只取最近一次提交(节省时间与空间)
2.2 git remote------远程仓库管理
bash
git remote -v # 查看远程仓库地址
git remote add origin <url> # 添加远程仓库
git remote remove origin # 删除远程仓库
git remote set-url origin <新url> # 修改远程地址
git remote rename origin upstream # 重命名远程仓库
三、日常开发核心命令
3.1 git status------查看状态
bash
git status # 完整状态
git status -s # 简洁模式
简洁模式下:?? 表示未跟踪,A 表示已暂存的新文件,M 表示已修改,D 表示已删除。
3.2 git add------暂存更改
bash
git add <文件> # 暂存指定文件
git add . # 暂存当前目录所有更改(包括新文件、修改、删除)
git add -u # 只暂存已跟踪文件的修改和删除,不含新文件
git add -p # 交互式分块暂存,适合拆分提交
git add -p 是非常实用的命令,可以逐块选择要暂存的内容,把不相关的修改分开提交。
3.3 git commit------提交
bash
git commit -m "提交说明"
git commit -am "说明" # 自动暂存已跟踪文件的修改并提交(不包含新文件)
git commit --amend # 修改最近一次提交(提交信息或追加内容)
提交信息规范: 通常建议第一行不超过 50 个字符,空一行后写详细说明。常见格式如 feat: 添加登录功能、fix: 修复空指针异常。
3.4 git diff------查看差异
bash
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs 最新提交(即 git diff --cached)
git diff HEAD # 工作区 vs 最新提交
git diff <分支1> <分支2> # 两个分支之间的差异
git diff <commit1> <commit2> # 两个提交之间的差异
四、分支管理
4.1 git branch------分支操作
bash
git branch # 列出本地分支
git branch -a # 列出所有分支(含远程)
git branch <新分支名> # 创建分支(不切换)
git branch -d <分支名> # 删除已合并分支
git branch -D <分支名> # 强制删除未合并分支
git branch -m <旧名> <新名> # 重命名分支
git branch -vv # 查看本地分支与远程的跟踪关系
4.2 git checkout / git switch------切换分支
bash
git checkout <分支名> # 切换分支
git checkout -b <新分支名> # 创建并切换
git switch <分支名> # 新版推荐命令,语义更清晰
git switch -c <新分支名> # 创建并切换
Git 2.23 之后引入了 git switch 和 git restore,建议在新项目中使用这两个命令代替部分 checkout 的职责,语义更明确。
4.3 git merge------合并分支
bash
git merge <分支名> # 将指定分支合并到当前分支
git merge --no-ff <分支名> # 禁用快进合并,保留分支历史
git merge --abort # 合并冲突时放弃合并
--no-ff 会在合并时生成一个合并提交,保留被合并分支的完整历史轨迹,适合团队协作中的功能分支合并。
4.4 git rebase------变基
bash
git rebase <目标分支> # 将当前分支的提交"搬"到目标分支之上
git rebase -i HEAD~3 # 交互式变基,编辑最近 3 个提交
git rebase --abort # 放弃变基
git rebase --continue # 解决冲突后继续
重要原则: 不要对已经推送到共享远程仓库的提交执行 rebase,否则会给协作者带来麻烦。rebase 适合整理本地未推送的提交历史。
五、远程协作
5.1 git fetch------获取远程更新
bash
git fetch origin # 获取远程所有分支更新(不合并)
git fetch origin <分支名> # 只获取指定分支
git fetch --prune # 同时清理远程已删除的分支引用
fetch 是安全的,它只更新远程跟踪分支(如 origin/main),不会改动你的工作区。
5.2 git pull------拉取并合并
bash
git pull # fetch + merge
git pull --rebase # fetch + rebase(推荐,历史更线性)
git pull 本质上是 git fetch 加 git merge(或 git rebase)。如果不想产生额外的合并提交,可以使用 --rebase,或在配置中设置 git config --global pull.rebase true。
5.3 git push------推送
bash
git push origin <分支名>
git push -u origin <分支名> # 首次推送并建立跟踪关系
git push origin --delete <分支名> # 删除远程分支
git push --force-with-lease # 安全强制推送(比 --force 更安全)
git push --tags # 推送标签
关于强制推送: --force 会无条件覆盖远程分支,风险高。--force-with-lease 会在远程有其他人新提交时拒绝推送,是更安全的选择。仅在明确需要改写远程历史时使用。
六、撤销与回退
6.1 git restore------恢复工作区/暂存区
bash
git restore <文件> # 丢弃工作区修改(危险,不可恢复)
git restore --staged <文件> # 取消暂存(unstage),保留工作区修改
git restore --source=<commit> <文件> # 将文件恢复到指定提交的版本
6.2 git reset------重置提交
bash
git reset --soft HEAD~1 # 撤销最近一次提交,更改保留在暂存区
git reset --mixed HEAD~1 # 撤销提交和暂存,更改保留在工作区(默认)
git reset --hard HEAD~1 # 撤销提交并丢弃所有更改(危险)
git reset <commit> # 回退到指定提交
三种模式的区别:--soft 只移动 HEAD,不动暂存区和工作区;--mixed 移动 HEAD 并重置暂存区;--hard 三者全部重置,未提交的更改会丢失。
6.3 git revert------安全撤销
bash
git revert <commit> # 生成一个反向提交,抵消指定提交的更改
git revert <commit1>..<commit2> # 撤销一个范围的提交
revert 不会改写历史,适合撤销已经推送 的提交。reset 改写历史,只适合本地未推送的提交。
6.4 git stash------临时保存工作区
bash
git stash # 保存当前修改(不含未跟踪文件)
git stash -u # 包含未跟踪文件
git stash list # 查看 stash 列表
git stash pop # 恢复最近一次 stash 并删除记录
git stash apply # 恢复但不删除记录
git stash drop # 删除某条 stash
在需要临时切换分支处理紧急问题、但当前修改还不适合提交时非常有用。
七、查看历史与日志
7.1 git log------提交历史
bash
git log [<options>] [<revision-range>] [[--] <path>...]
git log
git log --oneline # 单行简洁显示
git log --oneline --graph --all # 图形化显示所有分支
git log -p <文件> # 查看某文件的修改历史及具体内容
git log --author="名字" # 按作者筛选
git log --since="2024-01-01" # 按时间筛选
git log -S "关键字" # 搜索代码内容变更(pickaxe)
git log --stat # 显示每次提交的文件变更统计
查看某文件的提交历史(含重命名跟踪)
bash
git log --follow -- $file_name
-follow 能跟踪文件被重命名前的提交记录,适合查询改名过的文件。
查看每次提交对该文件的具体改动
bash
git log -p -- $file_name
补充:按行查历史
如果想查某一行代码 是谁、哪次提交改的,用 git blame:
bash
git blame $file_name
git blame -L 10,20 $file_name # 只看第10-20行
八、标签管理
bash
git tag # 列出标签
git tag v1.0.0 # 创建轻量标签
git tag -a v1.0.0 -m "版本说明" # 创建附注标签(推荐)
git show v1.0.0 # 查看标签详情
git push origin v1.0.0 # 推送单个标签
git push --tags # 推送所有标签
git tag -d v1.0.0 # 删除本地标签
git push origin --delete v1.0.0 # 删除远程标签
附注标签包含标签创建者、日期和说明,是发布版本时的推荐做法;轻量标签只是一个提交的指针。
九、实用技巧与最佳实践
| 场景 | 推荐命令 |
|---|---|
| 快速查看简洁状态 | git status -s |
| 分块暂存 | git add -p |
| 图形化日志 | git log --oneline --graph --all |
| 安全撤销已推送提交 | git revert <commit> |
| 安全强制推送 | git push --force-with-lease |
| 找回"丢失"的提交 | git reflog + git reset --hard HEAD@{n} |
| 临时保存工作现场 | git stash -u / git stash pop |
| 拉取并保持线性历史 | git pull --rebase |
核心原则:
-
已推送的提交不要用
reset或rebase改写历史 ,用revert代替。 -
合并功能分支时用
--no-ff,保留分支历史。 -
强制推送前用
--force-with-lease,避免覆盖他人的工作。 -
提交前用
git diff --staged检查暂存内容,避免误提交。