讲解

学完所有核心命令,最后把散落的经验收拢成一份清单。提交层面:每次提交只做一件事,提交信息写清「做了什么、为什么」;提交前 git status + git diff --staged 自查;半成品用分支 + wip 提交存档,别依赖 stash 长存。协作层面:main 保持可发布,功能走短命分支 + PR;同步远程先 fetch 看清楚再 merge/rebase;永不改写已推送的历史(rebase、amend、reset 都只作用于本地未推送的提交);非强推不可时只用 --force-with-lease 且只对个人分支。

最容易被忽视的自救工具是 git reflog:它记录 HEAD 和分支的每一次移动——提交、切换、reset、rebase,全都留痕(默认保留 90 天)。这意味着只要你提交过,几乎任何「删错了」「reset 过头了」「分支误删了」都能找回:reflog 里找到目标提交的哈希,git switch -c 新分支 哈希 或 git reset --hard 哈希 即可复活。Git 里真正的不可逆只有两种:从未提交的工作区改动被覆盖,和 reflog 过期后的孤儿提交。

日常维护也别忘:.gitignore 在项目第一天写好;git gc(Git 多数情况下会自动运行)保持仓库健康;大文件别进仓库,需要版本化二进制资产时了解 Git LFS;最后,遇到任何陌生错误,先完整读一遍报错信息再动手——Git 的报错通常直接告诉你下一步该运行什么命令。

示例

完整演示一次「误删分支 → reflog 救回」:

git switch -c tmp-work
echo "重要工作成果" > important.txt
git add important.txt
git commit -qm "feat: 重要工作"
git switch main
git branch -D tmp-work
git branch
git reflog --format='%h %gs' -8
HASH=$(git reflog --format='%H %gs' | grep '重要工作' | head -1 | cut -d' ' -f1)
git switch -c rescued "$HASH"
ls
git switch main

分支 tmp-work 被 -D 强删后,git branch 里已经看不到它;但 reflog 里留着「commit: feat: 重要工作」这条记录,取出哈希建一个新分支 rescued,important.txt 就回来了。强推个人分支的安全姿势(示意):

# 仅示意:变基个人分支后需要强推时,用带检查的版本
git push --force-with-lease origin feature/search
# 如果远程在你拉取后又被别人更新过,这条命令会拒绝而不是覆盖

常见坑

  • panic 式操作:一出问题就乱按 reset --hard 和 force push,把小事故变成大事故。先 git status 和 git reflog 看清现状,再选最小的修复动作。
  • 迷信图形工具:GUI 能加速日常操作,但遇到分支纠缠时,懂命令行的人才能看懂发生了什么。先把命令行学扎实,GUI 再用作效率工具。
  • 忽视 .gitignore 与密钥卫生:密钥进过历史就要视为泄露——删除文件不够,历史里还能翻出来,正确做法是立即轮换密钥,再考虑清洗历史(git filter-repo / BFG)。
  • 长期不 push:本地一个月的提交没有备份,硬盘一坏全没。每天至少把进行中的分支推送到远程一次,哪怕是 wip 状态。

小结

小步提交、信息清晰、main 常绿、分支短命、不改写公共历史;reflog 是几乎所有事故的后悔药;密钥泄露按泄露处理而不是删除处理。Git 的核心命令你已经全部见过,剩下的就是在真实项目里反复使用它们——去建一个仓库,把这套流程走一遍吧。