一、前言
在企业项目里,会用 git add、git commit 和 git push,通常只能完成"把代码交上去"。真正影响开发效率的,是后面的事情:同事之间同时修改同一个文件导致代码冲突怎么办?需求做到一半,线上出了故障怎么办?有问题的代码已经合进主干,怎样撤回才不会连带影响别人的工作?
Git 能帮助团队隔离修改、审查差异、追踪问题,并在操作失误后找回部分工作。但这些能力需要配合明确的协作规则。分支随意创建、提交混在一起、发布版本没有记录,命令记得再熟也容易出错。本文以一个订单服务为例,给出一套可以在团队中执行的工作流程。
二、接手项目:确认身份、仓库和分支
1、先了解分支情况
| 分支或标签 | 示例 | 用途与约束 |
| 主干分支 | master | 保护分支,通过评审合入,发布时打标签 |
| 发布维护分支 | release/v1.0.0 | 停止增加新需求,只修本次发布的问题 |
| 开发分支 | dev_1.0.0 | 日常开发、测试中发现的问题 |
| 发布标签 | v1.0.0 |
标记确定的发布提交;发布后不随意移动 |
|---|
2、下载项目并配置提交身份
git clone git@git.example.com:backend/order-service.git
cd order-service
只配置当前仓库,避免公司项目和个人项目混用身份
git config user.name "张三"
git config user.email "zhangsan@example.com"
查看当前仓库生效的身份
git config user.name
git config user.email
如果所有仓库都使用同一个身份,可以在配置时加 --global。提交身份用于记录作者,不等于远端登录身份;SSH 密钥或访问令牌需要按公司要求单独配置。如果已有本地项目、尚未纳入 Git 时,才使用 git init。从远端 clone 下来的仓库已经初始化,不需要重复执行。
3、确认当前操作对象
git remote -v # 查看远端地址
git status # 查看分支、文件变化和进行中的操作
git branch --show-current
git branch -a # 查看本地分支和远端跟踪分支
git branch -vv # 查看本地分支的上游关系
如果公司迁移了仓库地址,可以修改远端配置:
git remote set-url origin git@git.example.com:new-team/order-service.git
git remote -v
三、Git提交过程
1、查看修改内容,文件变化情况
git status
2、获取远端变化(从远程仓库 origin 下载最新的提交、分支和标签信息到本地,但不会自动合并或修改你当前的工作区。可以理解为"看看远程有什么新东西")
git fetch origin
3、更新已有本地开发分支
git switch dev_1.0.0 #切换分支
git pull --ff-only origin dev_1.0.0 #从远端origin拉取代码
(1)以前一般是通过checkout切换分支,Git 2.23版本开始可以通过switch切换分支
(2)pull 会先获取远端变化,再按参数将指定分支整合到当前分支
(3)--ff-only 只允许快进更新。本地和远端各自新增提交、历史已经分叉时,它会停止,不会自动制造一次合并。此时先检查提交,再按团队规则选择 merge 或 rebase。
4、修改内容的前后对比
git diff
5、提交并推送(特别注意:push之前建议先pull,可以减少代码冲突)
git commit -m "feat(order): 增加订单导出日期范围校验"
git push -u origin dev_1.0.0
6、git提交历史
git log
git show
四、常见问题处理
1、 解决 merge 冲突?
git status
git diff --name-only --diff-filter=U
打开冲突文件,根据双方改动情况进行处理(一定要仔细检查,不要把其他同事提交的内容给覆盖了)。比如一方增加权限校验,另一方增加参数检查,最终通常要保留两种检查,并确定合理顺序。直接选择"全部接受当前"可能丢掉另一方的工作。修改后删除冲突标记,暂存文件并继续:
git add src/main/java/com/example/order/OrderExportService.java
git diff --cached --check
git merge --continue
操作前保持工作区干净,能减少中止合并时恢复现场的困难。合并完成后重新检查最终差异并运行相关测试; (当然我们日常一般可以借助TortoiseGit、IDEA、SourceTree等工具来更方便进行代码冲突检查处理**)**
2、选怎merge,还是rebase?
git merge |
git rebase |
|
|---|---|---|
| 历史形态 | 产生一个合并提交,有分叉 | 一条直线,干净 |
| 提交哈希 | 原提交不变 | 会生成新提交(哈希变了) |
| 是否保留真实时间线 | 保留 | 被改写 |
| 冲突处理 | 一次性解决 | 可能每个提交都要解一次 |
| 适用场景 | 公共分支、已推送的分支 | 本地私有分支,推送前整理 |
简而言之,merge 保留历史真相,rebase 追求历史整洁。
3、临时切换任务:用 stash 保存未完成修改
需求还没完成,突然要排查一个问题,不必为了切换分支就丢掉当前代码。
git stash push -u -m "订单导出开发中,临时保存"
git stash list
-u 会包含未跟踪文件,不包含 .gitignore 忽略的文件。完成其他任务、回到原分支后,确认要恢复哪一项:
git switch dev_1.0.0
git stash list
git stash show --stat 'stash@{0}'
git stash apply 'stash@{0}'
git status
-
-stat:只显示统计信息(文件名 + 增删行数),不显示逐行 diff
-
stash@{0}:最近一次 stash(最新)
确认内容完整、冲突已解决后,再单独删除对应记录:
git stash drop 'stash@{0}'
4、撤销和恢复:先判断修改到了哪一步
(1)已暂存(新增的文件或者做了修改的文件),但不想提交这个文件
git restore --staged src/main/java/com/example/order/OrderExportService.java
取消暂存(也就是不再commit了),工作区修改仍保留(改动的内容依然在)。特别注意:Git 2.23+ 引入, --staged:表示操作对象是暂存区。
(2)确定丢弃某个文件的未暂存修改(不增加staged选项)
git restore -- src/main/java/com/example/order/OrderExportService.java
(3)最近一次提交只在本地(已commit,未push),想要撤回
git reset --soft HEAD~1
它把分支回退一个提交,保留暂存区和工作区内容。常见 reset 模式的区别如下:
| 命令 | 提交位置 | 暂存区 | 工作区 |
|---|---|---|---|
git reset --soft HEAD~1 |
回退一个提交 | 保留 | 保留 |
git reset --mixed HEAD~1 |
回退一个提交 | 重置到目标提交 | 保留 |
git reset --hard HEAD~1 |
回退一个提交 | 重置到目标提交 | 覆盖受影响内容 |
(4)错误提交已经合入共享分支(已commit,已push):通过新分支创建反向提交,再评审合入
git fetch origin
git switch -c fix/revert-export --no-track origin/dev_1.0.0
git show <commit-id> # 核实是否为已提交的内容
git revert <commit-id> # 不改历史,生成反向提交
git push -u origin fix/revert-export
→ 提 PR,等 review 和 CI,再合并
五、常用命令速查
|---------------|-----------------------------|
| 看当前状态 | git status |
| 看未暂存差异 | git diff |
| 看准备提交的差异 | git diff --cached |
| 获取远端变化 | git fetch origin |
| 快进更新当前分支的上游内容 | git pull --ff-only |
| 创建并切换分支 | git switch -c feature/任务名 |
| 切换已有分支 | git switch 分支名 |
| 暂存指定文件 | git add 文件路径 |
| 按块选择修改 | git add -p |
| 提交修改 | git commit -m "说明" |
| 首次推送并设置上游 | git push -u origin 分支名 |
| 合并指定分支到当前分支 | git merge origin/目标分支 |
| 临时保存现场 | git stash push -u -m "说明" |
| 取消暂存,保留修改 | git restore --staged 文件路径 |
| 撤销已共享的普通提交 | git revert 提交SHA |
| 查看近期提交 | git log --oneline -10 |
| 查看某次提交 | git show 提交SHA |
六、小结
以上是Git日常开发常用命令详解,以及一些日常遇到情况的处理方式。欢迎各位同学交流学习!