Git 版本控制完整学习笔记

一、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 不是用户! ​ 它只是远程仓库地址的别名 (外号)。你可以叫它 giteeabc 都行,只是大家习惯用 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 commitgit 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

  1. 打标签 → 推送标签
  2. 去 Gitee/GitHub 仓库页面 → Releases → Draft a new release
  3. 选择标签 → 写发布说明 → 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
相关推荐
明王明王1 小时前
从零搭建一个单节点 K8S 可观测实验室(十三):总结——这个实验室如何服务工作、学习和开源项目
学习·kubernetes·开源
Romantic_love_1 小时前
理解USART真实收发过程
开发语言·stm32·单片机·学习
MartinYeung51 小时前
[论文学习]潜伏代理:训练能够经受安全训练的欺骗性大语言模型深度分析
学习·安全·语言模型
撩得Android一次心动1 小时前
Kotlin 语言【知识点整理3】
java·开发语言·笔记·学习·kotlin
Source.Liu1 小时前
【Dioxus】Dioxus CLI (dx) 命令笔记
笔记·rust·dioxus
CarIise2 小时前
JavaScript基础语法与DOM操作实战课堂笔记
开发语言·javascript·笔记
pluviophile_s2 小时前
数据结构:第7讲:图
数据结构·笔记
疯狂打码的少年2 小时前
【数据库技术】数据库三级模式结构(外模式/模式/内模式)
数据库·笔记·oracle
石头猫灯2 小时前
一次 CMS 被黑实录:完整事件思路梳理
android·学习