Git 全面学习笔记
一、Git 基础概念
1.1 什么是 Git?
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。它能记录文件的历史变更,方便多人协作开发,同时支持离线工作,核心特点包括:
-
分布式:每个开发者都拥有完整的代码仓库副本,无需依赖中央服务器
-
版本控制:追踪文件每一次修改,可随时回滚到历史版本
-
分支管理:轻量级分支操作,支持并行开发与功能隔离
1.2 核心工作区域
Git 工作流程涉及四个核心区域,文件在这些区域间流转:
-
工作区 (Working Directory):实际操作的文件目录,日常编辑的文件存放于此
-
暂存区 (Stage/Index):通过 add 临时存放待提交的修改,相当于 "变更缓冲区"
-
本地仓库 (Local Repository):存储完整的版本历史,通过 commit 命令将暂存区内容提交至此
-
远程仓库(Remote Repository):托管在服务器上的仓库(如 GitHub、GitLab),用于团队协作共享
二、Git 环境配置
2.1 安装 Git
- Windows:从 Git 官网 下载安装包,勾选 "Git Bash Here" 方便右键调用
- macOS:使用 Homebrew 安装
brew install git,或通过官网下载 - Linux:Debian 系列
sudo apt-get install git,RedHat 系列sudo yum install git
2.2 基础配置(首次使用必做)
bash
# 配置用户名(与远程仓库账号一致)
git config --global user.name "Your Name"
# 配置邮箱(与远程仓库绑定邮箱一致)
git config --global user.email "your.email@example.com"
# 查看配置信息
git config --list
三、Git 仓库操作(初始化与克隆)
| 命令 | 作用 | 示例 |
|---|---|---|
| git init | 在当前目录初始化本地仓库 | git init my-project |
| git clone <url> | 克隆远程仓库到本地 | git clone github.com/username/re... |
| git clone <url> <name> | 克隆并自定义本地仓库名 | git clone github.com/username/re... my-repo |
四、文件状态管理与撤销操作
4.1 查看文件状态
bash
# 查看详细状态(显示已修改/未跟踪/已暂存文件)
git status
# 简化状态显示(红色:修改未暂存;绿色:已暂存)
git status -s
# 查看文件修改详情
git diff
4.2 add 暂存与 commit 提交
bash
# 将单个文件添加到暂存区
git add filename.txt
# 将当前目录所有修改添加到暂存区
git add .
# 将暂存区内容提交到本地仓库(必须填写提交信息)
git commit -m "feat: 新增用户登录功能"
# 跳过暂存区,直接提交已跟踪文件的修改
git commit -a -m "fix: 修复登录表单验证bug"
# 修改最近一次提交(适用于补充修改或修正提交信息)
git commit --amend
4.3 撤销操作
bash
# 撤销工作区修改(未暂存的文件,谨慎使用!会丢失未提交修改)
git checkout -- filename.txt
# 撤销暂存区修改(将文件从暂存区放回工作区)
git reset HEAD filename.txt
# 删除文件并暂存删除操作
git rm <文件名>
# 保留文件并暂存删除操作
git rm --cached <文件名>
# 移动/重命名文件并暂存修改
git mv <旧文件名> <新文件名>
# 撤销提交(只撤commit,保留add)
git reset HEAD~ --soft
# 撤销提交(撤commit和add,保留代码)
git reset HEAD~
# 撤销提交(全部撤回上次提交)
git reset HEAD~ --hard
4.4 reset 命令与 HEAD 引用
4.4.1 HEAD 引用说明
-
HEAD:指向当前分支的最新提交
-
HEAD~:上一个提交,HEAD~~ 上上个提交,以此类推
- 可简写为HEAD~n:往前第 n 个提交
4.4.2 git reset 的三种模式
bash
# --soft:仅移动 HEAD,暂存区和工作区不变
git reset --soft <提交ID/HEAD引用>
# --mixed(默认):移动 HEAD,重置暂存区,工作区不变
git reset <提交ID/HEAD引用>
# --hard:移动 HEAD,重置暂存区和工作区(慎用,会丢失未提交修改)
git reset --hard <提交ID/HEAD引用>
五、提交流程与历史查看
5.1 完整提交流程
-
查看修改:
git status -
暂存文件:
git add <文件名>或git add . -
提交到本地仓库:
git commit -m "提交说明" -
补充提交(修正上一次提交):
git commit --amend
正向详细流程图(不涉及reset等回退):
正向简要图(不涉及reset):
5.2 查看提交历史
bash
# 查看完整提交历史(按时间倒序,最新在前)
git log
# 简化显示(只显示版本号前7位和提交信息)
git log --oneline
# 显示所有分支的提交
git log --all
# 显示分支合并图
git log --graph
# 查看指定文件的修改历史
git log -p filename.txt
# 查看指定作者的提交记录
git log --author="Your Name"
六、分支管理与冲突解决
6.1 分支基本操作
bash
# 查看所有分支(当前分支前带 *)
git branch
# 查看本地+远程所有分支
git branch -a
# 创建新分支
git branch 分支名
# 切换到指定分支
git checkout 分支名
# 创建并切换到新分支(简化写法)
git checkout -b 分支名
# 删除本地分支(需先切换到其他分支)
git branch -d 分支名
# 强制删除未合并的分支(谨慎使用!)
git branch -D 分支名
6.2 分支合并
bash
# 1. 切换到目标分支(如主分支)
git checkout main
# 2. 合并指定分支到当前分支(无冲突则直接合并)
git merge feature/login
6.3 冲突解决
-
git status 查看哪些文件发生冲突
-
合并冲突时,文件中会出现
<<<<<<< HEAD(当前分支内容)、=======、>>>>>>> 分支名(待合并分支内容)标记 -
手动编辑冲突文件,保留需要的代码并删除冲突标记
-
暂存修改:
git add . -
完成合并:
git commit -m "merge: 合并登录功能分支,解决冲突"
七、stash 临时保存工作区
7.1 核心命令
bash
# 临时保存工作区修改(可添加备注)
git stash save "备注信息"
# 查看所有 stash 记录
git stash list
# 恢复最近一次 stash 且保留记录
git stash apply
# 可以存多次
# 恢复指定 stash 且保留记录
git stash apply stash@{n}
# 恢复最近一次 stash 并删除记录
git stash pop
# 删除最近一次 stash 记录
git stash drop
# 删除所有 stash 记录
git stash clear
7.2 使用场景
- 切换分支前,保存当前未提交的修改,避免分支切换冲突
- 临时拉取远程最新代码,不影响本地正在开发的内容
八、git rebase -i 交互式变基
8.1 核心功能(优化提交历史)
bash
# 操作最近 n 个提交(n 为具体数字)
git rebase -i HEAD~n
- 压缩提交:将多个提交合并为一个 ,把行首
pick改为squash或s - 编辑提交:修改历史提交的信息 / 内容,把行首
pick改为edit或e,修改后执行git commit --amend和git rebase --continue - 删除提交:移除不需要的历史提交,删除对应行或把
pick改为drop或d - 调整顺序:直接拖动提交行调整顺序,保存后 Git 按新顺序执行
8.2 注意事项
- 优势:生成线性提交历史,比 merge 更易追踪
- 禁忌:不要对已推送到远程仓库的提交执行变基
九、远程仓库协作
9.1 远程仓库管理
bash
# 查看已配置的远程仓库
git remote
# 查看远程仓库详细信息(包含URL)
git remote -v
# 添加远程仓库(通常命名为 origin)
git remote add 远程名 URL
# 重命名远程仓库
git remote rename <旧别名> <新别名>
# 修改远程仓库URL
git remote set-url 新URL
# 删除远程仓库
git remote rm 远程名
9.2 拉取与推送
bash
# 从远程仓库拉取最新代码(不自动合并)
git fetch origin main
# 拉取并合并远程分支到本地当前分支(常用)
git pull origin main
# 首次推送分支到远程仓库(设置上游分支)
git push -u 远程名 分支名
# 后续推送已关联的分支
git push
# 推送本地所有分支到远程
git push --all origin
# 拉取远程分支并创建本地分支
git checkout -b <本地分支名> <远程别名>/<远程分支名>
十、.gitignore 语法与配置
10.1 基础语法规则
-
注释行:以
#开头 -
匹配单个文件:直接写文件名,如
test.txt -
匹配目录:以
/结尾,如logs/ -
通配符匹配:
-
*:匹配任意多个字符,如*.log(所有 log 文件) -
**:递归通配符,如**/log/(所有 log 目录) -
?:匹配单个字符,如file?.txt(file1.txt、file2.txt 等) -
[]:匹配括号内任意一个 字符,如file[12].txt
-
-
反向匹配:以
!开头,表示不忽略该文件 / 目录,如!important.log
10.2 .gitignore 示例
plaintext
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 忽略 dist 构建目录
dist/
# 忽略特定文件
.env
.DS_Store(macOS系统文件)
Thumbs.db(Windows系统文件)
十一、常见问题与解决方案
11.1 .gitignore 相关问题
-
问题 1:已提交到仓库的文件,添加到 .gitignore 后不生效解决方案:清除文件缓存并重新提交
bashgit rm --cached <文件名> git commit -m "停止跟踪某文件" -
问题 2:需要局部配置 .gitignore,不影响团队共享配置解决方案:在
.git/info/exclude文件中添加忽略规则,仅对当前本地仓库有效 -
问题 3:忽略规则不生效解决方案:检查规则语法,或执行
git rm --cached <文件名>清除缓存
11.2 忘记提交就切换分支
问题:工作区有未提交修改,切换分支时提示 error: Your local changes would be overwritten by checkout解决方法:
- 方案 1:提交修改后切换分支:
git add .→git commit -m "temp: 临时提交"→git checkout 目标分支 - 方案 2:用 stash 暂存:
git stash→ 切换分支完成操作 → 切回原分支 →git stash pop(恢复修改)
11.3 误删本地分支
问题:不小心删除了未合并的本地分支解决方法:
- 执行
git reflog查看操作记录,找到删除分支的最后一次提交 ID - 恢复分支:
git checkout -b 恢复的分支名 <commit-id>
11.4 其他注意事项
git reset --hard慎用,会彻底丢失未提交的工作区修改- 不要对已推送至远程的提交执行
rebase,避免影响团队协作