Git 超详细学习笔记
1、Git 核心概念与结构
为了更流畅地学习 Git,我们首先需要理解其管理的三种文件状态以及对应的工作区域。这三个状态分别是:已提交 (committed) 、已修改 (modified) 和 已暂存 (staged) 。由此引入了 Git 项目的三个核心工作区域:Git 仓库 、工作目录 以及 暂存区域。
Git仓库
Repository
暂存区域
Index / Stage
工作目录
git add
git commit
git checkout / reset
修改的文件
快照
提交历史
- Git仓库目录:Git 用来保存项目的元数据和对象数据库的地方。这是 Git 的核心。当你从其他计算机克隆仓库时,实际拷贝的就是这里的数据。
- 工作目录:从 Git 仓库的压缩数据库中提取出来、放在磁盘上供你使用或修改的项目文件。
- 暂存区域:一个文件(通常位于 Git 仓库目录中),保存了下次将要提交的文件列表信息。有时也被称为"索引 (Index)"。
1.1、基本工作流程
基于上述结构,Git 的基本工作流程非常清晰:
- 在工作目录中修改文件。
- 暂存 文件,将文件的快照放入暂存区域 (
git add)。 - 提交 文件,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录 (
git commit)。
1.2、团队内部协作
开发者 B 远程仓库 (如 GitHub) 开发者 A 开发者 B 远程仓库 (如 GitHub) 开发者 A 初始:所有人都从远程仓库克隆代码 开发者 A 开始新功能 开发者 B 开始另一个功能 解决可能的合并冲突 git clone / git pull git clone / git pull git add / git commit (本地提交) git push (推送到远程) git add / git commit git push (推送失败,因为远程已有更新) 推送被拒绝 git pull (先拉取远程更新) 获取更新 git add / git commit (合并后提交) git push (再次推送成功)
1.3、跨团队协作
源仓库 (官方) 团队外开发者Fork的仓库 项目核心开发者 源仓库 (官方) 团队外开发者Fork的仓库 项目核心开发者 1. Fork 项目 在GitHub页面上点击Fork 2. Clone 到本地 git clone [Fork的仓库URL] 3. 修改代码,本地提交 git add/commit 4. Push 到自己远程仓库 git push origin main 拥有项目副本 5. 发起 Pull Request 在GitHub页面上操作 6. 代码审查与讨论 7. 合并 Pull Request (由核心开发者操作)
2、Git 基本操作
2.1、本地仓库初始化 (git init)
如果你想将本地的某个目录作为 Git 仓库,需要先进行初始化。
- 进入目标目录(例如
my-project)。 - 右键打开
Git Bash Here(Windows)或直接在终端中进入该目录。 - 执行命令:
git init - 执行完毕后,目录下会多出一个
.git的隐藏文件夹。



|------ HEAD (git项目当前指针位置)
|------ index (git索引文件)
|------ config (git配置信息)
|------ refs/ (标示git项目分支指向哪次提交commitId)
|------ objects/ (git本地仓库对象(commit tree blob类型))
|__ logs/ (每次refs的历史记录)
注意 :.git 目录中存放的是本地库相关的核心文件和目录,切勿删除或随意修改。
2.2、设置签名
2.2.1、格式
- 用户名:
tony - Email 地址:
tony@126.com
作用 :区分不同开发人员的身份。注意:此签名与登录远程代码托管中心(如 GitHub、Gitee)的账号无关。
2.2.2、设置命令
2.2.2.1、项目级别/仓库级别
仅在当前本地库范围内有效。
bash
git config user.name "tony"
git config user.email "tony@126.com"
信息保存位置:当前仓库下的 .git/config 文件中。

2.2.2.2、系统用户级别
对登录当前操作系统的用户范围有效。
bash
git config --global user.name "tony"
git config --global user.email "tony@126.com"
信息保存位置:用户主目录下的 ~/.gitconfig 文件中。
使用 git config --list 可以查看所有配置信息。
2.2.2.3、级别优先级
- 就近原则 :项目级别优先于系统用户级别。二者都存在时,采用项目级别的签名。
- 若只有系统用户级别的签名,则以此为准。
- 二者都不允许没有签名。
2.3、命令操作
2.3.1、git status - 状态查看
查看工作区、暂存区的文件状态。
- 红色:工作区中的文件被修改了(或新建),但尚未添加到暂存区。

- 绿色:文件已添加到暂存区,但尚未提交到本地库。

2.3.2、git add [filename] - 添加到暂存区
将工作区的"新建/修改"添加到暂存区。
bash
# 添加指定文件
git add index.html
# 添加当前目录所有变更(包括新建、修改、删除)
git add -A
# 或者
git add .
2.3.3、git commit - 提交到本地库
将暂存区的内容提交到本地库,形成一个新的版本。
bash
# 提交并附加说明信息
git commit -m "提交说明"
# 提交指定文件
git commit -m "说明" index.html
# 跳过暂存区,直接提交工作区中已跟踪文件的修改(等同于先add再commit)
git commit -a -m "说明"

