实习之前,我对 Git 的理解只有三句话:
git add git commit -m "fix" git push项目能跑就行,代码能提交就行。
直到真正参与多人协作开发后,我才发现:
Git 最难的从来不是命令,而是理解它的工作流程。
这篇文章分享一下我在实习期间学到的 Git 知识,希望能帮助和曾经的我一样的同学。
Git 到底在管理什么?
刚开始学 Git 的时候,我最困惑的是:
为什么会有 add?
为什么不能直接 commit?
为什么还会有 reset?
后来理解了 Git 的四个区域后,一切都通了。
工作区(Workspace)
平时写代码的地方。
const name = "Tom";
改成:
const name = "Jerry";
此时修改只存在于工作区。
Git 还没有记录。
暂存区(Stage)
执行:
git add .
并不是提交。
而是把改动放进暂存区。
可以理解成:
我要提交这些内容。
但还没真正提交。
本地仓库(Repository)
执行:
git commit -m "feat: 登录功能"
Git 会生成一次提交记录。
A → B → C
每个 Commit 都是一份代码快照。
远程仓库(Remote)
执行:
git push
才会同步到 GitLab 或 GitHub。
这时候同事才能看到你的代码。
实习后我第一次接触的开发流程
刚进项目时,Leader 给我分配了一个需求。
我以为直接在 develop 上改就行。
结果被制止了。
企业开发一般不会直接在主开发分支写代码。
而是:
develop
│
├── feature/login
├── feature/order
└── feature/user
每个人都有自己的开发分支。
例如:
git checkout develop
git pull
git checkout -b feature/login
然后开始开发。
场景一:开发到一半,develop 更新了怎么办?
这是我实习时遇到最多的问题。
假设:
当前情况:
develop
A → B → C
feature/login
A → B → D
你正在开发登录功能。
结果同事提交了代码。
develop 变成:
develop
A → B → C → E → F
此时你的分支落后了。
很多新人会直接继续开发。
然后最后提 MR。
结果冲突一堆。
正确做法是定期同步 develop。
方法一:merge(企业最常见)
切回 develop:
git checkout develop
git pull origin develop
回到自己的分支:
git checkout feature/login
合并:
git merge develop
结果:
E → F
/
A → B → C
\
D
\
M
生成一个 Merge Commit。
优点:
- 安全
- 不改历史
- 企业最常用
方法二:rebase(历史更干净)
git checkout feature/login
git rebase develop
结果:
A → B → C → E → F → D'
看起来像:
D
是在最新代码上开发出来的。
优点:
提交记录更整洁
缺点:
会改写提交历史
很多公司要求:
开发过程允许 rebase
公共分支禁止 rebase
场景二:代码冲突怎么办?
这是每个实习生都会经历的时刻。
假设:
你写:
const name = "Tom";
同事写:
const name = "Jerry";
同步代码时:
git merge develop
出现:
<<<<<<< HEAD
const name = "Tom";
=======
const name = "Jerry";
>>>>>>> develop
第一次看到真的会懵。
实际上意思是:
Git 不知道该保留谁
你自己决定
比如:
const name = "Jerry";
保存后:
git add .
git commit
冲突解决完成。
场景三:开发完成后如何合并到 develop?
很多同学以为:
git checkout develop
git merge feature/login
就结束了。
实际上企业里通常不会直接合并。
而是:
提交 MR(Merge Request)
或者:
PR(Pull Request)
流程一般是:
开发完成
↓
push 到远程
↓
创建 MR
↓
Code Review
↓
测试验证
↓
合并 develop
例如:
git push origin feature/login
然后到 GitLab 创建 MR。
场景四:代码提交错了怎么办?
这是我最常用的救命命令。
提交信息写错
修改最近一次提交:
git commit --amend
add 多了
取消暂存:
git restore --staged .
或者:
git reset HEAD .
本地代码想回退
查看记录:
git log --oneline
回退:
git reset --hard commitId
场景五:线上代码出问题怎么办?
很多同学第一反应:
git reset
实际上线上已经发布的代码。
一般不会 reset。
而是:
git revert
例如:
git revert abc123
Git 会生成一个新的 Commit。
专门抵消之前的提交。
这样历史记录完整。
也是企业开发标准做法。
结尾
实习前,我觉得 Git 就是:
git add
git commit
git push
实习后才发现:
真正重要的不是会多少命令。
而是能否在下面这些场景里从容解决问题:
- 开发过程中如何同步主分支
- 如何解决代码冲突
- 如何参与 Code Review
- 如何安全回滚代码
- 如何管理多人协作开发
当你能处理这些问题的时候,Git 才真正从「工具」变成了你的「生产力」。