Git实用指南

Git 实用指南

Git 的核心不是“上传文件”,而是记录可追踪、可比较、可协作的提交快照。先理解区域和提交对象,再记命令。

Git 的基本模型

git-four-areas

Git 同时维护四个区域:

区域含义典型命令
工作区当前磁盘上的文件git diff
暂存区下一次提交准备包含的快照git add
本地仓库本机提交历史和对象git commit
远端仓库服务器上的共享副本git fetchgit push

HEAD 表示当前检出的提交;分支只是指向提交的可移动指针。提交保存的是某一时刻的项目快照。

初始化与身份

代码块BASH · 7 行收起展开
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、密码或私钥写进配置和仓库。

日常最小循环

代码块BASH · 7 行收起展开
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 . 容易把调试文件、密钥和无关修改一起带入提交。

查看与审阅历史

代码块BASH · 7 行收起展开
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/file

git diff --staged 是提交前的最后一道检查。git log --all --graph 能同时查看本地和远端跟踪分支。

提交应该表达什么

一个提交应表达一个可理解、可回滚的逻辑变化:

  • feat::新增能力。
  • fix::修复问题。
  • refactor::不改变行为的重构。
  • docs::文档变化。
  • test::测试变化。
  • chore::工具维护。
代码块BASH · 2 行收起展开
git add -p
git commit -m "fix: handle empty repository response"

提交信息写“解决什么”,不要只写“update”。格式化、重命名和功能修改最好拆成可审阅的提交。

分支与合并

git-branch-graph
代码块BASH · 6 行收起展开
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/loginfix/cache-keydocs/maven。不要直接在共享 main 上堆叠未经验证的半成品。

merge 与 rebase

  • merge 保留真实分叉,通常产生合并提交,共享分支更安全。
  • rebase 把当前提交重新放到新基线之后,会重写提交 SHA。
代码块BASH · 6 行收起展开
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-collaboration
代码块BASH · 7 行收起展开
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 origin

fetch 只更新远端跟踪引用;pull 还会 merge 或 rebase。开始工作前先 fetch,再决定如何整合远端变化。

撤销与恢复

git-undo-guide
情况命令说明
丢弃工作区未暂存修改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 后先用:

代码块BASH · 3 行收起展开
git reflog
git show <reflog-sha>
git branch rescue/<name> <reflog-sha>

暂存临时工作

代码块BASH · 6 行收起展开
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;长期工作尽量创建临时分支提交。

冲突处理

代码块BASH · 5 行收起展开
git status
# 处理 <<<<<<< / ======= / >>>>>>> 标记
git add <resolved-file>
git merge --continue
git rebase --continue

先理解双方修改意图,再运行测试和格式检查。ours / theirs 整块覆盖前必须确认不会丢掉另一方有效修改。

标签与发布

代码块BASH · 4 行收起展开
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 只影响尚未被跟踪的文件;已经提交的文件需要:

代码块BASH · 1 行收起展开
git rm --cached path/to/generated-file

Windows 项目应通过 .gitattributes 统一换行:

代码块PLAINTEXT · 3 行收起展开
* 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、私钥和生成物。
  • 提交信息说明了行为变化。
  • 推送前确认目标分支和远端领先/落后关系。

延伸阅读