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 addgit commit 即可。分支名建议见名知义,如 feature/add-navfix/typodocs/readme,避免 test1asdf 这类无意义命名。合并回主线后,功能分支就可以删除(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 pullgit 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)

问:commitpush 有什么区别?
commit 是本地存档,push 才把存档同步到远程。只 commit 不 push,别人看不到你的改动。

问:不小心提交了敏感信息怎么办?
立刻移除文件并更换密钥,若已 push 则视为密钥已泄露,直接换新。更稳妥的做法可参考Git 部署工作流中的相关实践。

问:写错提交信息了能改吗?
最后一次提交可用 git commit --amend -m "新信息" 修改;已推送的分支改历史会改写历史,团队协作时慎用。

问:怎么把改动拆成多个 commit?
git add 文件名 精确挑选要提交的文件,而不是 git add . 全量添加,再分别 commit,历史会更清晰。

问:git fetchgit pull 有什么区别?
fetch 只把远程最新状态下载到本地,不动你的工作区;pullfetch + merge,直接合进当前分支。想先看看再决定合并,用 fetch 更稳。