💡 个人学习背景:
很早之前了解 GitHub 时,就对 Git 有了初步印象,但因不涉及前端、后端方向,一直没有实际使用场景,加上有一定学习门槛,所以未深入学习。
之前维护个人博客版本,也只是简单复制粘贴打包,直到有 Codex 等编程 CLI 工具协助,降低了学习和使用成本,才开始用 Git 管理项目代码托管、版本控制,特此整理常用知识点,方便后续查阅复习。
📌 文章说明:这是一份面向日常开发(个人 + 团队)的 Git 实用笔记,涵盖常见操作、作用、命令示例及问题排查,重点突出高频用法,适合新手入门和日常查阅。
一、Git 是什么? 🤔
Git 是一个 分布式版本控制系统,核心作用是记录代码的变更历史,支持多人协作开发,解决“代码修改回退、多人开发冲突、改动追溯”等问题。
✅ 通俗理解(好记不绕):
⏳ 一个“可回退”的时间机器:改乱代码、删错文件,能随时回到之前的正确版本
👥 一个“可并行开发”的协作工具:多人同时开发不同功能,互不干扰,最后轻松整合
🔍 一个“可追踪”的审计系统:每一次修改都能查到“谁改的、什么时候改的、改了什么”
🌟 核心价值(必记):
代码改错 / 删错 → 可回退
多人同时开发 → 不互相覆盖
所有改动 → 可追溯、可审计
二、Git 三个核心区域🚨
日常所有 Git 操作,都围绕这三个区域展开,搞懂它们,就能理清 80% 的 Git 逻辑。
工作区(Working Directory) 📝
就是你当前正在编辑的文件目录(比如电脑里的项目文件夹)
特点:改了文件但没执行
git add时,所有改动都只在工作区,Git 还没“记录”这些改动
暂存区(Staging Area / Index) 📦
相当于“提交缓冲区”,通过
git add命令,选择“本次要提交的改动”特点:可以精确控制提交内容(比如只提交部分文件的改动),避免一次性提交所有修改
本地仓库(Local Repository) 💾
通过
git commit命令,把暂存区的内容“快照”保存到本地仓库,形成一次提交记录特点:提交后,改动就被永久记录在本地(电脑里),即使关闭软件也不会丢失
�补充:远程仓库(Remote Repository) 🌐 就是 GitHub、GitLab 等平台上的仓库,相当于“云端备份 / 共享中心”,通过 git push(上传)、git pull(下载)和本地仓库同步,方便多人共享代码。
2.1 关键概念速览
提交(Commit) 📸 - 概念:一次代码快照,记录某个时间点“被暂存的所有改动” - 理解:像游戏里的“存档点”,每一次提交都有唯一的 ID(哈希值),后续可通过这个 ID 回退到该版本
分支(Branch) 🌿 - 概念:指向一串提交历史的“轻量指针”(不是复制整个项目,占用空间极小) - 理解:相当于“并行开发轨道”,比如在
main(主分支)之外,新建feature/xxx(功能分支)开发新功能,不影响主分支的稳定代码推送(Push) 📤 - 概念:把本地分支的新提交,上传到远程仓库 - 注意:只有
push后,团队成员和代码托管平台(如 GitHub)才能看到你的最新改动拉取(Pull) 📥 - 概念:把远程仓库的最新更新,同步到本地并合并到当前分支 - 建议:开始开发前先
pull,避免基于旧代码开发,导致后续冲突合并(Merge) 🧩 - 概念:把一个分支的改动,整合到另一个分支(比如功能开发完成后,把功能分支合并回主分支) - 注意:合并时可能出现冲突,这是正常现象,不是错误
三、初始化与克隆
3.1 初始化本地仓库(从0创建)
🔧 作用:把当前电脑上的文件夹,变成 Git 可管理的仓库(会生成隐藏的 .git 目录,存储 Git 配置和历史记录)
git init✨ 常用优化写法(直接指定主分支名为main,避免默认分支名混乱):
git init -b main3.2 克隆远程仓库(下载已有项目)
🔧 作用:把 GitHub/GitLab 上的远程项目,完整下载到本地,同时自动配置远程仓库地址(后续可直接 push/pull)
git clone https://github.com/username/repo.git💡 说明:把命令中的 username 换成自己的 GitHub 用户名,repo 换成仓库名即可。
四、状态检查与历史查看
4.1 查看当前状态(最常用!)
🔧 作用:查看文件处于什么状态(未跟踪、已修改、已暂存),排查问题的首选命令
git status✨ 简洁模式(只显示关键信息,不冗余):
git status --short4.2 查看提交历史
🔧 作用:查看所有提交记录(谁提交的、时间、提交信息、哈希 ID)
git log✨ 更常用写法(简洁显示 + 图形化分支关系,一目了然):
git log --oneline --graph --decorate --all4.3 查看某次提交具体内容
🔧 作用:查看某一次提交,具体修改了哪些内容(需用到提交的哈希 ID,可通过 git log 获取)
git show <commit_id>💡 示例:git show a1b2c3d(哈希 ID 可只写前几位,只要能唯一识别即可)
五、提交代码
概念提示:提交(commit)是“保存本地历史”,推送(push)是“同步到远程”。也就是说,commit 完成后,代码只在你的电脑上;只有 push 后,才会同步到 GitHub 等平台。
5.1 添加改动到暂存区
🔧 作用:告诉 Git,哪些改动要纳入下一次提交(相当于“选中”要保存的内容)
git add <file>✨ 常用写法(添加当前目录下的所有改动,不用逐个文件添加):
git add .5.2 提交改动(本地存档)
🔧 作用:把暂存区的改动,保存为一次历史快照(提交记录),必须写提交信息,说明本次改了什么
git commit -m "fix: 修复移动端菜单滚动后失效"5.3 推送到远程(云端同步)
🔧 作用:把本地的提交记录,上传到远程仓库(如 GitHub),供团队成员查看或共享
📌 首次推送(需要建立本地分支和远程分支的跟踪关系):
git push -u origin main📌 后续推送(已建立跟踪关系,直接推送即可):
git push💡 说明: - origin:默认的远程仓库名(Git 自动命名,通常指向你克隆 / 添加的远程仓库地址) - main:要推送的分支名(如果是功能分支,就换成 feature/xxx) - -u:建立跟踪关系,后续推送该分支时,不用再写 origin main
六、分支管理(多人协作核心)
概念提示:分支不是“复制一份项目”,而是“指向提交链的轻量指针”,所以创建、切换分支的速度非常快,几乎不占用额外空间。
6.1 查看分支
git branch # 查看本地所有分支(当前分支前会有 * 标记)git branch -a # 查看本地 + 远程所有分支6.2 创建并切换分支(常用)
🔧 作用:一次性完成“创建分支 + 切换到该分支”,避免先创建再切换的麻烦
git switch -c feature/archive-fix🔍 兼容写法(旧版本 Git 可用):
git checkout -b feature/archive-fix💡 命名规范:功能分支建议用feature/功能名,修复分支用 fix/问题描述,便于区分。
6.3 切换分支
git switch main🔍 兼容写法:git checkout main
6.4 删除分支
🔧 作用:删除不需要的分支(建议功能合并后再删除,避免误删)
git branch -d feature/archive-fix # 只有该分支已合并到主分支,才能删除git branch -D feature/archive-fix # 强制删除,无论是否合并(谨慎使用)⚠️ 补充: 1. 本地删除分支,不会影响远程分支(远程分支需要单独删除) 2. 删除远程分支命令:git push origin --delete <分支名>
七、拉取、抓取与同步
核心区别: - fetch = 只下载远程更新,不修改你当前的代码(安全,适合先观察差异) - pull = fetch + merge/rebase,会直接修改当前分支的代码(方便,但可能出现冲突)
7.1 拉取远程并合并(常用)
git pull🔧 作用:相当于先执行 git fetch(下载远程更新),再执行 git merge(合并到当前分支),一步到位。
7.2 只抓取不合并(安全)
git fetch🔧 作用:仅下载远程仓库的最新更新,更新本地的远程分支信息,但不修改你当前正在编辑的代码,适合先查看远程有哪些改动,再决定如何合并。
7.3 查看本地与远程差异
git diff origin/main...HEAD💡 建议:团队协作中,遇到复杂改动时,优先执行git fetch + git diff,确认远程改动不会和自己的代码冲突后,再执行 git pull。
八、查看差异(Diff,排查改动)
🔧 作用:查看不同区域之间的代码差异,确认改动内容,避免误提交。
8.1 工作区 vs 暂存区
git diff📌 说明:查看“已修改但未暂存”的内容(即工作区比暂存区多的改动)。
8.2 暂存区 vs 最近提交
git diff --cached📌 说明:查看“已暂存但未提交”的内容(即暂存区比本地仓库最近一次提交多的改动),提交前建议执行,确认提交内容无误。
8.3 两次提交之间
git diff <commit1> <commit2>📌 说明:查看两次提交之间的所有改动,commit1 和 commit2 是两次提交的哈希 ID(可通过 git log 获取)。
九、撤销与恢复(高频且谨慎!⚠️)
Git 的撤销功能很强大,但部分操作会永久删除改动,一定要谨慎使用,不确定时先执行 git status 或git log 确认。
9.1 撤销工作区改动(未暂存,安全)
🔧 作用:把“已修改但未暂存”的文件,恢复到和暂存区一致的状态(相当于放弃当前工作区的改动)
git restore <file>📌 示例:git restore index.html,恢复 index.html 文件的工作区改动。
9.2 取消暂存(保留工作区,安全)
🔧 作用:把“已暂存”的文件,恢复到“未暂存”状态,但保留工作区的改动(相当于“取消选中”要提交的内容)
git restore --staged <file>9.3 回退提交(保留改动,较安全)
🔧 作用:把本地仓库的提交回退到指定版本,但保留改动(改动会回到暂存区),可重新修改后提交
git reset --soft <commit_id>9.4 回退提交并丢弃改动(危险!)
🔧 作用:把本地仓库回退到指定版本,并且永久丢弃该版本之后的所有改动(包括工作区和暂存区),无法恢复!
git reset --hard <commit_id>警告:除非确认这些改动完全不需要,否则绝对不要用 git reset --hard!
9.5 找回误操作历史(救命稻草)
🔧 作用:查看 Git 所有操作记录(包括已删除的提交、误 reset 的操作),可通过记录找回丢失的代码
git reflog💡 用法:执行后会显示所有操作的历史记录,找到要恢复的操作对应的哈希 ID,执行 git reset --soft <commit_id> 即可恢复。
十、合并与冲突处理(团队协作常见场景)
重要提示:冲突不是错误,而是 Git 无法自动判断“同一位置的两份改动该保留哪一份”,手动处理即可。
10.1 合并分支
🔧 作用:把一个分支的改动,整合到另一个分支(比如功能开发完成后,把 feature 分支合并到 main 分支)
git switch main # 先切换到要合并到的目标分支(如 main)
git merge feature/archive-fix # 合并 feature/archive-fix 分支到 main10.2 冲突处理流程(必学)
合并时出现冲突,Git 会提示“conflict in <file>”,此时文件会出现冲突标记
打开冲突文件,找到标记区域(格式如下),手动编辑:
<<<<<<< HEAD # 当前分支(main)的内容 这是 main 分支的代码 ======= # 要合并的分支(feature)的内容 这是 feature 分支的代码 >>>>>>> feature/archive-fix # 要合并的分支名编辑原则:保留需要的内容,删除冲突标记(<<<<<<<、=======、>>>>>>>)保存文件后,执行以下命令,完成合并:
git add <conflict-file> # 把处理好的冲突文件加入暂存区 git commit # 提交合并结果(无需写 -m,Git 会自动生成合并信息)
10.3 放弃本次合并
🔧 作用:如果冲突处理不了,或者不想合并了,放弃本次合并,恢复到合并前的状态
git merge --abort十一、远程仓库管理
11.1 查看远程仓库信息
🔧 作用:查看当前本地仓库关联的远程仓库地址(确认是否正确)
git remote -v11.2 添加远程仓库
🔧 作用:把本地仓库和远程仓库(如 GitHub 新建的仓库)关联起来,后续可直接 push/pull
git remote add origin https://github.com/username/repo.git11.3 修改远程仓库地址
🔧 作用:远程仓库地址变更(如仓库迁移、域名变更)时,修改本地关联的远程地址
git remote set-url origin https://github.com/username/new-repo.git十二、提交信息规范(推荐,提升可读性)
📌 建议使用“约定式提交”,给提交信息加前缀,让日志更清晰,方便后续追溯和排查问题,团队协作时更规范。
常用前缀及含义:
feat:新功能(如:feat: 新增用户登录功能)fix:修复问题(如:fix: 修复移动端登录按钮失效)docs:文档变更(如:docs: 完善 Git 笔记)refactor:重构(不改变功能,优化代码结构)style:格式调整(不改变逻辑,如缩进、空格)test:测试相关(新增 / 修改测试用例)chore:构建 / 配置 / 杂项(如:chore: 更新依赖)
✅ 示例:
fix: 修复手机端归档卡片横向溢出
docs: 新增 Git 使用指南文档
chore: 更新构建产物与依赖锁文件十三、日常推荐工作流(团队协作版)
📌 按以下流程操作,可减少冲突,规范协作,适合大多数团队场景:
更新主分支(确保本地主分支是最新版本):
git switch main git pull创建功能分支(基于最新主分支,避免基于旧代码开发):
git switch -c feature/mobile-menu-fix开发并提交(多次小提交,不要一次性提交大量改动,便于回滚):
git add . git commit -m "fix: stabilize mobile menu after scroll"推送远程分支(同步到云端,方便团队查看):
git push -u origin feature/mobile-menu-fix发起 PR(Pull Request),等待代码评审,评审通过后合并到
main分支
十四、常见问题与排查(避坑指南)
14.1 为什么 git push 被拒绝?
🔍 常见原因:
远程仓库有新提交,你的本地分支落后于远程分支(最常见)
权限不足(GitHub Token 权限不够,或未登录)
推送的是受保护分支(如 main),有推送策略限制
✅ 处理思路(最常用):
git pull --rebase # 拉取远程更新,并以变基方式合并(避免生成多余的合并提交)
git push14.2 为什么有些文件不想提交?(如日志、依赖包)
✅ 解决方案:创建 .gitignore 文件,把不需要提交的文件 / 目录写进去,Git 会自动忽略这些文件。
📌 常用 .gitignore 示例:
node_modules/ # 依赖包目录
dist/ # 构建产物目录
*.log # 所有日志文件
.env # 环境变量文件(含密钥,绝对不能提交)
tmp_*.html # 临时文件14.3 已经被跟踪的文件,加入 .gitignore 也无效?
🔍 原因:Git 会持续跟踪已经添加过的文件,即使后续加入 .gitignore,也不会自动停止跟踪。
✅ 处理命令:
git rm -r --cached <path> # 停止跟踪指定文件/目录,不删除本地文件
git add . # 更新暂存区
git commit -m "chore: stop tracking ignored files" # 提交变更📌 示例:git rm -r --cached node_modules,停止跟踪 node_modules 目录。
14.4 如何确认本次提交具体包含哪些内容?
✅ 两步确认(提交前必做,避免误提交):
git status # 查看哪些文件被修改、被暂存
git diff --cached # 查看暂存区的具体改动内容十五、安全与最佳实践(避坑重点)
❌ 绝对不要提交密钥、令牌、账号密码(如
.env、credentials.json),避免信息泄露❌ 谨慎使用
git reset --hard和git push --force(强制推送),前者会丢失改动,后者可能覆盖远程仓库的代码✅ 重要变更前,先创建分支,不要直接在 main 分支上开发
✅ 提交前自检:执行
git status、git diff --cached,确认改动无误;必要时运行测试 / 构建,避免提交错误代码✅ 一次提交聚焦一件事(如只修复一个 bug、只新增一个小功能),便于后续回滚和代码评审
十六、速查命令清单(高频常用,贴在桌面!)
git status # 查看当前状态(最常用)
git add . # 添加所有改动到暂存区
git commit -m "message" # 提交改动
git push # 推送到远程
git pull # 拉取远程更新
git log --oneline --graph --decorate # 查看简洁的提交历史(带分支图形)
git diff # 查看工作区与暂存区差异
git diff --cached # 查看暂存区与最近提交差异
git switch -c feature/xxx # 创建并切换分支
git restore <file> # 撤销工作区改动
git restore --staged <file> # 取消暂存
git reflog # 查看所有操作历史(找回误删内容)📝 学习总结:Git 核心是“三个区域 + 分支管理”,日常使用记住“提交→推送→拉取”的基本流程,遇到问题先查 git status 和 git log,多练几次高频操作就能熟练掌握。后续遇到新的场景,再补充对应的知识点即可。