2.3.4、git checkout 文件名 - 撤销工作区修改
将工作区中指定文件的修改撤销,恢复到暂存区(或最近一次提交)的状态。
bash
git checkout index.html
注意 :此命令会丢弃工作区的修改,无法恢复,请谨慎使用。
2.3.5、git log - 查看历史记录
查看提交日志。
bash
# 完整格式
git log
# 单行简洁模式,仅显示提交哈希和提交说明
git log --pretty=oneline
# 更简洁的模式,只显示部分哈希值
git log --oneline
# 查看所有分支的操作记录(包括已被删除的commit和reset操作),可以方便地看到版本移动的步数
git reflog
多屏显示控制 :空格向下翻页,b 向上翻页,q 退出。

2.3.6、git reset - 版本回退
版本前进或后退的本质是移动 HEAD 指针。

命令格式 :git reset --[参数] [目标版本]
三种主要方式:
-
基于索引值(推荐):
bash# 使用 git reflog 查看目标版本的索引值,然后回退 git reset --hard a6ace91 -
使用
^符号(只能后退):bash# 后退一步 git reset --hard HEAD^ # 后退 n 步 git reset --hard HEAD^^^ # 后退三步 -
使用
~符号(只能后退):bash# 后退 n 步 git reset --hard HEAD~3 # 后退三步
reset 命令的三个参数对比:
| 参数 | 工作区 (Working Directory) | 暂存区 (Staging Area) | 本地库 (Repository) |
|---|---|---|---|
--soft |
不动 | 不动 | 移动 HEAD 指针 |
--mixed (默认) |
不动 | 同步为 HEAD 指向的内容 | 移动 HEAD 指针 |
--hard |
同步为暂存区/HEAD内容 | 同步为 HEAD 指向的内容 | 移动 HEAD 指针 |
2.3.7、git diff - 比较文件差异
比较不同区域间文件的差异。
bash
# 比较工作区 和 暂存区
git diff [文件名]
# 比较工作区 和 本地库的某个历史版本
git diff [本地库版本哈希] [文件名]
# 比较暂存区 和 本地库
git diff --cached [文件名]

3、分支管理
3.1、什么是分支?
在版本控制过程中,使用多条线同时推进多个任务。分支使得你可以从主线上分离出来,进行独立的开发,而不影响主线。
main feature-login init add login form update docs add login logic merge login feature v1.0
3.2、操作
3.2.1、创建分支
bash
# 创建名为 hotfix 的分支(基于当前所在分支的最新提交)
git branch hotfix
3.2.2、查看分支
bash
# 查看所有本地分支,当前分支前会有 * 号
git branch -v
3.2.3、切换分支
bash
# 切换到 hotfix 分支
git checkout hotfix
# 创建并切换到新分支 (常用)
git checkout -b new-feature
3.2.4、合并分支
将指定分支的内容合并到当前所在分支 。
步骤:
- 切换到要接收修改的分支(如
master)。 - 执行
git merge [有新内容的分支名](如hotfix)。
bash
git checkout master
git merge hotfix
3.2.5、冲突解决
当两个分支在同一个文件的同一个位置进行了不同的修改时,合并就会产生冲突。
冲突表现:Git 合并失败,并提示冲突文件。文件中会包含特殊的标记:
<<<<<<< HEAD
当前分支的内容
=======
正在合并进来的分支的内容
>>>>>>> hotfix
解决步骤:
-
编辑冲突文件 :手动编辑文件,删除
<<<<<<<、=======、>>>>>>>这些标记,并修改代码到满意的最终状态。 -
标记为已解决:将修改后的文件添加到暂存区。
bashgit add [冲突文件名] -
完成合并 :执行
commit完成合并。bash# 注意:此时 commit 后面不能带具体文件名 git commit -m "合并冲突,保留...代码"
3.2.6、删除分支
当一个分支(例如用于修复紧急Bug的 hotfix)已经完成合并,不再需要时,可以将其删除。
bash
git branch -d hotfix
4、远程仓库操作
4.1、查看远程仓库
bash
# 列出已经配置的远程仓库服务器(默认为 origin)
git remote
# 查看更详细信息,包括抓取和推送的 URL
git remote -v
4.2、添加远程仓库
bash
# git remote add [仓库别名] [仓库URL]
git remote add origin https://github.com/your-username/your-repo.git
4.3、从远程仓库拉取
-
git fetch:从远程仓库下载最新数据到本地,但不会自动合并到当前工作分支。bashgit fetch origin git merge origin/main -
git pull:等同于git fetch+git merge,直接从远程获取并合并到当前分支。bash# 从远程 origin 的 main 分支拉取并合并 git pull origin main
4.4、推送到远程仓库
bash
# git push [远程仓库别名] [本地分支名]:[远程分支名] (如果远程分支名与本地相同,可省略)
git push origin main
# 首次推送并建立关联,可以添加 -u 参数
git push -u origin main
4.5、克隆远程仓库
bash
# git clone [仓库URL] [本地目录名] (本地目录名可省略,默认与仓库同名)
git clone https://github.com/your-username/your-repo.git my-project
5、Git 标签
标签可以很方便地标记重要的历史提交点,比如软件发布版本。
bash
# 列出所有标签
git tag
# 创建附注标签(推荐)
git tag -a v1.0 -m "发布版本1.0"
# 为历史提交打标签
git tag -a v0.9 9fceb02 -m "发布版本0.9"
# 推送标签到远程仓库(默认不会自动推送)
git push origin v1.0
# 推送所有本地标签
git push origin --tags