Git 使用经验总结 — 从入门到高效协作
前言
Git 是程序员每天都要打交道的工具。回想起最初学 Git 的时候,add、commit、push 三连就敢说自己”会用 Git 了”。结果一遇上冲突、分支混乱、或者不小心 push -f 把同事代码搞没了,才开始真正意识到:会用 Git 和用好 Git,完全是两码事。
这篇文章记录我在实际项目中积累的 Git 经验,既是对自己的总结,也希望能帮到正在学习 Git 的朋友。
一、理解 Git 的核心模型
很多人学 Git 一开始就记命令,其实先理解它的数据模型,很多操作就自然懂了。
四个区域
1 | 工作区 (Working Directory) |
- 工作区:你正在编辑的文件,任何修改都在这里
- 暂存区:
git add后,改动被”标记”为准备提交 - 本地仓库:
git commit后,改动被永久记录到本地 .git 目录 - 远程仓库:
git push后,本地提交同步到 GitHub / GitLab 等远程服务器
关键认知:Git 是一个内容寻址的文件系统。每个文件、每个目录、每个 commit 都被计算出一个 SHA-1 哈希值作为”地址”。你看到的 commit 1a2b3c4 就是那个 commit 对象的内容哈希。
.git 目录里有什么
一个典型项目的 .git 目录结构:
1 | .git/ |
理解了这些,你就会知道 git checkout 本质上是移动 HEAD 指针,git reset 本质上是改变分支引用的指向。
二、日常高频命令(正确用法)
git add
1 | # 添加单个文件 |
经验:养成 git add -p 的习惯。它会逐个 hunk(代码块)让你确认,避免把调试代码、临时注释一起提交上去。
git commit
1 | # 基础提交 |
提交信息规范:强烈推荐 Conventional Commits 格式:
1 | <type>(<scope>): <subject> |
示例:
1 | feat(auth): 添加 JWT 登录认证 |
规范的提交信息让 git log 一目了然,也能配合工具自动生成 Changelog。
git pull 的正确姿势
1 | # 默认行为:fetch + merge(会产生额外的 merge commit) |
为什么推荐 rebase? merge 会产生一条 “Merge branch ‘main’ into feature” 的提交,让历史图像意大利面条。rebase 则把你的本地提交”接”在远程最新提交之后,历史保持一条直线。
可以在全局配置中设为默认:
1 | git config --global pull.rebase true |
git push
1 | # 推送到默认远程分支 |
**永远不要用 git push -f**。用 --force-with-lease 替代,它会在推送前检查远程分支是否被其他人更新过,避免覆盖他人代码。
git remote:管理远程仓库
当你 git clone 一个仓库时,Git 会自动把源地址保存为 origin。但很多时候你需要自己建立远程链接——比如本地已有项目、需要推到不同平台、或者想同时备份到多个仓库。
给本地仓库建立远程链接
如果你在本地用 git init 创建了一个新项目,它还没有远程地址:
1 | # 查看当前配置的远程仓库 |
经验:-u 参数会把本地分支和远程分支关联起来,之后就可以直接用 git push / git pull 而不需要每次指定远程和分支名。
多远程仓库:同时推送多个平台
有时候你想把代码同时推送到 GitHub 和 Gitee(或者公司的内部 GitLab),有两种方式:
方案一:添加多个 remote 名称
1 | # 默认的 GitHub |
优点:灵活控制推到哪个平台。缺点:需要执行两次 push。
方案二:同一个 remote 配置多个 push URL
这是更优雅的方案——push 一次,自动同步到所有远程:
1 | # 设置 origin 默认 URL |
注意有两个 push URL 但只有一个 fetch URL——push 会同时推送到两个地址,pull 只从第一个地址拉取。
1 | # 一次 push,同时推送到 GitHub 和 Gitee |
常用 remote 操作汇总:
1 | # 查看远程仓库信息(包含 fetch 和 push URL) |
典型场景:
从 HTTPS 切换到 SSH:
1
git remote set-url origin git@github.com:username/repo.git
GitHub + Gitee 双备份:用方案二,一次 push 双平台同步。
公司项目迁移 GitLab 地址:
1
git remote set-url origin git@gitlab-new.company.com:team/project.git
为开源项目添加上游仓库:
1
2
3
4
5# clone 的是你自己的 fork
git remote add upstream git@github.com:original-author/repo.git
# 同步上游的更新
git fetch upstream
git merge upstream/main
经验:多 remote 推送时,各平台的提交历史必须兼容(通常是同一套 commit)。如果某个平台的历史不一样(比如用 git push -f 搞乱了),会导致另一个平台推送失败。
三、分支策略
GitHub Flow(推荐个人和小团队)
这是最简单实用的策略:
1 | main ← feature-branch |
main分支始终可部署- 做任何改动都从
main拉一个新分支 - 分支名用描述性的:
feature/user-auth、fix/navbar-overflow、docs/api-guide - 完成后提 PR,review 后合并回
main
Git Flow(适合有固定发布周期的大项目)
1 | main ← develop ← feature-branch |
分支类型:
main:生产环境代码develop:开发主线feature/*:功能开发release/*:发布准备hotfix/*:紧急修复
我的建议:大多数项目用 GitHub Flow 就够了,Git Flow 分支太多,维护成本高。
分支操作实战
1 | # 创建并切换到新分支 |
四、合并与变基
merge vs rebase:什么时候用什么
1 | 场景:你在 feature 分支上开发,同事合并了新代码到 main |
选择原则:
- rebase:个人分支整理提交历史用。比如
git pull --rebase、git rebase main - merge:合并功能分支到主分支用。比如 PR 合并到 main
- 黄金法则:永远不要 rebase 已经推送到远程的公共分支
冲突解决
1 | # rebase 过程中遇到冲突 |
经验:冲突不可怕,可怕的是不知道怎么处理就乱操作。记住:git status 永远是你的朋友,它会告诉你当前状态和下一步该做什么。
五、踩坑记录与补救措施
1. 提交到了错误的分支
1 | # 场景:在 main 分支上做了几个提交,应该在新分支上 |
2. commit message 写错了
1 | # 修改最近一次提交的信息 |
3. 不小心 git add 了不该提交的文件
1 | # 从暂存区移除,保留工作区改动 |
4. 想回到之前的某个版本看看
1 | # 查看提交历史 |
5. “救命!我搞砸了” — git reflog
git reflog 记录了 HEAD 的所有移动历史,是 Git 的”后悔药”:
1 | git reflog |
经验:只要你的改动曾经被 commit 过(哪怕后来被 reset 了),reflog 都能找回来。默认保留 90 天。
6. .gitignore 不生效
1 | # 文件已经被 Git 跟踪了,.gitignore 对它无效 |
六、实用技巧
git stash:临时保存工作现场
1 | # 保存当前改动 |
git cherry-pick:摘取特定提交
1 | # 把其他分支的某个提交"复制"到当前分支 |
git bisect:二分法定位 bug
1 | # 开始二分查找 |
git alias:偷懒神器
在 ~/.gitconfig 中配置:
1 | [alias] |
常用 alias 推荐:
1 | git config --global alias.st status |
七、好习惯清单
- 提交前先
git diff— 确认自己的改动 - 用
git add -p— 选择性暂存,避免垃圾提交 - 写规范的 commit message — 6 个月后的你会感谢现在的你
pull --rebase而不是pull— 保持历史整洁- 用
--force-with-lease而不是-f— 保护同事的心血 - 小步提交 — 每个 commit 只做一件事,方便 code review 和回滚
- 分支命名规范 —
feature/xxx、fix/xxx、docs/xxx - 学会看
git status— 它是你最常用的命令 - 定期清理 —
git remote prune origin清理已删除的远程分支引用 - 备份就是 reflog — 只要 commit 过,几乎没有找不回来的代码
总结
Git 的学习曲线确实陡峭,但一旦你理解了它的数据模型(commit → tree → blob),那些”魔法命令”背后的原理就清晰了。
最重要的不是记住多少命令,而是养成好的版本管理习惯。当你把 Git 当作合作伙伴而不是负担时,它会让你的开发流程更加从容。
记住:Git 不会丢你的代码,但你自己可能会。所以,commit early, commit often。
祝编码愉快!🚀