Git实用指南
Git 实用指南
Git 的核心不是“上传文件”,而是记录可追踪、可比较、可协作的提交快照。先理解区域和提交对象,再记命令。
Git 的基本模型
Git 同时维护四个区域:
| 区域 | 含义 | 典型命令 |
|---|---|---|
| 工作区 | 当前磁盘上的文件 | git diff |
| 暂存区 | 下一次提交准备包含的快照 | git add |
| 本地仓库 | 本机提交历史和对象 | git commit |
| 远端仓库 | 服务器上的共享副本 | git fetch、git push |
HEAD 表示当前检出的提交;分支只是指向提交的可移动指针。提交保存的是某一时刻的项目快照。
初始化与身份
代码块收起展开
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
git init
git clone https://github.com/example/project.git
git remote -v个人身份写入用户级配置,项目特殊规则写入仓库级 .git/config。不要把 token、密码或私钥写进配置和仓库。
日常最小循环
代码块收起展开
git status -sb
git diff
git add -p
git diff --staged
git commit -m "feat: add order validation"
git log --oneline --decorate --graph -n 12
git push -u origin feature/order-validation—s / —short: 用简短格式输出状态
—b / —branch: 同时显示分支信息
推荐先 status,再看 diff,按逻辑块暂存,确认 staged diff 后再提交。git add . 容易把调试文件、密钥和无关修改一起带入提交。
查看与审阅历史
代码块收起展开
git status --short --branch
git diff
git diff --staged
git diff HEAD
git log --oneline --decorate --graph --all
git show <commit>
git blame -L 20,40 path/to/filegit diff --staged 是提交前的最后一道检查。git log --all --graph 能同时查看本地和远端跟踪分支。
提交应该表达什么
一个提交应表达一个可理解、可回滚的逻辑变化:
feat::新增能力。fix::修复问题。refactor::不改变行为的重构。docs::文档变化。test::测试变化。chore::工具维护。
代码块收起展开
git add -p
git commit -m "fix: handle empty repository response"提交信息写“解决什么”,不要只写“update”。格式化、重命名和功能修改最好拆成可审阅的提交。
分支与合并
代码块收起展开
git branch
git branch -a
git switch -c feature/login
git switch main
git merge --no-ff feature/login
git branch -d feature/login分支名描述意图,如 feature/login、fix/cache-key、docs/maven。不要直接在共享 main 上堆叠未经验证的半成品。
merge 与 rebase
merge保留真实分叉,通常产生合并提交,共享分支更安全。rebase把当前提交重新放到新基线之后,会重写提交 SHA。
代码块收起展开
git fetch origin
git rebase origin/main
# 解决冲突后
git add <file>
git rebase --continue
git rebase --abort已经推送、别人可能基于它继续工作的分支,不要随意 rebase 后强推。确实需要更新个人远端分支时,优先 git push --force-with-lease,不要无条件 --force。
远端协作
代码块收起展开
git remote -v
git fetch origin
git pull --rebase origin main
git push
git push -u origin feature/login
git branch -vv
git remote show originfetch 只更新远端跟踪引用;pull 还会 merge 或 rebase。开始工作前先 fetch,再决定如何整合远端变化。
撤销与恢复
| 情况 | 命令 | 说明 |
|---|---|---|
| 丢弃工作区未暂存修改 | git restore -- path | 不影响提交历史 |
| 从暂存区撤回 | git restore --staged -- path | 保留工作区修改 |
| 修改未推送的最近提交 | git commit --amend | 只适合个人提交 |
| 撤销本地提交但保留改动 | git reset --soft HEAD~1 | 回到暂存区 |
| 撤销本地提交并取消暂存 | git reset HEAD~1 | 默认 mixed |
| 撤销已公开提交 | git revert <commit> | 新增反向提交 |
git reset --hard 会同时改变指针、暂存区和工作区,可能直接丢失未保存内容。公开历史优先 revert。
误删或误 reset 后先用:
代码块收起展开
git reflog
git show <reflog-sha>
git branch rescue/<name> <reflog-sha>暂存临时工作
代码块收起展开
git stash push -u -m "wip: before updating main"
git stash list
git stash show --stat stash@{0}
git stash apply stash@{0}
git stash pop
git stash drop stash@{0}apply 保留 stash,确认恢复成功后再 drop;长期工作尽量创建临时分支提交。
冲突处理
代码块收起展开
git status
# 处理 <<<<<<< / ======= / >>>>>>> 标记
git add <resolved-file>
git merge --continue
git rebase --continue先理解双方修改意图,再运行测试和格式检查。ours / theirs 整块覆盖前必须确认不会丢掉另一方有效修改。
标签与发布
代码块收起展开
git tag -a v1.0.0 -m "release v1.0.0"
git push origin v1.0.0
git tag -l
git show v1.0.0发布标签应指向已通过 CI 的提交。删除远端标签是破坏性操作,必须明确确认。
.gitignore 与换行
.gitignore 只影响尚未被跟踪的文件;已经提交的文件需要:
代码块收起展开
git rm --cached path/to/generated-fileWindows 项目应通过 .gitattributes 统一换行:
代码块收起展开
* text=auto
*.sh text eol=lf
*.bat text eol=crlf不要把 .m2/、target/、IDE 私有目录、密钥和大体积生成物提交进去。
常见误区
| 误区 | 正确理解 |
|---|---|
pull 只是下载 | 它还会 merge 或 rebase,先 fetch 更可控 |
| 分支等于复制目录 | 分支只是提交指针,切换成本很低 |
| reset 能安全撤销任何提交 | 公开历史优先 revert |
git add . 等于完成提交 | 还需审阅 staged diff |
--force 只是重试 push | 它可能覆盖别人提交 |
| detached HEAD 可以直接开发 | 应先创建分支保存提交 |
提交前检查清单
-
git status -sb只包含本次任务文件。 -
git diff --check无空白错误。 - staged diff 已审阅。
- 测试、构建和必要 lint 已运行。
- 没有密码、token、私钥和生成物。
- 提交信息说明了行为变化。
- 推送前确认目标分支和远端领先/落后关系。