目录
引言
Git 是目前最流行的分布式版本控制系统,几乎每个开发者每天都在使用。无论你是刚入门的新手,还是想巩固基础的老手,掌握 Git 的常用命令都能让你的开发效率大幅提升。
本文将从零开始,按使用场景带你逐步掌握 Git 的核心命令。
1. 安装与配置
安装 Git
各平台安装方式:
# macOS
brew install git
# Ubuntu / Debian
sudo apt install git
# Windows
# 从 https://git-scm.com/download/win 下载安装包
首次配置
安装完成后,第一件事是配置用户名和邮箱——每次提交都会附带这些信息。
git config --global user.name "你的名字"
git config --global user.email "your@email.com"
常用配置项:
# 查看所有配置
git config --list
# 设置默认分支名
git config --global init.defaultBranch main
# 设置别名(提高效率)
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
# 设置编辑器
git config --global core.editor "code --wait"
使用 --global 表示全局生效,如果不同项目需要不同身份,可以在项目目录去掉 --global 来单独设置。
2. 创建仓库
有两种方式开始使用 Git:初始化新仓库,或克隆已有仓库。
初始化新仓库
# 在当前目录初始化
git init
# 初始化后会自动创建一个 .git 目录(不要手动修改它)
克隆已有仓库
# 克隆远程仓库到本地
git clone https://github.com/用户名/仓库名.git
# 克隆到指定目录
git clone https://github.com/用户名/仓库名.git my-folder
# 克隆指定分支
git clone -b 分支名 https://github.com/用户名/仓库名.git
3. 日常操作流程
这是最常用的工作流,每天都会用到。
查看状态
git status
这个命令会告诉你当前工作目录的状态:哪些文件被修改了、哪些暂存了、哪些未跟踪。
添加文件到暂存区
# 添加单个文件
git add index.html
# 添加所有变更
git add .
# 交互式添加(选择部分修改)
git add -p
提交变更
# 提交暂存区的内容
git commit -m "feat: 添加用户登录功能"
# 跳过暂存区,直接提交已跟踪文件的修改
git commit -a -m "fix: 修复导航栏样式"
# 修改上一次提交(还没推送时使用)
git commit --amend -m "修正后的提交信息"
--amend 会改写提交历史,仅用于尚未推送到远程的提交。
查看提交历史
# 查看提交日志
git log
# 简洁模式(一行一个提交)
git log --oneline
# 图形化显示分支
git log --graph --oneline --all
# 查看指定文件的修改历史
git log -p 文件名
# 按作者筛选
git log --author="Mireve"
# 最近 N 条
git log -5
比较差异
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与最新提交的差异
git diff --staged
# 查看两个提交之间的差异
git diff commit1..commit2
# 仅查看文件名列表
git diff --name-only
4. 分支管理
分支是 Git 最强大的特性之一,让你可以并行开发不同功能。
创建与切换分支
# 列出本地分支
git branch
# 列出所有分支(含远程)
git branch -a
# 创建新分支
git branch feature-login
# 切换分支
git checkout feature-login
# 创建并切换分支(推荐)
git checkout -b feature-login
# 或者使用新版命令(更直观)
git switch feature-login
git switch -c feature-login
git switch 和 git restore 是 Git 2.23+ 引入的新命令,将 checkout 的职责拆分为”切换分支”和”恢复文件”两个独立操作,语义更清晰。
合并分支
# 将 feature 分支合并到当前分支
# 先切换到目标分支
git checkout main
# 再合并
git merge feature-login
遇到合并冲突时,Git 会标记冲突文件。手动解决后执行:
# 标记冲突已解决
git add 已解决冲突的文件
# 完成合并
git commit
变基
变基可以让提交历史更整洁,但需谨慎使用。
# 将当前分支的提交变基到 main 之上
git rebase main
# 交互式变基(合并、修改、重排提交)
git rebase -i HEAD~3
绝对不要对已推送到远程的提交执行变基。变基会改写历史,推送时需要 --force,这会影响到协作者。
暂存工作
当需要临时切换分支处理别的事,又不想提交当前工作:
# 暂存当前修改
git stash
# 暂存并添加描述
git stash save "WIP: 用户模块重构"
# 查看暂存列表
git stash list
# 恢复最近一次暂存
git stash pop
# 恢复但不删除暂存
git stash apply
# 删除暂存
git stash drop
5. 远程协作
多人开发离不开远程仓库的操作。
管理远程仓库
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/用户名/仓库名.git
# 删除远程仓库
git remote remove origin
# 修改远程仓库地址
git remote set-url origin https://github.com/用户名/新仓库名.git
推送与拉取
# 推送到远程(第一次需要关联)
git push -u origin main
# 之后只需
git push
# 拉取远程更新并合并
git pull
# 拉取但不合并(先看看远程有什么)
git fetch
# 拉取远程的特定分支
git pull origin feature-login
git pull 本质是 git fetch + git merge。如果你更倾向于用变基代替合并,可以设置:git config --global pull.rebase true。
处理推送被拒
当远程有新提交而你本地没有时,推送会被拒绝。此时需要先拉取再推送:
git pull
# 解决冲突(如有)
git push
6. 撤销与回滚
Git 提供了多种撤销方式,适用于不同场景。
撤销工作区修改
# 丢弃工作区的修改(危险!不可恢复)
git restore 文件名
# 或者使用旧版命令
git checkout -- 文件名
撤销暂存
# 将文件从暂存区移出,但保留工作区修改
git restore --staged 文件名
# 旧版命令
git reset HEAD 文件名
回退提交
# 回退到上一个提交,但保留工作区修改(soft reset)
git reset --soft HEAD~1
# 回退到上一个提交,同时撤销暂存(mixed reset,默认)
git reset HEAD~1
# 回退到上一个提交,丢弃所有修改(hard reset,危险)
git reset --hard HEAD~1
git reset --hard 会丢弃工作区和暂存区的所有修改,且不可恢复。使用前请再三确认。
撤销已推送的提交
对于已经推送的提交,应该用 revert 而不是 reset:
# 创建一个新的提交,反转指定提交的变更
git revert HEAD
# 撤销多个提交
git revert HEAD~3..HEAD
# 推送到远程
git push
revert 是安全的,因为它不会改写历史,而是新增一个”反做”的提交。
捡起丢失的提交
如果不小心 reset --hard 丢失了提交:
# 查看所有分支操作的历史
git reflog
# 找到丢失的 commit hash,然后恢复
git reset --hard <hash>
reflog 是 Git 的救生索,它会记录本地仓库的所有 HEAD 变动。不过 reflog 也有过期时间(默认 90 天),重要的提交要尽早恢复。
7. 标签管理
标签通常用于标记版本发布。
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "v1.0.0 正式发布"
# 创建轻量标签
git tag v1.0.1
# 查看标签
git tag
# 查看标签详情
git show v1.0.0
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push --tags
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0
8. .gitignore
不是所有文件都应该纳入版本控制。.gitignore 文件告诉 Git 忽略哪些文件或目录。
# 依赖目录
node_modules/
vendor/
# 构建产物
dist/
build/
.env.local
# 系统文件
.DS_Store
Thumbs.db
# IDE 配置
.vscode/
.idea/
建议在项目初始化时就创建 .gitignore,避免误将不需要的文件提交。
9. 实用技巧
查看某行代码是谁写的
git blame 文件名
搜索提交信息或代码
# 搜索提交信息
git log --grep="修复"
# 搜索代码内容(整个历史)
git log -S "函数名" --all
查看当前分支基于哪个分支
git reflog show <分支名>
压缩提交历史
合并多个小提交为一个(在推送前使用):
git rebase -i HEAD~3
将除了第一个以外的 pick 改为 squash(或 s),保存退出即可。
从特定提交创建新分支
git branch 新分支名 提交hash
git switch 新分支名
结语
Git 的命令远不止这些,但以上涵盖了日常开发中 90% 以上的场景。掌握这些命令,你已经可以应对绝大多数工作需求。
记住几个要点:
- 提交要频繁,信息要清晰
- 推送前先拉取
- 公共历史不要改写
- 有疑问时
git status和git log是你的好帮手
随着使用经验的积累,你会逐渐发现更多 Git 的高级用法。祝你编码愉快!