近期工作,发现一个特别普遍的问题——
Git 命令都会背,一到实际场景就懵。
比如这几个经典时刻,你中了几条:
-
😵 代码写一半,突然要切分支修紧急 bug,当前代码怎么办?
-
😱
git commit完发现备注写错了,能改吗? -
🤯 合并分支弹出一堆冲突标记,头皮发麻……
-
💀 听说
git reset --hard能回退,一按,代码全没了……
别慌,这些场景我都踩过坑。
这篇教程不给你背命令,只讲场景。 每个命令都配真实开发案例和踩坑提醒,帮你把 Git 从"记忆负担"变成"肌肉记忆"。
一、先搞懂三个区域,后面所有命令就不慌了
在动手之前,咱们用 30 秒搞清楚 Git 的核心流转逻辑。搞懂这个,后面所有命令你都能秒懂:
| 区域 | 通俗理解 | 类比 |
|---|---|---|
| 工作区 | 你电脑文件夹里肉眼看到的文件 | 你的书桌 |
| 暂存区 (Stage) | 临时中转站,git add 后文件先到这 | 信封 |
| 本地仓库 (.git) | 存放所有版本快照 | 保险柜 |
| 远程仓库 | Gitee/GitHub/GitLab 云端仓库 | 网盘 |
流转链路(记住这条链,后面所有命令都在这个链上操作):
修改文件 → git add 暂存 → git commit 提交本地 → git push 推送到远程
💡 老手习惯:面试被问"Git 工作原理",把这条链路说清楚,直接加分。
二、环境配置——30 秒搞定,以后不用再管
1. 确认 Git 装好了
git --version
输出示例:
git version 2.42.0.windows.1
有版本号就说明装好了 ✅
2. 配置你的身份(必须!否则提交没有名字)
# 配置姓名 git config --global user.name "Li Hua" # 配置邮箱(建议和 Gitee/GitHub 注册邮箱一致) git config --global user.email "lihua@163.com"
3. 查看配置是否生效
git config --global --list
输出示例:
user.name=Li Hua user.email=lihua@163.com pull.rebase=true init.defaultBranch=main color.ui=auto
💡 小技巧:
--global表示全局配置,一台电脑只需要配一次。之后所有项目都用这个身份提交。
⚠️ 踩坑预警:很多人装完 Git 忘了配邮箱就开始提交,结果 commit 记录里显示一个陌生名字,团队协同一脸尴尬。
三、创建本地仓库——两种方式,按需选择
方式 1:从零开始,新建一个空项目
场景:老板说"搞个新项目",你本地啥都没有。
# 1. 创建项目文件夹并进入 mkdir vue-demo cd vue-demo # 2. 一键初始化 Git 仓库 git init
输出:
Initialized empty Git repository in D:/code/vue-demo/.git/
这时候你的文件夹里多了一个隐藏的 .git 目录,这就是你的"版本保险柜"。
💡 老手习惯:
mkdir+cd+git init三步走,几乎是每个项目的起手式,形成肌肉记忆就行。
方式 2:从远程仓库拉下来(团队协作最常用)
场景:同事已经建好仓库了,你需要把代码 clone 到本地开发。
# 直接克隆 git clone https://gitee.com/xxx/vue-manage.git
执行后自动生成 vue-manage 文件夹,代码和 .git 都齐全。
# 克隆并自定义文件夹名称 git clone https://gitee.com/xxx/vue-manage.git admin-project
代码会下载到 admin-project 文件夹,适合你想自己命名项目目录的场景。
四、暂存、提交——你每天重复最多的操作
准备场景:项目里新建了 3 个文件:index.html、style.css、app.js
1. git status——"我改了啥?"
场景:开发到一半,想确认自己改了哪些文件,哪些还没提交。
git status
输出:
Untracked files: index.html style.css app.js
更推荐用简洁版:
git status --short
输出:
?? index.html ?? style.css ?? app.js
看懂这几个标记就行:
-
??= 新文件,Git 还不认识它 -
红色 = 修改了但没暂存
-
绿色 = 已暂存,等待提交
💡 老手习惯:写代码过程中随时
git status --short瞄一眼,养成"开发前先看看状态"的习惯,能避免很多低级错误。
2. git add——把修改"打包"准备提交
场景:代码改完了,告诉 Git "这些文件可以准备提交了"。
# 只添加一个文件 git add index.html # 添加某一类文件 git add *.js # 不管改了多少,全部打包(日常最常用 ✅) git add .
💡 小技巧:
git add .是日常用得最多的命令,写完代码直接一把梭,全放进去。那个.(点号)代表"当前目录下所有文件"。
⚠️ 踩坑预警:如果你没配好
.gitignore(后面会讲),git add .会把node_modules、.env这些不该提交的文件也加进去,很尴尬。
3. git commit——正式打个包,存进保险柜
场景:暂存区的文件准备好了,正式生成一个"版本快照"。
git commit -m "feat: 初始化首页html、样式、js基础文件"
输出示例:
3 files changed, 30 insertions(+) create mode 100644 index.html create mode 100644 style.css create mode 100644 app.js
进阶用法:修改已有文件后,跳过 add 直接提交
# -a 参数 = 自动 add 所有已跟踪文件的修改 git commit -am "fix: 调整首页文字排版"
💡 小技巧:
-am组合拳只对"已跟踪过的文件"有效。新建的文件还是得老老实实git add再commit。
后悔药:修改上一条 commit 的备注
git commit --amend -m "feat: 初始化首页基础页面结构与样式"
⚠️ 踩坑预警:
--amend只能在还没 push 到远程的时候用!已经推送到远程的 commit,别用这个,会搞乱历史。
4. git log——查看提交记录
场景:想看看之前都提交了什么,或者需要找到某个版本的 ID 来回退。
# 完整日志(信息很多,日常不太用) git log # 单行精简版(强烈推荐 ✅) git log --oneline
输出:
2f91ac3 (HEAD -> main) feat: 初始化首页基础页面结构与样式
前面的 2f91ac3 就是这次提交的唯一身份证号,回退版本就靠它。
# 图形化查看分支历史 git log --oneline --graph
💡 老手习惯:日常开发用
git log --oneline就够了。想更花哨可以加--graph --all看所有分支的提交图。
五、.gitignore——别让垃圾文件污染你的仓库
场景:项目跑起来后会产生各种日志文件、node_modules、IDE 缓存……这些东西不需要提交到仓库,但你 git add . 的时候它们会混进来。
.gitignore 就是告诉 Git:"这些文件,你别管。"
完整模板(直接复制用)
# 日志文件 *.log app.log error.log # 依赖文件夹 node_modules/ dist/ build/ # IDE 配置文件 .idea/ .vscode/ *.swp # 系统文件 .DS_Store Thumbs.db # 特殊:不忽略某个文件(取反语法) !important-config.js
💡 小技巧:不同语言/框架的
.gitignore模板不一样。推荐直接去 gitignore.io 生成,选你的技术栈就完事了。
已经误提交了怎么办?
假设 app.log 已经被你提交到仓库了,现在想忽略它:
# 只移除 Git 跟踪,本地文件保留不删 git rm --cached app.log git commit -m "chore: 忽略日志文件"
⚠️ 踩坑预警:
git rm(不带--cached)会同时删除本地文件!带--cached才是只取消跟踪。这个区别一定要记住。
六、撤销与回退——写错代码的后悔药
这部分是踩坑重灾区,我会把每个操作的风险说清楚。
场景 1:文件改乱了,想恢复到上次提交的版本
# 恢复单个文件 git checkout -- index.html # 恢复所有文件(一把梭) git checkout -- .
⚠️ 踩坑预警:这个操作是不可逆的!没提交的修改会直接消失。如果不确定要不要恢复,先
git stash存一下(后面讲)。
场景 2:已经 git add 了,但不想提交这些文件
# 取消单个文件的暂存 git reset HEAD index.html # 取消所有文件的暂存 git reset HEAD .
放心,这个操作不会删除你的文件修改,只是把它们从暂存区退回到工作区。
场景 3:版本回退(需要 commit ID)
先通过 git log --oneline 拿到要回退到的版本号,比如 2f91ac3。
# ① 软回退(safe):撤销 commit,但修改保留在暂存区 git reset --soft 2f91ac3 # ② 硬回退(危险⚠️):撤销 commit,未提交的修改全部清空! git reset --hard 2f91ac3 # 快速回退到上一个版本 git reset --hard HEAD~1
💡 记忆口诀:
--soft= 只撤销 commit,代码还在暂存区
--mixed(默认)= 撤销 commit + add,代码回到工作区
--hard= 全部清空,回到那个版本干干净净
⚠️ 踩坑预警:
git reset --hard是我见过最多人"翻车"的命令。已经执行了,没提交的修改就真没了。我的建议:执行前一定先git stash或git branch backup留个备份。
七、分支操作——团队协作的核心技能
为什么要用分支?
想象一下:你正在开发"登录页面",代码写了一半,突然线上出了个紧急 bug 要修。你总不能把半成品推上去吧?
分支就是让你"分身"——主线代码不受影响,你在自己的分支上随便折腾。
1. 查看、创建、切换分支
# 查看当前所有本地分支 git branch
输出:
* main
* 标记的就是你当前所在的分支。
# 创建并切换到新分支(新版 Git 推荐写法 ✅) git switch -c feat/login # 旧版写法(老项目常见) git checkout -b feat/login # 切回主分支 git switch main
💡 小技巧:分支命名建议用
feat/xxx(新功能)、fix/xxx(修复 bug)这种前缀,团队一眼就能看出这个分支是干嘛的。
2. 删除分支
# 安全删除(已合并到主分支的) git branch -d feat/login # 强制删除(未合并的,谨慎!) git branch -D feat/login
⚠️ 踩坑预警:
-D强制删除会丢失该分支上所有未合并的代码。删除前请三思。
3. 合并分支(merge)——完整实操
场景:登录功能开发完毕,要把代码合回主分支。
# 第一步:切回主分支 git switch main # 第二步:拉取远程最新代码(防止冲突) git pull origin main # 第三步:合并功能分支 git merge feat/login # 第四步:推送合并后的代码 git push origin main
4. 合并冲突怎么办?
合并时如果弹出了这样的提示:
Auto-merging index.html CONFLICT (content): Merge conflict in index.html
别慌!打开冲突文件,你会看到这样的标记:
<<<<<<< HEAD <h1>首页</h1> ======= <h1>登录页面</h1> >>>>>>> feat/login
怎么解决?
-
手动删掉
<<<<<<<、=======、>>>>>>>这些标记 -
保留你需要的代码(可以两边的都保留、也可以只留一边)
-
保存文件,然后:
git add . git commit -m "merge: 合并登录功能分支"
💡 老手习惯:冲突不复杂,本质就是"Git 不知道怎么选,让你来选"。多人协作冲突很正常,别怕。用 VSCode 的话,它自带冲突解决工具,点一点就能搞定。
5. rebase 变基——让提交历史更漂亮
场景:你开发了好几天,提交了很多次。合并前想把提交记录整理成一条线,看起来更清爽。
# 在功能分支上执行 git switch feat/login git rebase main
如果出现冲突,解决后继续:
git rebase --continue
中途反悔想放弃:
git rebase --abort
⚠️ 踩坑预警:rebase 会改写提交历史。已经 push 到远程的公共分支,千万别 rebase,否则队友会疯。记住:rebase 只用在本地私有分支上。
八、远程仓库——和团队同步代码
1. 查看和管理远程仓库
# 查看远程仓库地址 git remote -v
输出:
origin https://gitee.com/xxx/vue-demo.git (fetch) origin https://gitee.com/xxx/vue-demo.git (push)
origin 是远程仓库的默认别名,你可以理解为"远程仓库的昵称"。
# 本地新项目关联远程仓库 git remote add origin https://gitee.com/xxx/vue-demo.git # 更换远程仓库地址 git remote set-url origin git@gitee.com:xxx/vue-demo.git
2. 拉取代码
# fetch:只拉取,不合并(安全推荐 ✅) git fetch origin # pull:拉取 + 自动合并(方便但可能冲突) git pull origin main
💡 老手习惯:老手更喜欢先
fetch看看远程更新了什么,再手动merge,心里有数。pull=fetch+merge,省事但不够可控。
3. 推送代码
# 首次推送,-u 绑定远程关联(以后就能直接 git push) git push -u origin main # 之后日常推送,直接简写 git push # 推送功能分支到远程 git push origin feat/login
💡 小技巧:
-u只需要用一次。绑定后 Git 就记住了"我这个分支对应远程哪个分支",后面直接git push就行。
九、stash——代码写到一半,先藏起来
场景:你正在开发用户列表页面,代码写到一半——突然线上出了个紧急 bug 必须马上修。
你的半成品代码又不能 commit 上去(功能没写完啊),怎么办?
答案:用 stash 藏起来。
# 第一步:储藏当前所有未完成的修改,顺便写个备注 git stash save "临时储藏:用户列表页面开发一半" # 第二步:现在工作区干净了,切到别的分支修 bug 去 git switch main # …… 修 bug,提交,push …… # 第三步:切回原分支 git switch feat/user # 第四步:恢复之前藏起来的代码 git stash pop
其他 stash 相关操作:
# 查看所有储藏记录 git stash list
输出:
stash@{0}: On feat/user: 临时储藏:用户列表页面开发一半
💡 小技巧:
git stash pop= 恢复 + 删除记录。如果你想恢复但保留 stash 记录(比如还要在别的分支用),用git stash apply。
十、tag 版本标签——给项目打个"毕业照"
场景:项目 v1.0.0 正式上线了!你想在这个版本留个标记,以后能随时找到这个版本。
# 创建带备注的正式标签(推荐) git tag -a v1.0.0 -m "release 正式版本v1.0.0,完成首页、登录功能" # 查看所有标签 git tag # 输出:v1.0.0 # 推送标签到远程(标签不会自动随 push 上传!) git push origin v1.0.0
# 删除本地标签 git tag -d v1.0.0 # 删除远程标签 git push origin --delete v1.0.0
⚠️ 踩坑预警:很多人
git push完发现远程没有 tag——因为标签需要单独推送!要么git push origin v1.0.0推单个,要么git push origin --tags一次性推所有标签。
十一、两套完整开发流程——直接复制就能用
流程 1:新项目从零上传到远程仓库
# 1. 全局配置(只需一次) git config --global user.name "Li Hua" git config --global user.email "lihua@163.com" # 2. 创建项目并初始化 Git mkdir vue-admin cd vue-admin git init # 3. 写代码,配 .gitignore # (你的开发工作) # 4. 提交到本地仓库 git add . git commit -m "feat: 项目初始化基础框架" # 5. 关联远程仓库 git remote add origin https://gitee.com/xxx/vue-admin.git # 6. 推送到远程 git push -u origin main
流程 2:团队日常功能开发标准流程
# 1. 同步主分支最新代码 git switch main git pull origin main # 2. 创建功能分支 git switch -c feat/user-list # 3. 开发 & 多次提交 git add . git commit -m "feat: 用户列表页面基础布局" # ……继续开发,继续提交…… # 4. 推送功能分支到远程(给自己留个备份) git push origin feat/user-list # 5. 开发完成,合并到主分支 git switch main git pull origin main git merge feat/user-list git push origin main # 6. 清理已合并的分支 git branch -d feat/user-list git push origin --delete feat/user-list
💡 老手习惯:第 4 步推送功能分支不是必须的,但强烈建议做——万一本机硬盘挂了,远程至少还有个备份。
十二、Git 命令速查表(建议截图保存 📸)
| 场景 | 命令 | 备注 |
|---|---|---|
| 初始化本地仓库 | git init | 新项目第一步 |
| 克隆远程项目 | git clone <url> | 接手别人的项目 |
| 查看文件变更状态 | git status --short | 开发中最常用 |
| 全部文件加入暂存 | git add . | 注意那个点号 |
| 提交版本 | git commit -m "说明" | 写清楚改了什么 |
| 修改上次提交备注 | git commit --amend -m "新说明" | 仅限未 push |
| 查看提交记录 | git log --oneline | 精简版最实用 |
| 创建并切换分支 | git switch -c feat/xxx | 新功能开发 |
| 切回某个分支 | git switch main | |
| 合并分支 | git merge feat/xxx | 先切到目标分支再 merge |
| 拉取远程最新代码 | git pull origin main | 每天开始工作先拉一次 |
| 推送当前分支 | git push | 首次需要 -u |
| 储藏未完成代码 | git stash save "备注" | 紧急切分支时救命 |
| 恢复储藏的代码 | git stash pop | 恢复并删除记录 |
| 放弃本地修改 | git checkout -- . | ⚠️ 不可逆 |
| 取消暂存 | git reset HEAD . | 不影响文件内容 |
| 回退到上一版本 | git reset --hard HEAD~1 | ⚠️ 清空未提交代码 |
| 软回退(保留修改) | git reset --soft <id> | 安全的回退方式 |
| 打版本标签 | git tag -a v1.0.0 -m "说明" | 上线必备 |
| 推送标签 | git push origin v1.0.0 | 标签需要单独推 |
| 忽略文件配置 | 编辑 .gitignore | 项目初始化就做 |
| 查看远程仓库 | git remote -v | |
| 关联远程仓库 | git remote add origin <url> | |
| rebase 整理历史 | git rebase main | ⚠️ 仅限私有分支 |
🚀 下一步学什么?
恭喜你看完这 30 个命令,日常开发场景基本够用了。如果你想继续进阶:
-
Git 分支策略——了解 Git Flow、GitHub Flow,知道大团队怎么管理分支
-
Rebase vs Merge 的选择——什么时候该 merge,什么时候该 rebase
-
交互式 Rebase(
git rebase -i)——把一堆零碎提交整理成漂亮的提交历史 -
Git Hooks——在 commit 前自动跑代码检查、格式化
-
推荐工具:VSCode 的 GitLens 插件,能让你看到每一行代码是谁写的、什么时候改的,非常强大
❤️ 最后
Git 这东西,命令不难,难的是在对的场景用对的命令。
这篇文章里的每一个命令,我都配了真实场景和踩坑提醒。建议你先收藏,遇到问题回来翻一翻,用几次就形成肌肉记忆了。
觉得有用的话,转发给你的同事朋友吧——独乐乐不如众乐乐 😄

586

被折叠的 条评论
为什么被折叠?



