FORMA

Git 基础工作流与协作场景

本文分为两部分:第一部分是日常使用中最常用的文件操作命令(状态查看、暂存、提交、撤销、删除、重命名);第二部分是团队协作中常见的场景化流程(个人提交、功能分支开发、同步主分支、误提交撤销等),帮助你把命令用在正确的场景里。

一、日常文件操作

1. 查看状态

bash
git status          # 完整状态(显示哪些文件被修改、新增、删除)
git status -s       # 简洁状态(?? 未跟踪,M 修改,A 新增,D 删除)

示例输出(简洁模式):

text
 M README.md        # 已修改但未暂存
A  new.txt          # 已新增并已暂存
?? unknown.txt      # 未跟踪文件

2. 添加文件到暂存区

bash
git add file.txt          # 添加单个文件
git add .                 # 添加当前目录下所有变化(包括新建、修改、删除)
git add --all             # 添加所有变化(等价于 git add -A)
  • 暂存区是下次 commit 的内容集合。
  • git add 后,文件状态变为 staged(已暂存)。

3. 提交到本地仓库

bash
git commit -m "提交说明"   # 提交暂存区内容
git commit -am "说明"      # 跳过暂存区,直接提交已跟踪文件的修改(不包含新添加的未跟踪文件)

示例

bash
git commit -m "fix: 修复登录页面的样式问题"
  • 提交后会生成一个唯一的 commit ID(如 a1b2c3d),记录版本快照和说明。

4. 撤销修改(未提交)

撤销工作区的修改(还原到最近一次 commitadd 的状态)

bash
git checkout -- file.txt       # 丢弃工作区中对该文件的修改

注意:此操作不可恢复,请谨慎使用。

将文件从暂存区撤回到工作区(保留修改内容)

bash
git reset HEAD file.txt        # 旧语法
git restore --staged file.txt  # Git 2.23+ 推荐

执行后,文件变为 modified(已修改但未暂存),你可以在工作区继续编辑。

更完整的提交回退(reset --soft/--mixed/--hard)与安全撤销(revert)说明,见 查看历史与撤销

5. 删除文件

bash
git rm file.txt           # 删除文件并自动暂存删除操作(git add 的等效)
git rm --cached file.txt  # 仅从 Git 中删除跟踪(不再管理),但保留工作区文件
  • git rm 后需要 git commit 才能最终从版本库中删除。

6. 重命名 / 移动文件

bash
git mv old_name new_name   # 重命名文件,自动暂存新旧路径

git mv 相当于:

bash
mv old_name new_name
git add new_name
git rm old_name

执行后使用 git status 会看到 renamed 状态,直接 commit 即可完成重命名。

7. 典型工作流示例

bash
# 1. 查看状态
git status

# 2. 修改文件并添加
echo "hello" >> README.md
git add README.md

# 3. 提交
git commit -m "update README"

# 4. 不小心修改了文件,想撤销
git checkout -- README.md

# 5. 删除不需要的文件
git rm old.txt
git commit -m "remove old.txt"

# 6. 重命名文件
git mv src/app.js src/main.js
git commit -m "rename app.js to main.js"

二、常见协作场景

场景 1:个人项目简单提交

适合单人开发的小项目,或对主分支有直接推送权限的场景。

bash
# 将所有修改添加到暂存区
git add .

# 提交到本地仓库(使用规范的提交信息)
git commit -m "feat: 添加用户登录功能"

# 推送到远程 main 分支
git push origin main

提示:提交信息建议遵循 Conventional Commits 规范,如 feat:fix:docs: 等。

场景 2:基于主分支开发新功能

团队协作的标准流程,使用功能分支(feature branch)隔离开发,然后通过 Pull Request (PR) / Merge Request (MR) 合并。

bash
# 1. 从主分支创建并切换到新功能分支
git checkout -b feature-login

# 2. 进行代码修改(编辑、添加文件等)

# 3. 将修改添加到暂存区并提交
git add .
git commit -m "feat: 实现登录页面"

# 4. 将新分支推送到远程仓库(并设置上游跟踪)
git push -u origin feature-login

# 5. 在 GitHub / GitLab 上发起 Pull Request (PR) 或 Merge Request (MR)
# 等待 Code Review 和 CI 检查通过后,由维护者合并到 main 分支

分支相关命令(创建、切换、删除、合并)详见 分支与标签管理

场景 3:同步远程 main 的最新代码到当前分支

当其他开发者已向 main 推送了新代码,你需要将这些更新合并到你正在工作的功能分支中。

方式一:使用 merge(产生一个合并提交)

bash
# 确保当前在功能分支
git checkout feature-login

# 获取远程最新提交(不自动合并)
git fetch origin

# 将远程 main 合并到当前分支
git merge origin/main
# 如有冲突,解决后 git add . && git commit

方式二:使用 rebase(保持线性历史,更干净)

bash
git checkout feature-login

# 拉取远程 main 并变基
git fetch origin
git rebase origin/main

# 如果出现冲突,解决后 git add . && git rebase --continue
# 变基完成后,由于历史改变,需要强制推送(若已推送过)
git push --force-with-lease origin feature-login

选择建议:个人或小团队可以使用 rebase 保持历史整洁;公共分支上已推送的提交尽量避免 rebase(除非团队约定)。若合并时出现冲突,解决步骤见 查看历史与撤销

场景 4:误提交到 main,需要撤销

情况一:尚未推送到远程

bash
# 1. 撤销最近一次提交(保留修改在暂存区)
git reset --soft HEAD~1

# 2. 暂存当前的修改(可选,为了切换到正确分支)
git stash

# 3. 创建正确的功能分支
git switch -c correct-branch

# 4. 恢复暂存的修改
git stash pop

# 5. 添加并提交到正确分支
git add .
git commit -m "feat: 正确的功能"

# 6. 后续推送新分支
git push -u origin correct-branch

情况二:已经推送到远程 main(公共分支)

务必不要使用 git reset 改写公共历史,应使用 git revert 反向撤销,安全且不影响协作者(原理见 查看历史与撤销)。

bash
# 1. 找到误提交的 commit hash(假设为 abc123)
git log --oneline

# 2. 创建一个抵消该提交的新提交
git revert abc123 --no-edit

# 3. 推送撤销后的结果
git push origin main

git revert 会生成一个新的提交,其内容正好是误提交的逆操作,其他开发者正常 git pull 即可同步。

三、场景与命令总结

场景核心命令注意事项
简单提交git add .git commit -m "..."git push确保当前分支正确
功能分支开发git checkout -bgit push -u origin → 创建 PR分支命名可包含 feature/fix/ 前缀
同步远程 maingit fetch origingit merge origin/maingit rebase origin/main公共分支上避免 rebase 已推送的提交
误提交到 main未推送:git reset --soft HEAD~1 + 重建分支;已推送:git revert <hash>已推送禁止用 reset,使用 revert 安全撤销

四、注意事项

  • git checkout -- <file>git reset --hard 等命令不可逆,操作前请确认改动已备份或确实不需要。
  • 已推送到公共分支(如 main)的提交,避免使用 rebaseresetamend 改写历史,优先用 revert
  • 团队协作中,提交信息建议统一规范(如 Conventional Commits),便于自动生成 changelog 与代码追溯。

掌握本文的日常操作与协作场景,即可高效地进行版本管理与团队协作。

参考文献

资料说明
Pro Git官方书
Git 文档命令
Conventional Commits提交信息规范
运维导读学习路径