Git 超详细学习笔记

Git 超详细学习笔记

1、Git 核心概念与结构

为了更流畅地学习 Git,我们首先需要理解其管理的三种文件状态以及对应的工作区域。这三个状态分别是:已提交 (committed)已修改 (modified)已暂存 (staged) 。由此引入了 Git 项目的三个核心工作区域:Git 仓库工作目录 以及 暂存区域
Git仓库

Repository
暂存区域

Index / Stage
工作目录
git add
git commit
git checkout / reset
修改的文件
快照
提交历史

  1. Git仓库目录:Git 用来保存项目的元数据和对象数据库的地方。这是 Git 的核心。当你从其他计算机克隆仓库时,实际拷贝的就是这里的数据。
  2. 工作目录:从 Git 仓库的压缩数据库中提取出来、放在磁盘上供你使用或修改的项目文件。
  3. 暂存区域:一个文件(通常位于 Git 仓库目录中),保存了下次将要提交的文件列表信息。有时也被称为"索引 (Index)"。

1.1、基本工作流程

基于上述结构,Git 的基本工作流程非常清晰:

  1. 在工作目录中修改文件。
  2. 暂存 文件,将文件的快照放入暂存区域 (git add)。
  3. 提交 文件,找到暂存区域的文件,将快照永久性存储到 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 仓库,需要先进行初始化。

  1. 进入目标目录(例如 my-project)。
  2. 右键打开 Git Bash Here(Windows)或直接在终端中进入该目录。
  3. 执行命令:git init
  4. 执行完毕后,目录下会多出一个 .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、级别优先级
  1. 就近原则 :项目级别优先于系统用户级别。二者都存在时,采用项目级别的签名。
  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 --[参数] [目标版本]

三种主要方式

  1. 基于索引值(推荐)

    bash 复制代码
    # 使用 git reflog 查看目标版本的索引值,然后回退
    git reset --hard a6ace91
  2. 使用 ^ 符号(只能后退)

    bash 复制代码
    # 后退一步
    git reset --hard HEAD^
    # 后退 n 步
    git reset --hard HEAD^^^ # 后退三步
  3. 使用 ~ 符号(只能后退)

    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、合并分支

将指定分支的内容合并到当前所在分支
步骤

  1. 切换到要接收修改的分支(如 master)。
  2. 执行 git merge [有新内容的分支名](如 hotfix)。
bash 复制代码
git checkout master
git merge hotfix
3.2.5、冲突解决

当两个分支在同一个文件的同一个位置进行了不同的修改时,合并就会产生冲突。

冲突表现:Git 合并失败,并提示冲突文件。文件中会包含特殊的标记:

复制代码
<<<<<<< HEAD
当前分支的内容
=======
正在合并进来的分支的内容
>>>>>>> hotfix

解决步骤

  1. 编辑冲突文件 :手动编辑文件,删除 <<<<<<<=======>>>>>>> 这些标记,并修改代码到满意的最终状态。

  2. 标记为已解决:将修改后的文件添加到暂存区。

    bash 复制代码
    git add [冲突文件名]
  3. 完成合并 :执行 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:从远程仓库下载最新数据到本地,但不会自动合并到当前工作分支。

    bash 复制代码
    git 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
相关推荐
云潮汐表2 小时前
浒浦潮汐表查询2026-03-28
笔记
承渊政道2 小时前
【优选算法】(实战领略前缀和的真谛)
开发语言·数据结构·c++·笔记·学习·算法
苦瓜小生2 小时前
【Docker】| Docker学习笔记
笔记·学习·docker
Forrit2 小时前
关于Agent的几种范式
笔记
圣光SG2 小时前
Tomcat 全面学习笔记
笔记·tomcat
2501_938313402 小时前
计算机网络学习笔记】初始网络之网络发展和OSI七层模型
笔记·学习·计算机网络
原来是猿2 小时前
Git入门指南(一):从零开始,掌握Git基础操作
git
宵时待雨2 小时前
C++笔记归纳15:封装map & set
开发语言·数据结构·c++·笔记·算法
逆风飞翔i3 小时前
使用Cherry-pick合并指定分支指定提交记录
git