Git与版本控制
什么是版本控制?
版本控制(Version Control)是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。它可以帮助我们:
- 追踪文件的修改历史,查看谁在何时做了什么更改
- 恢复到之前的版本,当出现错误时可以快速回滚
- 多人协作时管理代码,避免文件冲突和覆盖
- 并行开发不同功能,最后再合并到一起
简单来说,版本控制就像给你的项目创建了一系列"快照",你可以随时回到过去的任何一个状态。
版本控制系统的类型
1.本地版本控制系统
- 在本地磁盘上保存文件的不同版本
- 例如:RCS(通过补丁集记录文件差异)
2.集中式版本控制系统
- 所有版本数据存储在中央服务器
- 开发者从中央服务器拉取代码,完成后再推回
- 例如:SVN、CVS
- 缺点:中央服务器故障时无法协作,数据有丢失风险
3.分布式版本控制系统
- 每个开发者的本地都有完整的版本库副本
- 无需联网即可提交、查看历史
- 拥有更强的分支管理能力
- 例如:Git、Mercurial、Bazaar
- 优势:容错性高,协作灵活,支持离线工作
什么是Git?
Git是目前最流行的分布式版本控制系统,由Linux内核开发者Linus Torvalds于2005年创建。它的设计目标是:
- 速度快
- 支持非线性开发(强大的分支能力)
- 完全分布式
- 能高效处理大型项目(如Linux内核)
Git与其他版本控制系统的主要区别在于:它对待数据的方式更像是一个"快照流",而不是文件变化的列表。每次提交,Git都会对当时的全部文件创建一个快照并保存引用,而不是只记录差异。
Git的核心概念
1.工作区(Working Directory)
- 你当前正在编辑的文件目录
- 这些文件可能处于未跟踪或已修改状态
2.暂存区(Staging Area)
- 一个文件(通常位于.git/index),用于临时保存你打算提交的修改
- 可以理解为待提交内容的缓冲区
3.本地仓库(Local Repository)
- 存储所有版本历史的数据库
- 位于工作区的.git目录中
- 包含所有提交记录、分支信息等
4.远程仓库(Remote Repository)
- 托管在网络上的仓库(如GitHub、GitLab)
- 用于多人协作时同步代码
5.提交(Commit)
- 对工作区修改的一次永久记录
- 每个提交都有一个唯一的哈希值作为标识
6.分支(Branch)
- 指向某个提交的指针
- 默认分支通常名为main或master
- 可以创建多个分支并行开发不同功能
Git的工作流程
1.修改文件:在工作区编辑文件
2.暂存修改:将需要提交的修改添加到暂存区(git add
)
3.提交修改:将暂存区的内容提交到本地仓库(git commit
)
4.同步远程:将本地仓库的修改推送到远程仓库(git push
),或从远程拉取他人的修改(git pull
)
为什么选择Git?
1.性能卓越:Git的所有操作几乎都是本地执行,速度极快
2.强大的分支管理:创建和合并分支非常高效,支持复杂的工作流
3.分布式架构:每个开发者都有完整副本,不怕数据丢失
4.广泛采用:几乎成为行业标准,大量开源项目和企业使用
5.丰富的生态:有GitHub、GitLab等平台提供托管服务,以及众多工具支持
常见的Git工作流
1.集中式工作流:类似SVN,所有人在同一个分支上工作
2.功能分支工作流:每个功能在单独分支开发,完成后合并到主分支
3.GitFlow工作流:有严格的分支模型,区分功能开发、发布准备和bug修复
4.Forking工作流:适合开源项目,通过Fork和Pull Request协作
无论选择哪种工作流,Git的核心功能和概念都是一致的,掌握了基础操作后可以灵活应用于各种场景。
Git的学习曲线虽然有些陡峭,但一旦掌握,将极大提升开发效率和代码管理能力,是现代软件开发不可或缺的工具。
Git 常用命令速查手册
本手册按 基础配置、仓库操作、分支管理、提交与撤销、远程协作、高级操作 ,整理了日常开发中最常用的 Git 命令,方便快速查阅。
一、基础配置(首次使用必做)
Git 首次安装后需配置用户信息(关联提交记录),可通过 --global
配置全局(所有仓库生效),或不加该参数配置当前仓库。
命令 | 说明 |
---|---|
git config --global user.name "用户名" |
配置全局用户名(与 GitHub/GitLab 账号一致) |
git config --global user.email "邮箱" |
配置全局邮箱(与远程仓库账号绑定) |
git config --list |
查看当前 Git 配置(全局+当前仓库) |
git config user.name |
查看当前生效的用户名 |
git config --global core.editor "编辑器" |
配置默认提交编辑器(如 VS Code) |
基础配置命令详解:
1.配置全局用户名
git config --global user.name "ZhangSan"
:该命令会在用户目录的 .gitconfig
文件中添加用户名配置,所有本地 Git 仓库都会使用这个用户名关联提交记录。建议与 GitHub/GitLab 账号保持一致,便于团队识别提交者。
2.配置全局邮箱
git config --global user.email "zhangsan@xxx.com"
:与用户名配套使用,用于标识提交者身份。远程仓库(如 GitHub)会通过该邮箱关联账号,若邮箱未在远程仓库注册,提交记录可能不会显示为你的账号头像。
3.查看所有配置
git config --list
:执行后会列出所有生效的配置项,包括全局配置(--global
)和当前仓库的局部配置(无 --global
)。例如:
user.name=ZhangSan
user.email=zhangsan@xxx.com
core.editor=code --wait
4.查看当前用户名
git config user.name
:单独查看当前生效的用户名,输出结果如 ZhangSan
。若同时存在全局和局部配置,局部配置会覆盖全局配置。
5.配置默认编辑器
git config --global core.editor "code --wait"
:当执行 git commit
未加 -m
参数时,Git 会自动打开编辑器让你填写提交信息。配置 VS Code 时需加 --wait
,确保 Git 等待编辑器关闭后再继续操作。
二、仓库操作(初始化/克隆/查看状态)
包括本地仓库初始化、从远程克隆仓库,以及查看仓库文件状态。
1. 初始化与克隆
命令 | 说明 |
---|---|
git init |
在当前目录初始化本地 Git 仓库(生成 .git 隐藏目录) |
git clone <远程仓库地址> |
从远程仓库克隆到本地(自动创建仓库目录) |
git clone <远程地址> <自定义目录名> |
克隆时指定本地目录名 |
初始化与克隆命令详解:
1.初始化本地仓库
git init
:进入项目文件夹后执行该命令,会在当前目录生成一个隐藏的 .git
文件夹,用于存储仓库的版本信息、分支数据等核心文件。例如:
cd /home/zhangsan/my-project # 进入项目目录
git init # 初始化仓库
执行后,目录下会新增 .git
文件夹(需开启“显示隐藏文件”才能看到)。
2.克隆远程仓库
git clone https://github.com/xxx/xxx.git
:从远程仓库完整复制代码到本地,包括所有分支、提交历史和文件。例如克隆一个名为 vue
的仓库:
git clone https://github.com/vuejs/vue.git
执行后会在当前目录创建 vue
文件夹,内含完整代码和 Git 仓库信息。
3.克隆并指定目录名
git clone <远程地址> <自定义目录名>
:当默认仓库名不符合需求时使用,例如将远程仓库克隆到 my-vue-project
目录:
git clone https://github.com/vuejs/vue.git my-vue-project
执行后代码会存储在 my-vue-project
文件夹中,而非默认的 vue
文件夹。
2. 查看仓库状态
命令 | 说明 |
---|---|
git status |
查看当前工作区/暂存区文件状态 |
git log |
查看提交历史(详细格式) |
git log --oneline |
简化提交历史(仅哈希前7位+提交信息) |
git log --graph |
以图形化显示分支合并历史 |
查看仓库状态命令详解:
1.查看文件状态
git status
:显示工作区(未暂存)和暂存区(已 git add
)的文件状态,例如:
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
new-file.js
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
modified: src/index.js
- 红色文字:未暂存的修改或未跟踪的文件
- 绿色文字:已暂存(
git add
后)的文件
2.查看提交历史(详细)
git log
:按时间倒序显示所有提交,包括提交哈希(长字符串)、作者、邮箱、提交时间、提交信息,例如:
commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
Author: ZhangSan <zhangsan@xxx.com>
Date: Mon Aug 26 10:00:00 2024 +0800
feat: 新增用户登录功能
按 q
键可退出查看。
3.简化版提交历史
git log --oneline
:每一行显示一个提交,仅包含提交哈希前7位和提交信息,适合快速浏览历史:
a1b2c3d (HEAD -> main) feat: 新增用户登录功能
e4f5g6h fix: 修复首页加载缓慢问题
i7j8k9l docs: 更新 README.md 文档
4.图形化分支历史
git log --graph --oneline
:结合 --graph
和 --oneline
,用符号图形化展示分支合并关系:
* a1b2c3d (HEAD -> main) merge: 合并登录功能分支
|\
| * e4f5g6h (feature/login) feat: 完善登录验证
| * i7j8k9l feat: 实现登录表单
* | o0p1q2r fix: 修复导航栏样式
|/
* s3t4u5v init: 初始化项目
图形中 *
代表提交,|
和 /
代表分支流向,直观展示分支创建和合并过程。
三、分支管理(核心操作)
Git 分支是并行开发的核心,常用命令包括创建、切换、合并、删除分支等。
命令 | 说明 |
---|---|
git branch |
查看本地所有分支(* 标记当前分支) |
git branch -r |
查看远程所有分支 |
git branch -a |
查看本地+远程所有分支 |
git branch <分支名> |
创建新分支(基于当前分支) |
git checkout <分支名> |
切换到指定分支 |
git checkout -b <分支名> |
创建并立即切换到新分支 |
git merge <分支名> |
将指定分支合并到当前分支 |
git branch -d <分支名> |
删除已合并的本地分支 |
git branch -D <分支名> |
强制删除未合并的本地分支 |
git push origin --delete <分支名> |
删除远程分支 |
分支管理命令详解:
1.查看本地分支
git branch
:列出所有本地分支,当前所在分支前会显示 *
符号:
* main
feature/login
bugfix/001
2.查看远程分支
git branch -r
:列出远程仓库的所有分支(格式为 origin/分支名
):
origin/main
origin/feature/login
origin/release/v1.0
3.查看所有分支(本地+远程)
git branch -a
:同时显示本地和远程分支,远程分支以 remotes/origin/
为前缀:
* main
feature/login
remotes/origin/main
remotes/origin/feature/login
4.创建新分支
git branch feature/payment
:基于当前所在分支(如 main
)创建新分支 feature/payment
,新分支的代码与当前分支完全一致。创建后仍在原分支,需用 git checkout
切换。
5.切换分支
git checkout feature/payment
:切换到 feature/payment
分支,工作区的文件会自动更新为该分支的最新内容。切换前需确保当前分支的修改已提交或暂存,否则可能导致文件冲突。
6.创建并切换分支(快捷方式)
git checkout -b bugfix/login-error
:等同于 git branch bugfix/login-error
+ git checkout bugfix/login-error
,一步完成分支创建和切换,开发新功能或修复 bug 时常用。
7.合并分支
例如将 feature/login
合并到 main
分支:
git checkout main # 先切换到目标分支(main)
git pull # 拉取远程最新代码,避免冲突
git merge feature/login # 合并 feature/login 到 main
若合并时出现冲突(同一文件同一位置被修改),需手动解决冲突后再提交。
8.删除本地分支(安全模式)
git branch -d feature/login
:仅能删除已合并到当前分支的分支,若分支未合并,会提示错误:error: 分支 'feature/login' 未完全合并
,防止误删未合并的代码。
9.强制删除本地分支
git branch -D feature/old
:无视分支是否合并,强制删除。用于确认废弃的分支(如开发到一半的功能被取消),执行前需确保分支内容无需保留。
10.删除远程分支
git push origin --delete feature/login
:删除远程仓库的 feature/login
分支,执行后需通知团队其他成员执行 git fetch --prune
更新本地远程分支缓存,避免看到已删除的远程分支。
四、提交与撤销(代码暂存/提交/回滚)
代码从“工作区”到“暂存区”再到“本地仓库”的流程,以及错误操作后的撤销方法。
1. 暂存与提交
命令 | 说明 |
---|---|
git add <文件名> |
将指定文件从工作区添加到暂存区 |
git add . |
将当前目录所有修改/新增文件添加到暂存区 |
git add -p |
交互式暂存(按块选择文件内容) |
git commit -m "提交信息" |
将暂存区内容提交到本地仓库 |
git commit -am "提交信息" |
跳过暂存区,直接提交已跟踪文件的修改 |
git commit --amend |
补充提交(合并到上一次提交,修改提交信息) |
暂存与提交命令详解:
1.暂存指定文件
git add src/login.js
:将 src/login.js
从工作区(修改后未暂存的状态)添加到暂存区,后续提交会包含该文件的当前修改。适合仅提交部分文件的场景。
2.暂存所有变更
git add .
:递归添加当前目录下所有“已修改、新增”的文件到暂存区(不包含被删除的文件)。例如新增 utils.js
、修改 index.js
后,执行该命令会同时暂存这两个文件。
3.交互式暂存
git add -p src/utils.js
:按“代码块”选择文件内容进行暂存,适合只提交文件中部分修改的场景(如同一文件修改了两个功能,只想提交其中一个)。执行后会逐块显示修改内容,按提示操作:
y
:暂存当前块n
:跳过当前块q
:退出交互
4.提交暂存区内容
git commit -m "feat: 实现用户登录表单验证"
:将暂存区的所有文件提交到本地仓库,-m
后为提交信息。建议遵循“语义化提交规范”,用 feat
(新功能)、fix
(修复)、docs
(文档)等前缀说明修改类型。
5.直接提交已跟踪文件
git commit -am "fix: 修复登录按钮点击无响应"
:跳过暂存区,直接提交“已跟踪文件”(曾通过 git add
加入版本控制的文件)的修改。不支持新增的未跟踪文件(需先用 git add
跟踪)。
6.补充提交 若上一次提交遗漏了文件或需修改提交信息:
git add 遗漏的文件.js # 先暂存遗漏的文件
git commit --amend # 合并到上一次提交
执行后会打开编辑器,可修改原提交信息,最终将两次修改合并为一次提交(仅适合未推送到远程的提交,避免修改已共享的历史)。
2. 撤销操作
命令 | 说明 |
---|---|
git restore <文件名> |
撤销工作区修改(未暂存的文件) |
git restore --staged <文件名> |
将暂存区文件撤回工作区 |
git reset --soft <提交哈希> |
回滚到指定提交(保留暂存区和工作区) |
git reset --mixed <提交哈希> |
回滚到指定提交(清空暂存区,保留工作区) |
git reset --hard <提交哈希> |
强制回滚(清空暂存区+删除工作区修改) |
git revert <提交哈希> |
生成撤销提交(保留原历史,适合已推送的代码) |
撤销操作命令详解:
1.撤销工作区修改
git restore src/login.js
:适用于:修改了文件但未执行 git add
,想放弃修改,恢复到文件上一次提交或暂存的状态。修改会丢失,执行前确保无需保留。
2.取消暂存
git restore --staged src/login.js
:适用于:执行 git add
后发现文件有错误,想取消暂存但保留修改。执行后文件从暂存区回到工作区,可重新修改后再 git add
。
3.软回滚(保留变更)
git reset --soft HEAD~1
HEAD~1
表示上一次提交(HEAD~2
表示上上次,也可直接用提交哈希)- 效果:本地仓库回滚到指定提交,暂存区和工作区的修改完全保留(适合合并多次连续提交)
示例:最近两次提交可合并为一次,执行后最近一次提交的内容会回到暂存区,重新
git commit
即可合并。
4.混合回滚(默认模式)
git reset --mixed HEAD~1
- 效果:本地仓库回滚到指定提交,暂存区清空,工作区修改保留(适合“提交后发现代码需调整,想重新提交”)
- 示例:提交后发现代码有小问题,执行后可直接修改工作区文件,重新
git add
和git commit
。
5.强制回滚(危险操作)
git reset --hard a1b2c3d
- 效果:本地仓库回滚到指定提交(
a1b2c3d
为目标提交哈希),暂存区和工作区的所有修改永久删除 - 适用场景:提交了错误代码(如包含密码、病毒文件),需彻底清除
- 警告:执行前务必确认修改无需保留,且该提交未推送到远程(否则会影响团队协作)。
6.生成撤销提交(安全回滚)
git revert a1b2c3d
- 适用于:已推送到远程的错误提交,需撤销但保留原历史(避免修改共享的提交记录)
- 效果:创建一个新提交,内容为“抵消
a1b2c3d
提交的修改”,原提交仍保留在历史中 - 操作:执行后会打开编辑器填写撤销原因,提交后远程仓库会新增一个撤销提交,团队成员拉取后即可同步修改。
五、远程协作(与远程仓库交互)
团队协作中,需与 GitHub/GitLab 等远程仓库同步代码(拉取/推送/关联)。
命令 | 说明 |
---|---|
git remote |
查看已关联的远程仓库列表 |
git remote -v |
查看远程仓库的详细地址 |
git remote add <远程名> <远程地址> |
关联远程仓库 |
git pull |
拉取远程分支代码并合并到本地当前分支 |
git pull <远程名> <远程分支>:<本地分支> |
拉取指定远程分支到本地指定分支 |
git push |
推送本地当前分支到远程对应分支(首次需 -u 绑定) |
git push <远程名> <本地分支>:<远程分支> |
推送本地分支到远程指定分支 |
git fetch |
拉取远程仓库信息(不合并,仅更新本地跟踪分支) |
git remote set-url <远程名> <新地址> |
修改远程仓库地址 |
远程协作命令详解:
1.查看远程仓库名称
git remote
:列出本地已关联的远程仓库名称,默认克隆的仓库名通常为 origin
:
origin
upstream # 若关联了上游仓库(如 Fork 项目后)
2.查看远程仓库地址
git remote -v
:显示每个远程仓库的拉取(fetch
)和推送(push
)地址:
origin https://github.com/your-name/your-repo.git (fetch)
origin https://github.com/your-name/your-repo.git (push)
upstream https://github.com/original-owner/original-repo.git (fetch)
upstream https://github.com/original-owner/original-repo.git (push)
3.关联远程仓库
本地新建仓库后,需关联远程仓库才能推送代码:
git remote add origin https://github.com/your-name/new-repo.git
其中 origin
是远程仓库的别名(可自定义,通常用 origin
),后续推送/拉取时直接使用别名即可。
4.拉取远程代码(默认分支)
git pull
:拉取远程仓库中与本地当前分支对应的分支(如本地 main
对应远程 origin/main
),并自动合并到本地分支。相当于 git fetch
+ git merge
,拉取前建议提交本地修改,避免冲突。
5.拉取指定远程分支
git pull origin dev:local-dev
:拉取远程 origin/dev
分支的代码,合并到本地 local-dev
分支(本地分支不存在时会自动创建)。适用于同步远程非对应分支的场景。
6.推送本地分支到远程
- 首次推送:需绑定“上游分支”(远程分支与本地分支关联)
git push -u origin feature/payment # 推送本地 feature/payment 到远程 origin/feature/payment
- 后续推送:绑定后直接执行
git push
即可,无需重复指定远程和分支。
7.推送本地分支到远程指定分支
git push origin local-test:remote-test
:将本地 local-test
分支的代码推送到远程 remote-test
分支(远程分支不存在时会自动创建),适用于本地与远程分支名不同的场景。
8.拉取远程信息(不合并)
git fetch origin
:拉取远程仓库的所有分支信息到本地(更新本地的远程跟踪分支,如 origin/main
),但不合并到本地分支。适合先查看远程最新代码,再决定是否合并:
git fetch origin # 拉取远程信息
git checkout origin/main # 查看远程 main 分支的最新代码
git merge origin/main # 手动合并到本地 main 分支(如需)
9.修改远程仓库地址 当远程仓库迁移(如从 GitHub 迁移到 GitLab)时,需更新地址:
git remote set-url origin https://new-url.git
执行后可用 git remote -v
验证地址是否更新。
六、高级操作(忽略文件/冲突解决/标签)
解决日常开发中的特殊场景,如忽略不必要文件、合并冲突、打版本标签等。
1. 忽略文件(.gitignore)
创建 .gitignore
文件,指定 Git 需忽略的文件/目录(如日志、依赖、IDE 配置),避免提交无关内容。
示例 .gitignore
内容:
# 忽略 node_modules 依赖目录(npm/yarn 安装的依赖)
node_modules/
# 忽略日志文件
logs/
*.log
# 忽略 VS Code 配置
.vscode/
*.code-workspace
# 忽略环境变量文件(含敏感信息)
.env
.env.local
# 忽略操作系统自动生成的文件
.DS_Store # macOS
Thumbs.db # Windows
使用方法:
- 在仓库根目录创建
.gitignore
文件:touch .gitignore
(Windows 可手动创建) - 按上述格式添加需忽略的文件/目录
- 将
.gitignore
本身提交到仓库:git add .gitignore && git commit -m "chore: 添加 .gitignore"
2. 冲突解决
合并分支或拉取代码时,若同一文件同一位置被不同修改,会产生冲突,需手动解决:
冲突解决步骤:
1.冲突提示:合并时终端会提示 Automatic merge failed; fix conflicts and then commit the result.
2.查看冲突文件:冲突文件中会标记冲突内容:
<<<<<<< HEAD(当前分支内容)
let welcomeMsg = "Hello from main";
=======(冲突分割线)
let welcomeMsg = "Hello from feature";
>>>>>>> feature/login(待合并分支内容)
3.手动编辑:删除冲突标记(<<<<<<<
、=======
、>>>>>>>
),保留正确内容(可结合两边修改):
let welcomeMsg = "Hello from merged code"; // 保留正确逻辑
4.标记为已解决:git add <冲突文件>
(将解决后的文件加入暂存区)
5.完成合并:git commit
(无需 -m
,Git 会自动生成冲突解决的提交信息)
3. 标签(版本标记)
用于标记重要版本(如发布版本 v1.0.0),方便后续回溯。
命令 | 说明 |
---|---|
git tag |
查看所有本地标签 |
git tag -a <标签名> -m "标签说明" |
创建带注释的标签(推荐) |
git tag <标签名> |
创建轻量标签(仅存哈希,无注释) |
git push origin <标签名> |
推送指定标签到远程 |
git push origin --tags |
推送所有本地标签到远程 |
git tag -d <标签名> |
删除本地标签 |
git push origin --delete <标签名> |
删除远程标签 |
标签命令详解:
1.创建带注释的标签(推荐)
git tag -a v1.0.0 -m "第一个正式发布版本,支持登录、支付功能"
:带注释的标签包含标签名、创建者、时间、说明,适合正式版本标记,便于后续查看标签含义。
2.推送标签到远程
- 推送单个标签:
git push origin v1.0.0
- 推送所有标签:
git push origin --tags
(批量推送本地所有未推送的标签)
3.基于历史提交打标签
若需为过去的提交打标签,先通过 git log --oneline
找到目标提交哈希,再执行:
git tag -a v0.9.0 a1b2c3d -m "修复上线前的最后一个bug"
其中 a1b2c3d
是历史提交的哈希。
4.删除标签
- 删除本地标签:
git tag -d v0.9.0
- 删除远程标签:
git push origin --delete v0.9.0
附:常用场景命令组合
1.新功能开发完整流程:
# 1. 切换到主分支并拉取最新代码
git checkout main
git pull
# 2. 创建并切换到功能分支
git checkout -b feature/user-profile
# 3. 开发代码(修改/新增文件)...
# 4. 提交代码到本地仓库
git add .
git commit -m "feat: 实现用户资料页编辑功能"
# 5. 推送分支到远程(首次需 -u 绑定)
git push -u origin feature/user-profile
2.修复线上紧急 bug 流程:
# 1. 切换到主分支并拉取最新代码
git checkout main
git pull
# 2. 创建 bug 修复分支
git checkout -b bugfix/critical-error
# 3. 修复代码...
# 4. 提交修复
git add .
git commit -m "fix: 修复支付接口超时导致的订单异常"
# 5. 推送分支并申请合并到主分支
git push -u origin bugfix/critical-error
3.版本发布流程:
# 1. 确保主分支代码最新且稳定
git checkout main
git pull
# 2. 打版本标签
git tag -a v1.2.0 -m "v1.2.0 发布:新增用户资料页,修复支付bug"
# 3. 推送标签到远程(触发发布流程)
git push origin v1.2.0
七、Git 别名配置(提高效率)
为常用命令设置别名,减少输入量,提升操作效率。通过 git config
配置后,可使用简称代替完整命令。
命令 | 说明 | 示例效果 |
---|---|---|
git config --global alias.st status |
用 git st 代替 git status |
git st 等价于 git status |
git config --global alias.co checkout |
用 git co 代替 git checkout |
git co main 等价于 git checkout main |
git config --global alias.br branch |
用 git br 代替 git branch |
git br 等价于 git branch |
git config --global alias.cm "commit -m" |
用 git cm 代替 git commit -m |
git cm "fix: xxx" 等价于 git commit -m "fix: xxx" |
git config --global alias.unstage "restore --staged" |
用 git unstage 取消暂存 |
git unstage file.js 等价于 git restore --staged file.js |
git config --global alias.last "log -1 HEAD" |
用 git last 查看最后一次提交 |
git last 等价于 git log -1 HEAD |
配置示例:
# 一次性配置常用别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm "commit -m"
git config --global alias.unstage "restore --staged"
配置后,日常操作可简化为:
git st # 查看状态
git co -b dev # 创建并切换分支
git br # 查看分支
git cm "feat: xxx" # 提交代码
八、其他实用命令
处理特殊场景的辅助命令,如清理工作区、查看差异、暂存工作区等。
命令 | 说明 | 示例 |
---|---|---|
git clean -fd |
清理工作区的未跟踪文件和目录(-f 删文件,-d 删目录) |
执行 git clean -fd 会删除所有未 git add 的新增文件和文件夹(谨慎使用) |
git diff |
查看工作区与暂存区的差异(未暂存的修改内容) | git diff 显示所有未暂存的修改,git diff file.js 仅显示指定文件的修改 |
git diff --staged |
查看暂存区与本地仓库的差异(已暂存但未提交的内容) | 执行 git diff --staged 可确认 git add 后的内容是否正确 |
git stash |
暂存当前工作区的修改(未提交的内容),用于临时切换分支 | 开发到一半需切换分支,执行 git stash 暂存修改,切换回来后用 git stash pop 恢复 |
git stash pop |
恢复最近一次 git stash 暂存的内容,并删除暂存记录 |
git stash pop 会将暂存的修改恢复到工作区 |
git stash list |
查看所有暂存的记录 | 执行后显示 stash@{0}: WIP on feature/login: a1b2c3d ... 等暂存列表 |
git cherry-pick <提交哈希> |
将指定提交复制到当前分支(适用于跨分支复用单个提交) | 在 main 分支执行 git cherry-pick e4f5g6h ,将 e4f5g6h 提交复制到 main |
实用命令详解:
1.清理未跟踪文件
git clean -fd
:用于删除工作区中所有未被 Git 跟踪的文件(如编译产物、临时文件),执行前建议先用 git clean -nfd
预览会删除的内容(-n
表示模拟操作)。
2.查看差异
git diff
:对比工作区与暂存区,显示未暂存的修改(如新增、删除的代码行)。git diff --staged
:对比暂存区与本地仓库,确认即将提交的内容是否正确。
3.暂存工作区(stash) 场景:正在开发分支 A,需紧急切换到分支 B 修复 bug,但分支 A 的修改未完成不想提交。
git stash # 暂存分支 A 的修改
git checkout B # 切换到分支 B 修复 bug
# 修复完成后切换回分支 A
git checkout A
git stash pop # 恢复暂存的修改,继续开发
4.复制提交(cherry-pick)
场景:分支 feature/login
有一个修复 e4f5g6h
需同步到 main
分支,但不想合并整个分支。
git checkout main # 切换到目标分支
git cherry-pick e4f5g6h # 复制 e4f5g6h 提交到 main 分支
若复制时出现冲突,解决方式与合并冲突相同,解决后执行 git cherry-pick --continue
完成操作。
九、常见问题与解决方法
1.提交后发现用户名/邮箱错误 若需修改历史提交的用户信息(仅限未推送到远程的提交):
git commit --amend --author="用户名 <邮箱>" --no-edit
若已推送且必须修改(不推荐,会改写历史),需强制推送:
git commit --amend --author="用户名 <邮箱>" --no-edit
git push --force origin 分支名 # 谨慎使用,可能覆盖团队成员的提交
2.误将敏感文件提交到仓库
需彻底从历史中删除(以 config.ini
为例):
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch config.ini" \
--prune-empty --tag-name-filter cat -- --all
# 推送修改(会改写历史,需通知团队)
git push origin --force --all
同时在 .gitignore
中添加该文件,避免再次提交。
3.拉取代码时提示“Your local changes would be overwritten by merge” 原因:本地有未提交的修改,拉取会覆盖。 解决:
- 提交本地修改:
git add . && git commit -m "暂存本地修改"
- 暂存本地修改:
git stash
,拉取后恢复:git stash pop
总结
本手册覆盖了 Git 日常开发的核心命令,从基础配置到高级操作,结合具体场景和示例,方便快速查阅和使用。Git 命令较多,建议优先掌握 分支管理、提交撤销、远程协作 三类核心操作,其余命令可在需要时对照手册查询。随着使用熟练度提升,可通过配置别名、组合命令进一步提高效率,逐步掌握 Git 的强大功能。