从只会 git add、git commit、git push,到真正参与团队开发

32 阅读4分钟

实习之前,我对 Git 的理解只有三句话:

git add 
git commit -m "fix"
git push

项目能跑就行,代码能提交就行。

直到真正参与多人协作开发后,我才发现:

Git 最难的从来不是命令,而是理解它的工作流程。

这篇文章分享一下我在实习期间学到的 Git 知识,希望能帮助和曾经的我一样的同学。


Git 到底在管理什么?

刚开始学 Git 的时候,我最困惑的是:

为什么会有 add?

为什么不能直接 commit?

为什么还会有 reset?

后来理解了 Git 的四个区域后,一切都通了。

image.png


工作区(Workspace)

平时写代码的地方。

const name = "Tom";

改成:

const name = "Jerry";

此时修改只存在于工作区。

Git 还没有记录。


暂存区(Stage)

执行:

git add .

并不是提交。

而是把改动放进暂存区。

可以理解成:

我要提交这些内容。

但还没真正提交。


本地仓库(Repository)

执行:

git commit -m "feat: 登录功能"

Git 会生成一次提交记录。

AB → 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
   AB → C

feature/login
   AB → D

你正在开发登录功能。

结果同事提交了代码。

develop 变成:

develop
   AB → C → E → F

此时你的分支落后了。

很多新人会直接继续开发。

然后最后提 MR。

结果冲突一堆。

正确做法是定期同步 develop。


方法一:merge(企业最常见)

切回 develop:

git checkout develop

git pull origin develop

回到自己的分支:

git checkout feature/login

合并:

git merge develop

结果:

       E → F
      /
AB → C
      \
       D
        \
         M

生成一个 Merge Commit。

优点:

  • 安全
  • 不改历史
  • 企业最常用

方法二:rebase(历史更干净)

git checkout feature/login

git rebase develop

结果:

AB → 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 才真正从「工具」变成了你的「生产力」。