一、Git 是什么?核心概念先搞懂
| 概念 | 通俗解释 |
|---|---|
| Git | 分布式版本控制系统,给代码"拍快照",随时可以回到过去任何一个版本 |
| **工作区(Working Directory)** | 在电脑里能看到的文件夹(比如 website-example/) |
| **暂存区(Staging Area / Index)** | 放在 .git/index 里,是"准备存档"的文件清单 |
| **版本库(Repository)** | .git/ 目录,Git 的"大脑",存着所有快照和历史 |
| **远程仓库(Remote)** | 云端仓库(如 Gitee/GitHub),团队成员共享代码的地方 |
| **分支(Branch)** | 一条独立的开发时间线,相当于"平行宇宙" |
| HEAD | 一个指针,指向你当前所在的位置(哪个分支/哪个提交) |
⚠️ 易错点 1:.git 目录是禁区!
踩过这个坑:进了 .git 目录执行 git status,报了 fatal: this operation must be run in a work tree。
原因 :
.git/是版本库的元数据目录,不是工作区。Git 的大部分命令(status、add、commit 等)必须在工作区(放代码文件的地方)运行。
✅ 正确做法 :cd .. 退出来再操作。
二、安装与初始配置
2.1 安装
# Linux(如 Fedora/CentOS 8+)
dnf install git
Windows 用户直接下载安装 Git for Windows。
2.2 配置用户信息
你今天踩的坑 :第一次 git commit 时报 Author identity unknown。
git config --global user.name "dai"
git config --global user.email "17338776436@163.com"
| 参数 | 作用 |
|---|---|
--global |
全局配置,这台电脑上所有仓库都生效。去掉 --global 则只对当前仓库生效 |
✅ 验证配置:
git config --list
2.3 记住账号密码(不用每次输 Token)
你开了 Gitee 的 2FA(双因素认证),每次 push 都要输私人令牌。可以配置缓存:
# Windows:凭据存入系统(推荐)
git config --global credential.helper wincred
# 或者简单 store(明文存到文件,不太安全)
git config --global credential.helper store
配置后第一次
git pull/push输入一次,以后就不用再输了。
2.4 SSH 公钥配置(一劳永逸,推荐)
配好 SSH 后,再也不用手输密码/令牌:
# 1. 生成 SSH Key(一路回车3次)
ssh-keygen -t rsa -c "17338776436@163.com"
# 2. 查看公钥内容,复制
cat ~/.ssh/id_rsa.pub
# 3. 去 Gitee → 头像 → 设置 → SSH 公钥 → 粘贴进去
# 4. 测试连接
ssh -T git@gitee.com
# 看到 "Hi xxx! You've successfully authenticated" 就成功了
然后把远程地址从 HTTPS 换成 SSH:
git remote set-url origin git@gitee.com:dai-yonghao/git.git
三、仓库操作(创建、克隆、远程管理)
3.1 初始化新仓库 git init
git init
执行后会在当前目录创建 .git/ 子目录。
⚠️ 易错点 2:别在 Git 安装目录里 git init!
你今天在 C:\Program Files\Git\` 下执行了git init`,导致 Git 把软件自身的文件当成了项目文件。
✅ 正确做法 :去桌面或 D 盘新建文件夹再 git init:
cd /d/my_project/website-example
git init
3.2 克隆远程仓库 git clone
git clone https://gitee.com/dai-yonghao/git.git
这会把远程仓库完整下载到本地,并且自动 把源地址命名为 origin。
3.3 远程仓库管理
| 操作 | 命令 |
|---|---|
| 查看远程地址 | git remote -v |
| 添加远程 | git remote add origin https://xxx.git |
| 修改远程地址 | git remote set-url origin https://新地址.git |
| 删除远程 | git remote rm origin |
⚠️ 易错点 3:remote origin already exists
遇到的报错。因为之前 clone 下来时已经有 origin 了,不能重复 add。
✅ 解决 :用 set-url 修改,而不是 add:
git remote set-url origin https://gitee.com/dai-yonghao/git.git
💡 origin 不是用户! 它只是远程仓库地址的别名 (外号)。你可以叫它 gitee、abc 都行,只是大家习惯用 origin。
四、日常三板斧:add → commit → push
4.1 查看状态 git status
git status
| 输出含义 | 解释 |
|---|---|
Untracked files |
新文件,Git 还没跟踪 |
Changes not staged for commit |
已跟踪的文件被修改了,但没放进暂存区 |
Changes to be committed |
已放进暂存区,准备提交 |
nothing to commit, working tree clean |
工作区干净,没东西要提交 ✅ |
4.2 添加到暂存区 git add
git add index.html # 添加单个文件
git add . # 添加当前目录所有改动(最常用)
git add -A # 添加所有改动(包括删除的文件)
4.3 提交到仓库 git commit
git commit -m "在首页标题加了Hello Git"
⚠️ 易错点 4:提交信息写 ?
写了 git commit -m "?"。功能上没问题,但以后翻历史会一脸懵。
✅ 好的提交信息:用祈使句,清晰描述改了什么:
git commit -m "修复首页导航栏在移动端错位的问题"
✅ 改掉上一次的提交信息(还没 push 的情况下):
git commit --amend -m "新的备注信息"
4.4 推送到远程 git push
git push origin master
# 第一次推送加 -u,以后直接 git push 就行
git push -u origin master
⚠️ 易错点 5:push 被拒绝 non-fast-forward
遇到的:! [rejected] master -> master (non-fast-forward)。
原因:远程仓库有你本地没有的新文件(比如你在网页上创建了 README.md),Git 不允许直接覆盖。
✅ 解决:先拉取合并,再推送:
git pull origin master --allow-unrelated-histories
# 如果有冲突就手动解决,然后:
git push -u origin master
⚠️ 易错点 6:合并时卡在 MERGING 状态
pull 后提示符变成了 (master|MERGING),说明合并还没完成。
✅ 解决:
- 如果没有冲突:
git commit -m "合并远程内容"完成合并 - 如果有冲突:打开冲突文件,删掉
<<<<<<<、=======、>>>>>>>标记,然后git add 文件名→git commit - 想放弃合并:
git merge --abort
五、拉取更新 git pull
git pull origin master
git pull=git fetch(下载) +git merge(合并)
⚠️ 双因素认证(2FA)下的 push/pull
遇到的:Gitee 开启了 2FA 后,密码框不能输登录密码 ,必须输 私人令牌(Private Token)。
获取路径:Gitee → 头像 → 设置 → 安全设置 → 私人令牌 → 生成 → 复制保存。
六、分支管理(Git 最强大的功能)
6.1 查看分支
git branch
# 输出:
# dev
# * master ← 当前所在分支(带 * 号)
6.2 创建并切换分支
git checkout -b dev # 老方法(你今天用的)
git switch -c dev # 新方法(更直观)
6.3 切换分支
git checkout master
git switch master
⚠️ 易错点 7:切换分支前工作区必须干净
如果有未提交的修改,Git 会拒绝切换(或把修改带到新分支)。先 git stash 暂存或 git commit。
6.4 合并分支
git checkout master # 先切回要合并到的目标分支
git merge dev # 把 dev 的改动合并到 master
6.5 删除分支
git branch -d dev # 已合并的分支
git branch -D dev # 强制删除(未合并也删)
七、版本回退与撤销(时光机)
7.1 查看历史 git log
git log # 完整历史(从新到旧)
git log --oneline # 简洁版(一行一个)
git log --reverse # 从旧到新
git log --all --graph --decorate # 图形化分支树
7.2 回退到指定版本
git reset --hard HEAD^ # 回退到上一个版本
git reset --hard HEAD^^ # 回退到上上个版本
git reset --hard bc6c877 # 回退到指定 commit
⚠️ 易错点 8:reset --hard 很危险!
它会丢弃所有未提交的修改和之后的提交 。新手慎用。不过 Git 里东西不会立刻消失,可以用 git reflog 找回来。
7.3 查看所有操作记录(后悔药)
git reflog
# 找到你想回去的 commit ID,然后:
git reset --hard 1094a
7.4 撤销工作区修改
git restore index.html # 新命令(推荐)
git checkout -- index.html # 老命令
效果:把文件恢复到最近一次 git commit 或 git add 时的状态。
7.5 撤销暂存区(取消 git add)
git restore --staged index.html
7.6 暂存未提交的修改
git stash # 把当前未提交的改动"藏"起来,工作区变干净
git stash pop # 把藏起来的改动恢复回来
八、标签与发布(Tag & Release)
8.1 创建标签
git tag v1.0.0 # 轻量级标签
git tag -a v1.0.0 -m "发布版本1.0.0" # 附注标签(推荐)
8.2 查看标签
git tag # 列出所有标签
git show v1.0.0 # 查看标签详情
8.3 推送标签
git push origin v1.0.0 # 推送单个标签
git push origin --tags # 推送所有标签
8.4 根据标签拉取代码
git fetch --all
git checkout v1.0.0
# 如果想从这个标签开始新分支:
git checkout -b hotfix-v1.0.0 v1.0.0
8.5 发布 Release
- 打标签 → 推送标签
- 去 Gitee/GitHub 仓库页面 → Releases → Draft a new release
- 选择标签 → 写发布说明 → Publish
九、踩过的所有坑 · 终极总结
| # | 坑 | 原因 | 正确做法 |
|---|---|---|---|
| 1 | 在 .git 里执行 git status 报 fatal |
.git 是版本库,不是工作区 |
cd .. 退出来 |
| 2 | 在 Git 安装目录 git init |
把软件文件当项目文件 | 去桌面/D盘新建文件夹再 init |
| 3 | remote origin already exists |
已存在同名远程,不能重复 add | 用 git remote set-url |
| 4 | git commit -m "?" |
提交信息无意义 | 写清楚改了什么 |
| 5 | git log --online 报错 |
拼错了,是 --oneline |
记住多一个 L |
| 6 | push 被拒 non-fast-forward |
远程有新内容,本地没有 | 先 git pull --allow-unrelated-histories |
| 7 | 卡在 MERGING 状态 |
合并没完成 | 解决冲突 → add → commit,或 git merge --abort |
| 8 | push 时密码不对 | 开了 2FA,不能用登录密码 | 用私人令牌(Token) |
| 9 | 嵌套仓库只提交了指针 | 外层 git add 了带 .git 的文件夹 |
直接在子仓库里操作,或用 submodule |
| 10 | 以为 origin 是用户 |
它是远程地址的别名 | 可以随时改名 |
十、Git 命令速查表
| 类型 | 命令 | 说明 |
|---|---|---|
| 核心操作 | git init |
初始化仓库 |
git clone <url> |
克隆远程仓库 | |
git status |
查看状态 | |
git add <file> / git add . |
添加到暂存区 | |
git commit -m "msg" |
提交到本地仓库 | |
git diff |
查看工作区和暂存区的差异 | |
git restore <file> |
撤销工作区修改 | |
git restore --staged <file> |
撤销暂存 | |
| 分支 | git branch |
查看分支 |
git checkout -b <name> |
创建并切换分支 | |
git switch -c <name> |
创建并切换分支(新) | |
git merge <branch> |
合并分支 | |
git branch -d <name> |
删除分支 | |
| 远程 | git remote -v |
查看远程地址 |
git remote add <name> <url> |
添加远程 | |
git remote set-url <name> <url> |
修改远程地址 | |
git push [-u] origin <branch> |
推送 | |
git pull origin <branch> |
拉取并合并 | |
git fetch |
只下载不合并 | |
| 历史 | git log [--oneline] |
查看提交历史 |
git reflog |
查看所有操作记录 | |
git show <commit> |
查看某次提交详情 | |
| 撤销 | git reset --hard <commit> |
回退到指定版本 |
git revert <commit> |
撤销某次提交(安全) | |
git stash / git stash pop |
暂存/恢复 | |
| 标签 | git tag -a v1.0 -m "msg" |
创建附注标签 |
git push origin --tags |
推送标签 |
十一、推荐你的日常开发流程
# 1. 开始工作前,先拉最新代码
git pull
# 2. 新建分支做功能(不要直接在 master 上改)
git checkout -b my-feature
# 3. 改代码 → 看状态 → 暂存 → 提交
git status
git add .
git commit -m "完成了XXX功能"
# 4. 推送到远程
git push -u origin my-feature
# 5. 在 Gitee/GitHub 上发起 Pull Request / Merge Request
# 6. 审核通过后合并到 master
# 7. 切回 master,拉取最新
git checkout master
git pull