Git 入门教程:工作区、暂存区、仓库、常用命令与一个完整工作流
Git 是程序员必备的版本控制工具,但很多人卡在"为什么要有暂存区""commit 和 push 有什么区别"这些概念上。本文从三个区域讲起,给出一份常用命令清单和一个完整工作流,跟着敲一遍就会了。文中的命令在 macOS、Linux 终端和 Windows 的 Git Bash 中均可直接使用。更多开发工具内容,可关注开发工具分类。
一、三个区域:工作区、暂存区、仓库
- 工作区(Working Directory):你正在编辑的文件夹,改动先发生在这里;
- 暂存区(Staging Area / Index):提交前的"待办区",用
git add把想提交的改动放进来,相当于"先挑好要打包的东西"; - 仓库(Repository / .git):Git 真正保存历史的地方,
git commit才把暂存区内容永久记入历史。
一句话:add 是"挑选",commit 是"盖章存档"。
第一次使用先配置身份:git config --global user.name "你的名字" 和 git config --global user.email "[email protected]",提交记录才会带上作者。想忽略临时文件(如缓存、密钥、日志),在仓库根目录建一个 .gitignore,把要忽略的文件名写进去即可。一个典型循环是:改文件 → git status 看改动 → git add 挑选 → git commit 存档 → git push 同步,反复循环就是日常开发节奏。拿到别人的项目时,用 git clone <仓库地址> 复制到本地,会比手动下载更完整(包含全部历史)。
二、最常用的命令清单
| 命令 | 作用 |
|---|---|
git init |
在目录初始化一个仓库 |
git status |
查看当前改动状态 |
git add <文件> |
把改动加入暂存区 |
git commit -m "说明" |
把暂存区内容存档 |
git log |
查看提交历史 |
git branch |
查看/创建分支 |
git checkout -b 分支名 |
新建并切换到分支 |
git push origin 分支名 |
把本地提交推送到远程 |
git pull |
拉取远程最新代码 |
这些命令覆盖日常 80% 的操作:init 起步、add+commit 记录改动、push/pull 同步远程、log 复盘历史、branch/checkout 切换开发线。记不住时多用 git status 看当前状态,它是 Git 自带的"当前在哪、下一步能干什么"提示。想查看某次提交具体改了哪些文件,用 git show <commit>。
三、分支与合并
分支(Branch)就是平行的开发线。 主线叫 main(旧称 master)。开发新功能时开一个分支,改好再合并(merge)回主线,避免直接动主线造成混乱。
main: A -- B -- C
\
feature: D -- E → merge 回 main
多人协作时先 git pull 再开发,有冲突就手动解决冲突后重新提交。常用写法可参考网站开发 Git 工作流。合并冲突时,Git 会在文件里标出 <<<<<<< HEAD 和 >>>>>>> 之间的差异,手动选好内容后 git add 再 git commit 即可。分支名建议见名知义,如 feature/add-nav、fix/typo、docs/readme,避免 test1、asdf 这类无意义命名。合并回主线后,功能分支就可以删除(git branch -d 分支名),保持分支列表干净。
四、一个完整工作流示例
以部署一个静态网站为例:
# 1. 初始化并第一次提交
git init
git add .
git commit -m "init: first commit"
# 2. 推送远程(先建好远程仓库)
git remote add origin [email protected]:you/site.git
git push -u origin main
# 3. 开发新功能
git checkout -b add-nav
# ...修改文件...
git add .
git commit -m "feat: add navigation"
# 4. 合并回主线并推送
git checkout main
git pull
git merge add-nav
git push
# 5. 查看历史
git log --oneline
想自动部署,可以在推送后触发 CI/CD,见GitHub Actions CI/CD和网站 CI/CD 流水线。
小贴士:每次 commit 只做一件事、说明写清楚,回滚时才能快速定位。提交信息建议用 feat:、fix:、docs: 前缀,便于 git log 快速浏览。推送前先 git pull 再 git push,能减少远程已有他人新提交时的冲突。
五、进阶命令速查
| 命令 | 作用 |
|---|---|
git diff |
查看未暂存的改动内容 |
git stash |
临时存起未提交的改动 |
git log --oneline |
简洁查看历史 |
git reset --soft HEAD~1 |
撤销最近一次提交但保留改动 |
git revert <commit> |
用新提交反向回退,不改写历史 |
git rm --cached <file> |
从版本控制移除但保留本地文件 |
reset 会改写历史,revert 不会。已经推送、多人共用的提交,优先用 revert。日常想查"某一行是谁改的",用 git blame <文件>;想定位某次改动引入的问题,git bisect 可以自动二分排查。误把文件加进暂存区时,用 git reset <file> 把它移出来。
六、常见问题(FAQ)
问:commit 和 push 有什么区别?
commit 是本地存档,push 才把存档同步到远程。只 commit 不 push,别人看不到你的改动。
问:不小心提交了敏感信息怎么办?
立刻移除文件并更换密钥,若已 push 则视为密钥已泄露,直接换新。更稳妥的做法可参考Git 部署工作流中的相关实践。
问:写错提交信息了能改吗?
最后一次提交可用 git commit --amend -m "新信息" 修改;已推送的分支改历史会改写历史,团队协作时慎用。
问:怎么把改动拆成多个 commit?
用 git add 文件名 精确挑选要提交的文件,而不是 git add . 全量添加,再分别 commit,历史会更清晰。
问:git fetch 和 git pull 有什么区别?
fetch 只把远程最新状态下载到本地,不动你的工作区;pull 是 fetch + merge,直接合进当前分支。想先看看再决定合并,用 fetch 更稳。