这是 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)的约定:一句话说清"做了什么",用动词开头。例如 修复登录页按钮错位新增用户注册接口。不要写 updatefix123

.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 --hardgit 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 入门——也就是从"会用"到"用得对"。