这是 Git 手册系列的第一篇。目标只有一个:让你今天就能用 Git 管好自己的代码,并且知道每条命令在干什么。不理解原理没关系,先把工作流跑通。
目录
- Git 是什么,解决什么问题
- 安装与初始配置
- 四个区域:工作区、暂存区、本地仓库、远程仓库
- 第一次提交
- 日常三板斧:status / add / commit
- 查看历史
- 撤销与回退(安全版)
- 连接远程仓库(GitHub / GitLab)
- 分支是什么(先会用最基础的)
- 初级常见错误
Git 是什么,解决什么问题
没有 Git 的时候,你是这样管理代码的:
project/
project-final/
project-final-v2/
project-final-v2-真的最终版/
Git 做的事:把项目的每一次修改记录成"快照"(commit),你可以随时查看任何历史版本、回到任何历史版本、同时维护多条并行的修改线(分支),并和别人协作而互不覆盖。
安装与初始配置
# macOS
brew install git
# Ubuntu / Debian
sudo apt install git
# Windows:安装 Git for Windows(自带 Git Bash)
第一次使用必须先配置身份,否则提交会带上机器默认的匿名信息:
git config --global user.name "你的名字"
git config --global user.email "[email protected]"
git config --global init.defaultBranch main
验证:
git config --list
四个区域:工作区、暂存区、本地仓库、远程仓库
这是理解 Git 所有命令的钥匙:
工作区 暂存区 本地仓库 远程仓库
(working dir) (staging) (repository) (remote)
| | | |
| git add → | git commit → | git push → |
| | | |
| ← checkout | ← reset | ← git pull |
- 工作区:你正在编辑的文件
- 暂存区:下一次提交要包含的内容(一个"待打包区")
- 本地仓库:已经提交的历史快照
- 远程仓库:GitHub / GitLab / 自建服务器上的副本
为什么要多一个暂存区?因为你可以改 10 个文件,但只把其中 3 个相关的改动打成一次干净的提交。
第一次提交
# 在项目目录初始化仓库
cd my-project
git init
# 查看状态(最重要的命令,有事没事敲一下)
git status
# 把文件放进暂存区
git add README.md # 单个文件
git add . # 所有变更(初级可以先这样用)
# 提交到本地仓库
git commit -m "初始化项目:添加 README"
提交信息(commit message)的约定:一句话说清"做了什么",用动词开头。例如 修复登录页按钮错位、新增用户注册接口。不要写 update、fix、123。
.gitignore:告诉 Git 别管某些文件
# 依赖与构建产物
node_modules/
dist/
*.log
# 环境与密钥(永远不要提交)
.env
*.pem
# 系统文件
.DS_Store
新建仓库第一件事就是写 .gitignore。如果已经把 node_modules 提交了,用 git rm -r --cached node_modules 把它移出版本库再提交。
日常三板斧:status / add / commit
你的日常循环就是:
git status # 现在有哪些改动?哪些已暂存?
git add <file> # 挑选改动放入暂存区
git commit -m "做了什么" # 打包成一次快照
辅助命令:
git diff # 工作区 vs 暂存区:还没 add 的改动细节
git diff --staged # 暂存区 vs 上次提交:这次将要提交什么
提交频率建议:完成一个"说得清的小目标"就提交一次。一天 3~10 次提交很正常;一周一次提交等于没用 Git。
查看历史
git log # 完整历史
git log --oneline # 一行一条,最常用
git log --oneline --graph # 带分支图形
git show <commit-id> # 看某次提交的具体改动
git blame <file> # 文件每一行是谁在哪次提交写的
每次提交有一个 40 位的哈希 id,平时用前 7 位即可指代(如 a1b2c3d)。
撤销与回退(安全版)
初级只需要记住三句,按"还没提交到哪一步"选:
# 1. 改了文件但还没 add:丢弃工作区修改
git restore <file>
# 2. 已经 add 但还没 commit:退回暂存区(改动保留在工作区)
git restore --staged <file>
# 3. 已经 commit:再提交一次"反向提交"来撤销,不改历史,最安全
git revert <commit-id>
⚠️ git reset --hard 和 git push --force 会永久丢数据或改写共享历史,初级阶段先别碰,等中级篇再学。
连接远程仓库(GitHub / GitLab)
情形 A:本地已有项目,推到新建的远程仓库
在 GitHub 上创建一个空仓库(不要勾选初始化 README),然后:
git remote add origin [email protected]:yourname/my-project.git
git branch -M main
git push -u origin main
情形 B:从远程克隆一个已有项目
git clone [email protected]:someone/some-project.git
cd some-project
日常同步
git pull # 拉取远程最新提交并合并到本地
git push # 推送本地提交到远程
认证推荐配置 SSH key(ssh-keygen 生成后把公钥贴到 GitHub 设置里),一次配置永久免密。
分支是什么(先会用最基础的)
分支 = 一条独立的修改线,互不影响。默认分支是 main。
git branch # 列出本地分支
git switch -c feature-login # 新建并切换到新分支
git switch main # 切回 main
典型用法:
git switch -c fix-button # 开分支做修复
# …改代码、add、commit…
git switch main # 回主线
git merge fix-button # 把修复合并进来
git branch -d fix-button # 删掉用完的分支
git push # 同步到远程
初级记住一个原则:永远别直接在 main 上干活,做任何改动都先开分支。合并冲突暂时不用怕,中级篇会专门讲。
初级常见错误
1. 提交信息写 “update” 一个月后你自己都不知道这次提交干了什么。写具体点。
2. 把 .env、密钥提交了
先 git rm --cached .env 移除并写进 .gitignore。注意:历史里还有,密钥必须立即更换。
3. 在错误的目录 git init
比如在家目录 ~ 下执行了 init。删掉误建的 .git 目录即可:rm -rf ~/.git(确认路径后再执行)。
4. pull 下来一堆冲突,慌了
冲突不是错误,是 Git 在问你"两边都改了,听谁的"。先 git status 看哪些文件冲突,打开文件找 <<<<<<< 标记,手动改对后 add + commit。
5. 半年不 push 本地仓库丢了硬盘就没了。每天至少 push 一次。
本篇速查表
| 目的 | 命令 |
|---|---|
| 初始化 | git init |
| 看状态 | git status |
| 暂存 | git add <file> |
| 提交 | git commit -m "..." |
| 看历史 | git log --oneline |
| 撤销未暂存修改 | git restore <file> |
| 撤销已暂存 | git restore --staged <file> |
| 安全撤销某次提交 | git revert <id> |
| 克隆 | git clone <url> |
| 拉取 / 推送 | git pull / git push |
| 开分支 | git switch -c <name> |
| 合并 | git merge <name> |
掌握这些,你已经覆盖了个人项目 90% 的场景。下一篇《中级篇》讲分支协作模型、合并冲突的正确解法、stash、reset 的三种模式和 rebase 入门——也就是从"会用"到"用得对"。