Git:从零上手,先用起来
这篇文章只有一个目标:让你能用 Git 完成日常工作。不讲底层原理,不讲分支哲学,只讲命令和场景。原理部分在 02-内容寻址数据库与四种对象 和 03-三棵树、引用系统与本地时间机器,等你用顺手了再去看。
一、安装与初始配置
安装
# macOS(推荐 Homebrew)
brew install git
# Debian / Ubuntu
sudo apt install git
# Windows:下载 Git for Windows
# https://git-scm.com/download/win安装完成后必做的三件事
git config --global user.name "你的名字"
git config --global user.email "[email protected]"
git config --global init.defaultBranch main这三行告诉 Git 你是谁、默认分支叫什么。user.name 和 user.email 会出现在每一条提交记录里,改错了也没关系,可以随时重新设置。
两个实用的额外配置
git config --global core.editor "code --wait" # 用 VS Code 作为提交信息编辑器
git config --global pull.rebase false # pull 时用 merge,行为直观pull.rebase false 是给初学者的建议:先让行为可预期,等理解了 rebase 再做选择。
查看当前所有全局配置:
git config --global --list二、创建仓库
本地新建
git init my-project # 新建目录并初始化
# 或
cd existing-folder
git init # 在现有目录初始化执行后会出现一个 .git/ 隐藏目录,Git 的所有数据都在里面。
克隆已有仓库
git clone https://github.com/user/repo.git # 克隆到 repo/ 目录
git clone https://github.com/user/repo.git my-dir # 克隆到指定目录
git clone [email protected]:user/repo.git # SSH 方式(推荐,需配置 SSH 密钥)克隆完成后,远程地址已自动配置为 origin,可以直接 push 和 pull。
三、日常提交循环
这是 Git 最核心的操作序列,每天都会用到。
第一步:看清楚状态
git status这条命令是一切的起点。它会告诉你:哪些文件被修改了、哪些已经暂存、哪些是新文件还没被追踪。养成在 add 之前先 status 的习惯。
第二步:暂存修改
git add README.md # 暂存指定文件
git add src/ # 暂存整个目录
git add . # 暂存所有改动(当前目录及子目录)
git add -p # 交互式暂存:逐块选择要提交的内容git add -p 是个很实用的命令:当一个文件里同时有两个不同的改动,但你只想提交其中一个时,它可以让你逐块选择。
第三步:提交
git commit -m "fix: 修复登录页面的样式问题"
git commit # 打开编辑器写多行提交信息
git commit --amend # 修改最近一次提交(消息写错了、或者漏加了文件)关于提交信息的格式,推荐 类型: 描述 的写法,比如 feat: 新功能、fix: 修复问题、docs: 文档更新。这不是强制的,但养成一致的习惯,日后看历史记录会方便很多。
查看改动了什么
git diff # 工作区 vs 暂存区(还没 add 的改动)
git diff --staged # 暂存区 vs 上次提交(已 add 的改动)
git diff main..feature # 两个分支之间的差异查看提交历史
git log # 完整历史
git log --oneline # 每条提交一行,简洁
git log --oneline --graph # 带分支图的历史,多分支时很有用
git log --oneline -10 # 只看最近 10 条
git log --oneline src/ # 只看某个目录的历史四、远程操作
查看和管理远程地址
git remote -v # 查看所有远程地址
git remote add origin [email protected]:user/repo.git # 添加远程
git remote set-url origin <new-url> # 修改远程地址推送
git push # 推送当前分支(已设置 upstream 的情况下)
git push -u origin main # 首次推送,同时设置 upstream(以后直接 git push 即可)
git push origin feature # 推送指定分支拉取
git pull # 拉取并合并(等价于 fetch + merge)
git fetch # 只拉取远程更新,不自动合并
git fetch origin # 同上,明确指定远程名fetch 和 pull 的区别:fetch 只是把远程的数据同步到本地,你的工作分支不会发生任何变化;pull 会直接合并进来。不确定远程有什么改动时,先 fetch,看看 git log origin/main 之后再决定要不要合并。
五、分支基础
查看和创建分支
git branch # 查看所有本地分支
git branch -a # 查看所有分支(含远程)
git branch feature # 新建分支(不切换过去)
git switch feature # 切换到分支
git switch -c feature # 新建并切换(最常用的组合)
git branch -d feature # 删除已合并的分支
git branch -D feature # 强制删除(未合并也删)git switch 是 Git 2.23 引入的新命令,比 git checkout 语义更清晰,推荐使用。
合并分支
git switch main # 先切换到目标分支
git merge feature # 把 feature 合并进来合并时如果发生冲突,Git 会在文件里标记出冲突区域:
<<<<<<< HEAD
你在 main 上的内容
=======
你在 feature 上的内容
>>>>>>> feature
编辑文件、保留想要的内容,然后:
git add 冲突的文件
git commit # Git 会自动填写合并提交信息六、后悔了怎么办
这是最常被问到的问题,按场景对号入座。
还没有 git add,想丢弃工作区的改动
git restore README.md # 丢弃指定文件的改动
git restore . # 丢弃所有未暂存的改动(不可恢复,谨慎)已经 git add,想取消暂存
git restore --staged README.md # 取消暂存,但保留工作区的改动
git restore --staged . # 取消所有暂存已经 git commit,想修改最近一次提交
git commit --amend -m "新的提交信息" # 只改提交信息
git add 漏掉的文件 && git commit --amend --no-edit # 追加文件进上一次提交注意:--amend 只适合还没有 push 出去的提交。已经推送到远程的提交不要随意修改。
已经 git commit,想安全地撤销
git revert HEAD # 创建一个新提交来撤销上一次提交(安全,历史不变)
git revert <commit-sha> # 撤销某一个特定提交git revert 是撤销操作的推荐方式,因为它不改写历史,只是”再提交一次,内容是把上一次改动反过来”。你在团队仓库里看到的历史记录永远不会凭空消失。
git reset 是更强力的工具,它可以移动分支指针、改写历史。初学阶段先用 revert 就够了,reset 的细节在 03-三棵树、引用系统与本地时间机器 里详细讲。
附:常用命令速查
| 场景 | 命令 |
|---|---|
| 看状态 | git status |
| 暂存 | git add . / git add -p |
| 提交 | git commit -m "..." |
| 看历史 | git log --oneline --graph |
| 看改动 | git diff / git diff --staged |
| 推送 | git push / git push -u origin main |
| 拉取 | git pull / git fetch |
| 新建分支 | git switch -c feature |
| 切换分支 | git switch main |
| 合并分支 | git merge feature |
| 取消暂存 | git restore --staged <file> |
| 丢弃改动 | git restore <file> |
| 撤销提交 | git revert HEAD |
| 修改上次提交 | git commit --amend |
| 克隆仓库 | git clone <url> |
| 查看远程 | git remote -v |
日常工作 90% 的操作都在这张表里。遇到更复杂的场景,比如跨分支搬运提交(cherry-pick)、压缩历史(rebase -i)、二分查找 bug(bisect),在 06-从工具到基础设施:演进与现代范式 和 07-安全实践、协作规范与工具生态 里会涉及。