作为开发者,Git 是日常工作中必不可少的版本控制工具。不管是单人开发还是团队协作,熟练掌握 Git 命令都能大幅提升工作效率,避免版本冲突、代码丢失等问题。本文将按使用场景分类,总结 Git 核心命令、进阶命令及避坑技巧,新手可入门,老手可速查。
一、仓库初始化与远程仓库关联(基础入门)
这部分是 Git 操作的起点,主要用于新建仓库、关联远程仓库,适用于项目初始化阶段。
1. 本地仓库初始化
git init:在当前目录创建一个新的 Git 仓库,生成隐藏的 .git 文件夹,包含版本控制所需的所有文件。
示例:打开项目文件夹,执行git init,即可将当前目录变为 Git 可管理的仓库。
注意:一个项目只需要初始化一次,重复执行不会覆盖现有仓库,只会更新 .git 文件夹。
2. 克隆远程仓库
git clone <远程仓库URL>:将远程仓库完整克隆到本地,包括所有分支、提交历史和文件。
常用示例:
- 基础克隆:git clone https://github.com/username/project.git
- 克隆到指定文件夹:git clone https://github.com/username/project.git my-project
- 克隆指定分支:git clone -b dev https://github.com/username/project.git(直接克隆 dev 分支,避免默认克隆主分支)
3. 关联远程仓库
本地仓库初始化后,需关联远程仓库才能实现代码推送和拉取,常用命令如下:
-git remote add <远程仓库别名> <远程仓库URL>:为本地仓库添加远程仓库关联,别名通常设为 origin(默认)。
示例:git remote add origin https://github.com/username/project.git
-git remote -v:查看本地已关联的远程仓库信息,包括别名和对应的 URL。
-git remote rm <远程仓库别名>:删除指定的远程仓库关联。
示例:git remote rm origin(取消本地与 origin 远程仓库的关联)
二、日常开发核心命令(高频使用)
这部分命令是日常开发中使用频率最高的,涵盖文件状态查看、暂存、提交、拉取、推送等基础操作。
1. 查看文件状态
git status:查看当前工作区、暂存区的文件状态,包括已修改、已暂存、未跟踪、已忽略的文件。
这是排查问题的第一步,每次提交代码前建议先执行该命令,确认文件状态无误。执行后会清晰显示哪些文件需要暂存,哪些文件有未提交的修改。
2. 暂存文件(工作区 → 暂存区)
Git 的版本控制分为工作区、暂存区、版本库三个区域,暂存文件是提交前的必要步骤。
-git add <文件路径>:将指定文件从工作区添加到暂存区,准备提交。
示例:git add index.html(暂存单个文件)、git add src/(暂存整个 src 文件夹)
-git add .:将工作区所有已修改、未跟踪的文件(除了 .gitignore 忽略的文件)全部添加到暂存区,适合一次性暂存多个文件。
-git add --all:与 git add . 功能类似,但会包含已删除的文件,建议优先使用。
3. 提交文件(暂存区 → 版本库)
提交是将暂存区的文件保存到版本库,生成新的提交记录,每个提交都有唯一的 commit ID,用于版本回溯。
-git commit -m "提交说明":将暂存区的文件提交到版本库,-m 后面跟提交说明,必须清晰描述本次提交的内容(如“修复登录页样式问题”“新增用户列表功能”)。
示例:git commit -m "新增首页轮播图功能"
-git commit -am "提交说明":跳过暂存步骤,直接将工作区已跟踪的文件(已提交过的文件)提交到版本库,适合快速提交修改,未跟踪的文件无法用该命令提交。
示例:git commit -am "修改首页标题文案"
-git commit --amend:修改最近一次的提交说明,或补充暂存的文件到最近一次提交(避免生成多余的提交记录)。
示例:执行git commit --amend -m "修改首页标题文案(补充说明)",即可替换最近一次的提交说明。
4. 拉取远程代码(远程 → 本地)
团队协作时,需定期拉取远程仓库的最新代码,避免与他人代码冲突。
-git pull <远程仓库别名> <远程分支名>:从远程仓库拉取指定分支的最新代码,并合并到本地当前分支。
示例:git pull origin main(拉取远程 main 分支的最新代码并合并到本地 main 分支)
-git pull --rebase <远程仓库别名> <远程分支名>:拉取远程代码并以变基的方式合并,避免生成多余的合并提交记录,让提交历史更整洁。
示例:git pull --rebase origin dev
5. 推送本地代码(本地 → 远程)
本地提交后,需将代码推送到远程仓库,供团队成员查看和使用。
-git push <远程仓库别名> <本地分支名>:将本地指定分支的提交推送到远程仓库对应的分支。
示例:git push origin main(将本地 main 分支的提交推送到远程 main 分支)
-git push -u <远程仓库别名> <本地分支名>:首次推送时使用,-u 表示关联本地分支和远程分支,后续推送可直接执行git push,无需指定别名和分支。
示例:git push -u origin dev(首次推送 dev 分支,关联远程 dev 分支)
-git push --force:强制推送本地代码到远程仓库,覆盖远程仓库的提交记录(谨慎使用!团队协作中容易覆盖他人代码,仅在本地修改提交历史后使用)。
三、分支管理命令(团队协作核心)
分支是 Git 的核心优势之一,用于实现并行开发、功能开发、bug 修复等场景,避免影响主分支代码。常用分支管理命令如下:
1. 查看分支
-git branch:查看本地所有分支,当前所在分支前会有 * 标记。
-git branch -r:查看远程所有分支。
-git branch -a:查看本地和远程所有分支。
-git branch -v:查看本地分支的最新提交记录和提交说明。
2. 创建分支
-git branch <分支名>:基于当前分支,创建一个新的本地分支,创建后仍停留在当前分支。
示例:git branch feature/login(基于当前分支创建 feature/login 功能分支)
-git checkout -b <分支名>:创建新分支并立即切换到该分支,是日常开发中最常用的创建分支方式。
示例:git checkout -b bugfix/order(创建 bugfix/order 修复分支并切换到该分支)
-git checkout -b <本地分支名> <远程仓库别名>/<远程分支名>:基于远程分支创建本地分支,并关联远程分支。
示例:git checkout -b dev origin/dev(基于远程 dev 分支创建本地 dev 分支并关联)
3. 切换分支
-git checkout <分支名>:切换到指定本地分支。
示例:git checkout main(切换到 main 分支)
-git switch <分支名>:Git 2.23 版本新增命令,功能与 git checkout 一致,更直观,用于切换分支。
示例:git switch dev(切换到 dev 分支)
4. 合并分支
将一个分支的代码合并到当前分支,常用于功能开发完成后合并到主分支,或 bug 修复完成后合并到开发分支。
-git merge <分支名>:将指定分支的代码合并到当前分支,默认生成合并提交记录。
示例:切换到 main 分支后,执行git merge feature/login(将 feature/login 分支的代码合并到 main 分支)
注意:合并前需确保当前分支和待合并分支都已拉取最新代码,避免冲突。若出现冲突,需先解决冲突,再提交合并。
-git rebase <分支名>:以变基的方式合并指定分支的代码到当前分支,与 merge 不同,rebase 会将当前分支的提交记录“移到”待合并分支的最新提交之后,让提交历史更线性、整洁。
示例:切换到 feature/login 分支后,执行git rebase main(将 main 分支的最新代码合并到 feature/login 分支,以变基方式)
5. 删除分支
分支开发完成、合并后,可删除多余分支,保持仓库整洁。
-git branch -d <分支名>:删除指定本地分支,前提是该分支的代码已合并到其他分支,未合并则无法删除。
示例:git branch -d feature/login(删除 feature/login 本地分支)
-git branch -D <分支名>:强制删除指定本地分支,即使该分支代码未合并(谨慎使用,避免代码丢失)。
-git push <远程仓库别名> --delete <远程分支名>:删除远程仓库的指定分支。
示例:git push origin --delete feature/login(删除远程 origin 仓库的 feature/login 分支)
四、撤销与回退命令(避坑必备)
开发中难免会出现错误提交、误修改文件等情况,掌握撤销与回退命令,可快速恢复代码,减少损失。
1. 撤销工作区修改
git restore <文件路径>:撤销工作区指定文件的修改,恢复到最近一次提交或暂存的状态(Git 2.23 版本新增,替代旧命令 git checkout -- <文件路径>)。
示例:git restore index.html(撤销 index.html 文件的工作区修改)
旧命令:git checkout -- index.html(功能一致,建议使用新命令)
2. 撤销暂存区修改(暂存区 → 工作区)
git restore --staged <文件路径>:将指定文件从暂存区撤销到工作区,保留工作区的修改(Git 2.23 版本新增,替代旧命令 git reset HEAD <文件路径>)。
示例:git restore --staged index.html(将 index.html 从暂存区撤销到工作区)
旧命令:git reset HEAD index.html(功能一致,建议使用新命令)
3. 版本回退
回退到指定的提交版本,适用于错误提交后恢复代码,常用三种参数:--soft、--mixed、--hard。
-git reset --soft <commit ID>:回退到指定提交版本,保留工作区和暂存区的修改,仅撤销提交记录,适合重新提交。
示例:git reset --soft 1a2b3c4(回退到 commit ID 为 1a2b3c4 的版本,保留修改)
-git reset --mixed <commit ID>:默认参数,回退到指定提交版本,保留工作区修改,撤销暂存区和提交记录,适合重新暂存、提交。
示例:git reset --mixed 1a2b3c4(可简写为 git reset 1a2b3c4)
-git reset --hard <commit ID>:强制回退到指定提交版本,撤销工作区、暂存区和提交记录的所有修改,恢复到指定版本的状态(谨慎使用!会丢失未提交的修改,无法恢复)。
示例:git reset --hard 1a2b3c4
注意:回退远程分支的提交记录,需配合git push --force强制推送,但团队协作中需提前告知成员,避免覆盖他人代码。
4. 撤销已推送的提交
若已将错误提交推送到远程仓库,可使用git revert <commit ID>撤销指定提交,该命令会生成一个新的提交记录,保留原提交历史,比 reset 更安全,适合团队协作场景。
示例:git revert 1a2b3c4(撤销 commit ID 为 1a2b3c4 的提交,生成新的提交记录)
五、进阶命令(提升效率)
这部分命令不常用,但在特定场景下能大幅提升效率,适合有一定基础的开发者掌握。
1. 暂存工作进度(git stash)
适用于当前分支工作未完成,需要切换到其他分支处理紧急任务的场景,可暂存当前工作区的修改,切换分支后再恢复。
-git stash:暂存当前工作区的所有修改,保存为一个临时记录。
-git stash save "暂存说明":暂存时添加说明,方便后续识别。
示例:git stash save "未完成的首页轮播图修改"
-git stash list:查看所有暂存的记录。
-git stash pop:恢复最近一次的暂存记录,并删除该暂存记录。
-git stash apply <暂存记录编号>:恢复指定的暂存记录,不删除暂存记录(编号可通过 git stash list 查看)。
示例:git stash apply stash@{0}(恢复第一条暂存记录)
-git stash drop <暂存记录编号>:删除指定的暂存记录。
-git stash clear:删除所有暂存记录。
2. 查看提交历史
-git log:查看本地分支的提交历史,按时间倒序排列,显示 commit ID、提交人、提交时间、提交说明。
-git log --oneline:简洁显示提交历史,一行一个提交,只显示 commit ID(前7位)和提交说明,便于快速查看。
-git log --graph:以图形化方式显示提交历史,清晰展示分支合并、变基的过程。
-git log --author="用户名":查看指定用户的提交历史。
示例:git log --author="zhangsan"(查看张三的所有提交)
-git log --since="2026-01-01":查看指定日期之后的提交历史。
3. 拣选提交(git cherry-pick)
将其他分支的指定提交记录,复制到当前分支,适用于将 bug 修复提交复制到多个分支,避免重复开发。
示例:git cherry-pick 1a2b3c4(将 commit ID 为 1a2b3c4 的提交复制到当前分支)
4. 子模块管理(git submodule)
适用于项目中引用其他 Git 仓库(如公共组件库)的场景,可将其他仓库作为子模块嵌入当前项目。
-git submodule add <远程仓库URL> <本地路径>:添加子模块。
示例:git submodule add https://github.com/username/common-components.git src/components/common
-git submodule init:初始化子模块(克隆项目后首次使用子模块时执行)。
-git submodule update:拉取子模块的最新代码。
-git clone --recurse-submodules <远程仓库URL>:克隆包含子模块的项目时,同时拉取子模块的代码。
六、常用配置与避坑技巧
1. 基础配置
首次使用 Git 时,需配置用户名和邮箱,用于标识提交人信息。
- 全局配置(所有项目生效):
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
- 局部配置(仅当前项目生效):进入项目目录后,执行上述命令,去掉 --global 参数即可。
- 查看配置:git config --list(查看所有 Git 配置)
2. 避坑技巧
1. 提交说明要清晰:避免使用“修复bug”“修改代码”等模糊描述,应明确说明修改内容和原因,便于后续追溯。
2. 避免强制推送:团队协作中,非必要不使用git push --force,若必须使用,需提前告知团队成员,避免覆盖他人代码。
3. 处理冲突要谨慎:合并分支或拉取代码时出现冲突,需仔细对比冲突代码,保留正确内容,删除冲突标记(<<<<<<<、=======、>>>>>>>),再提交合并。
4. 定期拉取远程代码:团队协作中,每天开发前先执行git pull,拉取远程最新代码,减少冲突概率。
5. 分支命名规范:建议采用“功能类型/功能名称”的命名方式,如 feature/login(功能分支)、bugfix/order(bug修复分支)、release/v1.0(发布分支),便于团队识别分支用途。
七、总结
本文总结了 Git 从入门到进阶的常用命令,按使用场景分类,结合示例和注意事项,覆盖了仓库初始化、日常开发、分支管理、撤销回退、进阶操作等所有核心场景。对于新手来说,建议先掌握日常开发核心命令和基础分支管理命令,再逐步学习进阶命令;对于老手来说,可将本文作为速查手册,遇到问题快速查阅。
Git 的核心是版本控制,熟练掌握命令的同时,更要理解其工作原理(工作区、暂存区、版本库的关系),才能灵活应对各种开发场景,避免不必要的错误。希望本文能帮助大家提升 Git 使用效率,让版本控制成为开发的助力而非负担。
最后,建议大家在实际开发中多实践,遇到问题多查阅官方文档或本文,逐步形成自己的 Git 使用习惯。如果有遗漏的常用命令,欢迎在评论区补充交流~