dio智能科技

月度归档: 2025 年 10 月

  • Git学习

    Git-Study


    <u> 作者:jason-wrj </u>

    <u> 分类:软件开发/Git </u>

    <u> 标签:Software Develop, Git </u>

    <u> 更多:www.dioit.com——迪欧IT——dio智能科技 </u>

    <u> 更多:www.dioit.com——dioIT——嵌入式电子智能技术 </u>


    1 简介

    Git 是一款分布式版本控制系统,主要用于跟踪文件的修改历史、协调多人协作开发,是软件开发中不可或缺的工具。

    1.1 Git 优势

    • 本地版本控制 vs 集中式版本控制(SVN) vs 分布式版本控制(Git)

    • Git 的核心优势:分布式、高效、支持非线性开发。

    1.2 Git 核心概念

    学习 Git 最难的不是命令,而是理解它的核心思想。Git 三区模型:工作区 → 暂存区 → 仓库。

    • 工作区(Working Directory):电脑上能看到的项目目录,在这里编辑文件。

    • 暂存区(Staging Area / Index):一个“预存区域”,用于标记要提交的内容,准备要提交的文件会先放在这里,但不实际保存。通过git add命令将文件添加到暂存区。

    • 本地版本仓库(Local Repository):项目文件夹,用于存储代码的地方,创建时会生成一个隐藏的 .git 文件夹(Git 的“数据库”),里面存储了项目历史版本控制信息与元数据,Git 会记录这个文件夹里所有文件的历史变化。

      • 提交(Commit):一次快照,正式保存暂存区的内容,代码的变更记录到提交历史。包含文件快照、作者信息、时间戳的唯一标识(SHA-1哈希值)。使用git commit -m "提交信息"命令进行提交。

      • 分支(Branch):开发的独立线,如 maindev,默认的主分支叫 main (旧版也叫 master)。是独立的提交历史线,允许开发者分叉开发。可以创建新的分支来开发新功能,而不会影响主分支的稳定代码。使用git branch创建分支,git checkout切换分支。

      • 合并(Merge):将不同分支的更改整合。

    • 远程版本仓库(Remote Repository):放在互联网或其他网络上的版本库,比如 GitHub, GitLab, Gitee。用于团队协作和备份。

    核心工作流程可以概括为:

    工作区 -> (git add -> 暂存区) -> (git commit -> 本地版本仓库) -> (git push -> 远程版本仓库)

    工作区 <- (git checkout -- <file> <- 暂存区) <- (git reset HEAD <- 本地版本仓库)

    删除 <- (git rm --cached <file> <- 暂存区)


    2 Git 核心概念

    2.1 本地三大区域

    • 工作区(Working Directory):

      本地当前编辑文件的目录(能看到的文件夹)。

    • 暂存区(Index / Staging Area):

      文件暂存的位置,临时存储待提交的修改(类似 “缓存区”)。

      通过 git add 将工作区的修改放入暂存区。

    • 本地仓库(Local Repository):

      永久存储所有版本历史记录的数据库(隐藏目录 .git)。

      通过 git commit 将暂存区的内容提交到本地仓库。

    2.2 远程第四区域

    • 远程仓库(Remote Repository) 托管在网络上的仓库(如 GitHub、GitLab),用于多人共享代码。

      通过 git push/git pull 与本地仓库同步。

    2.3 分布式架构

    • 每个开发者拥有完整仓库副本(含完整历史),不依赖中央服务器。

    2.4 数据存储原理

    • 文件快照(非差异)存储数据,通过SHA-1哈希保证数据完整性。


    3 Git 安装与初始配置

    3.1 安装 Git

    • Windows:在 Git 官网下载 Git for Windows,按向导安装(建议勾选 “Add Git to PATH”),安装后会有 Git Bash 这个命令行工具。

    • macOS:使用 Homebrew(brew install git)安装,或通过 Xcode 命令行工具(xcode-select --install),或从官网下载安装。

    • Linux:通过包管理器安装,如 Debian/Ubuntu 用(sudo apt install git),如 CentOS 用(sudo yum install git)。

    3.2 初始配置(必做)

    全局配置:安装后需配置用户信息,打开终端(或 Git Bash),设置用户名和邮箱(每次提交会关联此“签名“信息):

    git config --global user.name "Your Name" # 配置用户
    git config --global user.email "Your eMail@example.com"

    查看配置:

    git config --list  # 列出所有配置

    3.3 可选配置

    git config --global alias.st status  # 设置别名
    git config --global pull.rebase true  # 自动变基

    4 常用命令

    4.1 仓库初始化与克隆

    • 创建新仓库:在项目目录中初始化本地仓库

    git init  # 初始化本地仓库,生成 .git 目录(隐藏)
    • 克隆远程仓库:将远程仓库下载到本地

    git clone <远程仓库地址URL>  # 例如:git clone https://github.com/username/repo.git

    4.2 添加文件与跟踪提交

    • 查看工作区状态

    git status  # 显示哪些文件被修改、未跟踪等
    • 将文件添加到暂存区

    git add <文件名>  # 添加单个文件
    git add .        # 添加所有修改的文件(不包括被忽略的)
    • 提交到本地仓库

    git commit -m "提交说明"  # 提交暂存区内容,说明需简洁明了(如"修复登录bug")
    • 跳过暂存区直接提交(仅修改已跟踪的文件):

    git commit -am "提交说明"

    4.3 查看历史与版本回退

    • 查看提交历史

    git log                # 详细历史(按 q 退出)
    git log --oneline      # 简洁历史(一行一个提交)
    git log --pretty=oneline # 查看提交历史
    git log --graph        # 图形化展示分支合并历史,可视化分支关系
    git log -- <file>      # 查看某个文件的历史修改
    • 回退到指定版本(谨慎使用!)

    git reset --soft HEAD~1  # 回退提交,撤销上一次的提交,并保留修改到工作区
    git reset --soft HEAD^   # 撤销提交但保留修改
    git reset --mixed HEAD~1 # 保留修改,回退暂存区(默认)
    git reset --hard HEAD~1 # 彻底撤销上一次的提交,回退到上一个版本,慎用!(~1 表示上1个,~2 表示上2个)
    git reset --hard <提交ID>  # 彻底回退到指定版本(提交ID可从 git log 获取前几位)
    git reset --hard HEAD^ # 回退到上一版本,(可用`git reflog`恢复找回)
    • 撤销工作区修改(未 add 的文件):

    git restore <文件名>    # 恢复文件,恢复到最近一次提交的状态
    
    # 下面这两个操作很危险!会丢失修改,会清除工作区中未添加到暂存区中的改动,不可恢复。
    git checkout .         # 撤销工作区修改,会用暂存区(全部)的文件替换工作区的文件
    git checkout -- <file> # 撤销工作区修改,会用暂存区(指定)的文件替换工作区的文件
    • 撤销暂存区修改(已 add 但未 commit):

    git reset HEAD <file>         # 撤销暂存区修改
    git restore --staged <文件名>  # 将文件从暂存区的修改退回工作区(取消 add)
    • 撤销(工作区+暂存区)修改(已 add ,已 commit):

    # 撤销(工作区+暂存区)修改
    # 下面这两个操作很危险,会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
    git checkout HEAD .       # 会用 HEAD 指向的分支中的(全部文件)替换暂存区和以及工作区中的文件
    git checkout HEAD <file>  # 会用 HEAD 指向的分支中的(指定文件)替换暂存区和以及工作区中的文件
    • 创建反向提交

    git revert <commit>       # 创建反向提交(不修改历史)

    4.4 分支操作(核心)

    Git 的核心在于分支和提交的历史管理,其余命令都是对这些基本概念的扩展和操作。

    分支本质是提交的指针,默认主分支为 mainmaster

    分支用于隔离开发任务(如功能开发、bug 修复),避免影响主代码。

    • Fork-Pull 请求(GitHub 流程)

      • Fork 项目 → Clone 到本地 → 创建新分支 → 提交更改 → 提交 Pull Request。

      • Pull Request流程:

        1. 基于 develop 创建功能分支。

        2. 提交代码后发起 PR。

        3. 团队审查通过后合并。

    • Git Flow 工作流,标准化分支模型,适合中大型项目

      • 主分支 main(稳定版本)

      • 开发分支 develop

      • 功能分支feature/xxx

      • 发布分支 release/xxx

      • 热修复分支 hotfix/xxx

    • 隔离案例:修复线上bug时,从main创建hotfix/login分支,修复后合并到maindevelop

    • 查看分支

    git branch          # 列出本地分支,查看所有分支(* 表示当前分支)
    git branch -r       # 列出远程分支
    • 创建分支

    git branch <分支名>  # 创建新分支(基于当前分支)
    git branch feature-xxx # 创建一个新分支,名为 feature-xxx
    • 切换分支

    git switch <分支名> # 切换到指定分支(Git 2.23+ 推荐)
    git checkout <分支名>  # 切换到指定分支
    git checkout feature-xxx # 切换到 feature-xxx 分支
    • 创建并切换分支

    git switch -c <分支名>
    git switch -c feature-xxx
    git checkout -b <分支名>  # 等价于 git branch + git checkout
    git checkout -b feature-xxx # 创建并切换到 feature-xxx 分支
    • 合并分支

      • 快进合并 (Fast-Forward):目标分支无新提交时自动合并。

      • 三方合并 (3-way Merge):解决分支冲突后提交。

    git merge <分支名A>  # 合并指定分支到当前分支。例如:在 main 分支执行 git merge feature,合并feature 到 main 分支
    git merge feature-xxx # 将 feature-xxx 分支的修改合并到当前分支 (main)
    git merge <name> --no-ff  # 合并分支(保留记录)
    git mergetool # 使用工具解决冲突
    • 删除分支(需先切换到其他分支):

    git branch -d <分支名>  # 删除已合并的本地分支
    git branch -d feature-xxx # 删除已合并的分支 feature-xxx
    git branch -D <分支名>  # 强制删除未合并的本地分支(谨慎使用)
    git push origin -d <分支名>  # 删除远程分支
    • 解决分支合并冲突

      多人修改同一文件,当合并分支时出现冲突,需手动编辑冲突文件(标记为<<<<<<<=======>>>>>>>),保存后执行:

    git add <冲突文件>
    git commit
    • 变基 (Rebase)(谨慎操作)

      风险注意不要对已推送的分支执行变基(会重写提交历史,破坏协作,谨慎操作)。

    git rebase main   # 将当前分支修改“移植”到main分支最新提交后 <x-preset class="no-tts reference-tag disable-to-doc" data-index="1">1</x-preset><x-preset class="no-tts reference-tag disable-to-doc" data-index="3">3</x-preset>
    git rebase # 会重写提交历史,破坏协作,谨慎操作
    git rebase -i HEAD~3  # 交互式 rebase,合并修改最近3次提交

    4.5 远程仓库交互

    • 关联远程仓库(本地仓库首次关联远程时):

    # 需要在 GitHub 上创建一个新的空仓库,再将本地仓库与一个远程仓库关联起来
    git remote add origin <远程仓库地址URL>  # 连接远程仓库,origin 是远程仓库的默认别名
    # git remote add origin https://github.com/你的用户名/你的仓库名.git
    • 查看已关联的远程仓库

    git remote -v # 查看已关联的远程仓库
    • 推送本地分支到远程

    git push -u origin <分支名>  # 首次推送,-u 参数表示建立追踪关联远程分支,后续直接用 git push
    # 将本地 main 分支的提交推送到远程仓库的 main 分支
    git push -u origin main
    • 拉取远程最新代码(同步远程修改到本地):

    # 从远程仓库拉取最新的更新到本地(非常常用!)
    git pull origin <分支名>  # 等价于( git fetch + git merge )
    git pull --rebase origin master  # 拉取并合并
    • 获取远程最新信息(不合并)

    git fetch origin  # 拉取远程分支信息,但不合并到本地
    • 克隆一个已有的远程仓库到本地

    # 克隆一个已有的远程仓库到本地(是参与别人的项目)
    git clone https://github.com/别人的用户名/项目名.git

    5 高频工作流

    5.1 本地操作(个人)

    操作 命令示例 说明
    初始化仓库 git init 当前目录创建新仓库
    添加缓存 git add . / git add <file> 添加文件到暂存区
    提交修改 git commit -m "描述msg" 提交到本地仓库
    查看状态/历史 git status / git log --oneline 检查修改或查看提交记录
    撤销修改 git checkout -- <file> 丢弃工作区未暂存的修改
    • 代码提交规范

      使用语义化提交消息(如 feat:fix:docs:),参考 Conventional Commits。

    5.2 基本流程(多人协作)

    1. 进入工作项目文件夹目录内部,创建并初始化新仓库:git init

    2. 关联远程仓库,管理远程仓库:git remote add origin <远程仓库 URL>

    3. 从远程仓库克隆代码到本地:git clone <远程地址 URL>

    4. 每个新功能独立分支开发,创建新分支开发功能:git switch -c feature/xxx

    5. 开发中频繁添加文件到暂存区、提交更改到本地仓库:git add .git commit -m "xxx"

    6. 查看当前仓库状态、查看提交历史日志:git statusgit log

    7. 定期从远程仓库拉取最新代码,更新本地仓库(避免冲突):git pull origin main

    8. 本地仓库功能开发完成后,推送代码到远程:git push -u origin feature/xxxgit push -u origin main

    9. 在远程仓库(如 GitHub/Gitee/GitLab)发起 Pull Request(PR),等待审核合并。

    10. 解决推送冲突,先 git pull → 解决冲突 → 重新提交。

    # 1.1 进入项目文件夹目录内部
    cd project
    # 1.2 创建并初始化一个新的 Git 仓库
    git init
    # 2 关联远程仓库,管理远程仓库
    git remote add origin <URL>
    # 3 从远程仓库克隆代码到本地
    git clone <URL> 
    # 4 创建新分支开发功能
    git switch -c feature/xxx
    # 5.1 开发中频繁添加文件到暂存区
    git add <file> # 添加指定单个文件到暂存区
    git add .      # 添加所有变化的文件到暂存区(新增、修改)
    git add -u     # 添加所有修改和删除的文件,但不包括新文件
    git add -p     # 拆分文件提交
    # 5.2 开发中频繁提交更改到本地仓库
    git commit -m "描述本次修改"
    git commit -m "写一句清晰的提交说明,比如:添加了用户登录功能"
    # 6.1 查看当前仓库状态,包括暂存区和工作区的对比。(常用!哪些被修改了、哪些已暂存)
    git status
    # 6.2 查看提交历史日志,包含提交的哈希码、日期、提交者、提交信息等。
    git log
    # 7 定期从远程仓库拉取最新代码,更新本地仓库(避免冲突)。git pull(= fetch + merge)
    git pull origin main
    # 8 本地仓库功能开发完成后,将本地代码推送到远程仓库
    git push -u origin feature/xxx
    git push -u origin main
    git push origin main
    # 9 在远程仓库(如 GitHub)发起 Pull Request(PR),等待审核合并。
    # 10 解决推送冲突,先 `git pull` → 解决冲突 → 重新提交。

    6 实用技巧

    6.1 忽略文件

    创建一个名为 .gitignore 的文件,列出希望 Git 忽略,不需要跟踪的文件和文件夹(如日志、依赖、本地配置文件、IDE 配置、编译产物、node_modules 等等):

    • .gitignore 忽略文件示例:

      • node_modules/:表示忽略 node_modules 依赖目录

      • *.log:表示忽略所有 .log 文件

      • !important.log:表示不要忽略 important.log 文件

      • .idea/:表示忽略 IDEA 配置

    6.2 解决合并冲突

    合并分支时若出现冲突(同一文件同一位置修改),Git 会在文件中标记冲突位置:

    <<<<<<< HEAD(当前分支内容)
    这是当前分支的代码
    =======
    这是待合并分支的代码
    >>>>>>> feature/xxx(待合并分支)

    冲突解决方式流程

    执行git pull后若冲突,手动编辑修改文件保留需要的内容,然后 git add <冲突文件>git commit 完成合并。

    6.3 Stash 储藏更改

    当需要切换分支,但又不想提交未完成的工作时,即工作区未提交时(暂存未提交的更改),可用 stash 临时储藏,暂存当前修改,临时存储工作区:

    git stash        # 储藏当前工作区和暂存区的修改,保存工作进度
    git stash pop    # 恢复进度,恢复最近一次暂存储藏并删除储藏记录
    git stash list   # 查看暂存储藏列表
    git stash save "描述"     # 暂存修改
    git stash apply          # 应用暂存

    6.4 查看文件差异

    git diff              # 查看工作区与暂存区的差异
    git diff --cached     # 查看暂存区与上次提交的差异
    git diff --staged     # 查看暂存区和最新提交的差异
    git diff commit_id1 commit_id2 # 查看两次提交之间的差异

    6.5 图形化工具推荐

    • VS Code(内置Git支持)、GitKraken(可视化分支)、SourceTree。

    6.6 特殊场景

    • 回退目录:git reset <commit> -- src/

    • 精准移植提交:git cherry-pick abc123


    7 进阶技能

    7.1 标签(Tag)

    • 为特定提交打标签(如版本号),创建版本标签:git tag -a v1.0 -m "Release"git push origin v1.0

    git tag v1.0
    git push origin v1.0    # 推送标签到远程

    7.2 子模块(Submodule)

    • 添加子模块:git submodule add <url>

    • 克隆含子模块项目:git clone --recurse-submodules <url>


    8 Git 练习

    8.1 学习资源

    1. 官方文档

    2. 在线课程

      • GitHub Learning Lab(互动式教程)

      • freeCodeCamp Git 教程(英文)

    3. 工具辅助

      • 图形化工具 (GUI):初学者可以先用 GUI 工具辅助理解,如 GitHub Desktop, GitKraken, Sourcetree, VS Code 内置的 Git 功能。它们能可视化地看到分支、提交历史的变化。

      • 托管平台:GitHub、GitLab、Bitbucket。

    8.2 学习路径

    • 学习目标

      掌握Git核心功能,能够独立完成项目版本管理、分支协作及远程开发,具备解决常见冲突和优化工作流程的能力。

    • 分阶段学习

    graph LR
    A[核心概念] --> B[安装配置]
    B --> C[本地操作:add/commit/status/log]
    C --> D[分支管理:branch/merge]
    D --> E[远程协作:clone/push/pull/PR]
    E --> F[高级技巧:stash/revert/rebase]

    8.3 学习实践

    最重要的建议:实践是学习 Git 的关键!不要怕犯错! Git 几乎所有的操作都是可以撤销或挽回的。大胆地去使用它,遇到问题时,善用 git help <命令> 或搜索解决方案(如 Stack Overflow),99% 的 Git 问题网上都有答案。

    1. 个人仓库

      • 在GitHub创建仓库,模拟完整流程:

        • 初始化 → 分支开发 → 合并 → 部署

      • 学习基本的提交、分支和推送操作。

      • 实践标签管理:git tag v1.0.0

    2. 协作项目

      • GitHub Gitee 创建仓库练习协作。

      • 在 GitHub 上参与开源项目,练习 Pull Request 和 Issue 跟踪。

      • 实践clone→修改→commitpush→创建PR的全流程。

    3. 模拟团队开发

      • 与朋友一起克隆同一仓库,练习合并分支和解决冲突。

      • 分支命名规范

      • 代码审查流程

      • 解决合并冲突

    4. 交互式练习

      • Learn Git Branching (可视化分支操作,交互式学习游戏,通过游戏直观理解分支和合并)

      • Git Exercises(命令实战)。

    5. 实践

      • 在自己的项目上用起来!从 git init, add, commit, push 开始。

      • 在 GitHub 上找一个开源项目,Fork 它,克隆到本地,尝试修改然后提交,最后发起一个 Pull Request (PR)。这是最真实的协作体验。

    8.4 关键提示

    • 动手实践: 理解 Git 核心思想,遇到冲突时善用 git diff 和图形化工具(如VSCode内置Git)。

    • 高频练习:实际使用中,多练习分支操作和远程协作。

    • 原子化提交:每次提交只解决一个问题。

    • 频繁拉取更新push前务必先pull,减少冲突。

    • .gitignore:忽略日志、编译产物等无关文件(例:添加node_modules/)。

    • 工作流:掌握工作流逻辑后,命令自然熟练。

    • 遇到问题多查阅git --help或官方文档,实践是掌握Git的核心!

    8.5 实践避坑

    1. 慎用git push -f:强制推送会覆盖远程分支,需团队确认

    2. 共享分支避免变基:已推送至远程的分支禁止使用git rebase

    3. 临时修改用git stash:避免污染提交记录


    内容目录


    迪欧IT——dio智能科技

粤ICP备2021093735号

粤公网安备44522402000161号