Git 从入门到精通

Git 从入门到精通

涵盖了核心概念、常用命令、协作流程和高级技巧:

核心理念:

  • 版本控制: 记录文件变化历史,可回溯到任意版本。
  • 分布式: 每个开发者拥有完整的仓库副本(包括完整历史),可离线工作。
  • 快照(Snapshot): Git 记录的是文件系统的快照,而非差异(虽然内部优化存储)。
  • 三个区域:
    • 工作目录 (Working Directory): 你实际看到和修改文件的地方。
    • 暂存区 (Staging Area / Index): 一个准备区,标记了哪些修改将要被提交。
    • 本地仓库 (Local Repository): .git 目录,存储项目的完整历史、元数据(如分支、标签)。
  • 三种状态:
    • 已修改 (Modified): 文件在工作目录中被修改,但尚未放入暂存区。
    • 已暂存 (Staged): 修改的文件已放入暂存区,等待提交。
    • 已提交 (Committed): 数据已安全地保存在本地仓库中。

第一部分:入门基础 (Getting Started)

  1. 安装:
    • 官网 (https://git-scm.com/) 下载对应操作系统的安装包。
    • 安装时注意选择适合你环境的配置(如默认编辑器、PATH 环境变量)。
  2. 初始配置 (首次使用必做):
    • git config --global user.name "Your Name" (设置用户名)
    • git config --global user.email "your.email@example.com" (设置邮箱)
    • git config --global core.editor "vim" (可选,设置默认文本编辑器,如 vscode, nano, vim)
    • git config --list (查看当前配置)
  3. 创建仓库:
    • 初始化新仓库: git init (在当前目录创建新的空 Git 仓库)
    • 克隆现有仓库: git clone <repository_url> (将远程仓库完整复制到本地)
  4. 基本工作流 (单兵作战):
    • 修改文件: 在工作目录编辑文件 -> 状态变为 Modified
    • 添加文件到暂存区: git add <file_name>git add . (添加所有修改/新文件) -> 状态变为 Staged
    • 提交更改: git commit -m "Descriptive commit message" -> 状态变为 Committed,快照存入本地仓库。
    • 查看状态: git status (查看工作目录、暂存区状态)
    • 查看历史: git log (查看提交历史) git log --oneline (简洁历史) git log -p (带详细差异)
  5. 忽略文件 (.gitignore):
    • 创建 .gitignore 文件,列出不想被 Git 跟踪的文件/目录模式(如编译产物、日志、临时文件、敏感信息)。
    • 规则支持通配符 (*, ?), 目录 (/), 取反 (!)。

第二部分:分支与协作 (Branching & Collaboration)

  1. 分支 (Branch):
    • 概念: 轻量级的可移动指针,指向某个提交。用于隔离开发(新功能、修复 Bug)、实验。
    • 创建分支: git branch <branch_name> (基于当前提交创建新分支)
    • 切换分支: git checkout <branch_name>git switch <branch_name> (更新工作目录到该分支最新状态)
    • 创建并切换: git checkout -b <new_branch>git switch -c <new_branch>
    • 查看分支: git branch (列出本地分支,* 表示当前分支) git branch -a (列出所有分支,包括远程)
    • 删除分支: git branch -d <branch_name> (安全删除,需合并过) git branch -D <branch_name> (强制删除未合并分支)
  2. 远程仓库 (Remote):
    • 概念: 托管在网络上的仓库(如 GitHub, GitLab, Bitbucket),用于团队协作和备份。
    • 查看远程: git remote -v
    • 添加远程: git remote add <remote_name> <repository_url> (通常远程默认名为 origin)
    • 拉取更新: git fetch <remote_name> (从远程下载最新数据到本地仓库的 remote/<remote_name>/<branch>不自动合并)
    • 拉取并合并: git pull <remote_name> <remote_branch> (相当于 git fetch + git merge origin/<remote_branch>)
    • 推送更新: git push <remote_name> <local_branch>:<remote_branch> (将本地分支推送到远程分支,常用 git push origin main)
    • 跟踪分支: git push -u origin <local_branch> (首次推送时设置上游跟踪,后续可直接 git push)
  3. 合并 (Merge):
    • 概念: 将一个分支的更改集成到另一个分支。
    • 操作: 切换到目标分支 (如 main),执行 git merge <source_branch>
    • 结果: 创建一个新的“合并提交”(Merge Commit),该提交有两个父提交。
    • 冲突解决: 当同一文件的同一区域在不同分支有不同修改时发生。需手动编辑文件(Git 会标记冲突内容),git add 解决后的文件,然后 git commit 完成合并。
  4. 变基 (Rebase):
    • 概念: 将当前分支的提交“重放”在目标分支(通常是更上游的分支,如 main)的最新提交之上。
    • 操作: 切换到要变基的分支 (如 feature),执行 git rebase <target_branch> (如 main)。
    • 结果: 历史线变得线性、整洁,避免了不必要的合并提交。本质是重写历史!
    • 适用场景: 整理本地分支历史、保持特性分支更新。
    • 黄金法则: 永远不要变基已经推送到远程仓库且与他人共享的分支! (会导致协作混乱)
    • 交互式变基: git rebase -i <commit> (如 HEAD~3),可编辑、压缩(squash)、删除、重排提交。强大但需谨慎。
  5. 协作工作流:
    • 集中式工作流 (Centralized): 类似 SVN,所有人向一个 main 分支提交。简单但易冲突。
    • 功能分支工作流 (Feature Branch): 每个新功能/修复在独立分支开发,完成后通过 Pull Request (PR) / Merge Request (MR) 请求合并到 main。主流协作方式。
    • Gitflow: 更复杂的分支模型(main, develop, feature, release, hotfix 分支),适合有严格发布流程的项目。学习成本稍高。
    • Forking Workflow: 常用于开源项目。贡献者 Fork 主仓库到自己的账号下,在 Fork 出的仓库开发,然后向主仓库发起 PR。

第三部分:进阶技巧 (Advanced Techniques)

  1. 撤销更改:
    • 丢弃工作目录修改: git restore <file> (Git 2.23+) 或 git checkout -- <file>
    • 取消暂存: git restore --staged <file> (Git 2.23+) 或 git reset HEAD <file>
    • 撤销最近提交:
      • 创建新提交撤销: git revert <commit> (安全,推荐用于已推送的提交)
      • 移除提交 (重写历史): git reset [--soft|--mixed|--hard] <commit> (危险! 慎用于已推送提交)
        • --soft:移动 HEAD 和分支指针,保留修改在暂存区。
        • --mixed (默认):移动指针,保留修改在工作目录(未暂存)。
        • --hard:移动指针,丢弃工作目录和暂存区所有修改。
  2. 储藏更改 (Stash):
    • 概念: 临时保存工作目录和暂存区的修改,以便切换分支处理其他事情。
    • 储藏: git stashgit stash push -m "message"
    • 查看储藏列表: git stash list
    • 应用储藏: git stash apply [stash@{n}] (不删除储藏项) git stash pop [stash@{n}] (应用并删除)
    • 删除储藏: git stash drop [stash@{n}]
  3. 标签 (Tag):
    • 概念: 给某个重要的提交(如发布版本)打上永久标记。
    • 创建轻量标签: git tag <tagname> (指向特定提交)
    • 创建附注标签: git tag -a <tagname> -m "message" (包含打标者、日期、信息,是完整的 Git 对象)
    • 查看标签: git tag git show <tagname>
    • 推送标签: git push origin <tagname>git push origin --tags (推送所有标签)
  4. 子模块 (Submodule):
    • 概念: 将一个 Git 仓库作为另一个仓库的子目录嵌套使用。
    • 添加子模块: git submodule add <repository_url> <path>
    • 克隆包含子模块的仓库: git clone --recurse-submodules <repository_url>git clonegit submodule update --init --recursive
    • 更新子模块: 进入子模块目录手动 git pullgit submodule update --remote
    • 注意: 管理较复杂,需谨慎使用。
  5. 二分查找 (Bisect):
    • 概念: 自动化地使用二分搜索定位引入 Bug 的提交。
    • 开始: git bisect start
    • 标记坏提交: git bisect bad [commit] (通常当前 HEAD 是坏的)
    • 标记好提交: git bisect good <commit> (已知没有 Bug 的提交)
    • 测试与标记: Git 会自动检出中间提交,你测试并标记 git bisect goodgit bisect bad,重复直到找到第一个坏提交。
    • 结束: git bisect reset
  6. 钩子 (Hooks):
    • 概念: 在特定 Git 操作(如 commit, push, pre-receive)前后自动触发的自定义脚本(位于 .git/hooks/)。
    • 常见用途: 代码风格检查、测试运行、提交信息格式校验、部署触发。
    • 注意: 钩子脚本不随仓库分发.git/hooks/ 不被跟踪),需其他机制共享(如模板)。
  7. Reflog:
    • 概念: 记录本地仓库中 HEAD 和分支指针移动的历史日志,是后悔药
    • 查看: git refloggit reflog show <branch>
    • 用途: 恢复误删的分支、找回丢失的提交(即使 reset --hard 过)、理解操作历史。

第四部分:精通与最佳实践 (Mastery & Best Practices)

  1. 理解 Git 内部原理 (提升故障诊断能力):
    • 对象: Blob (文件内容), Tree (目录结构), Commit (提交信息、父提交指针、Tree), Tag (标签)。
    • 引用 (Refs): 分支 (refs/heads/), 标签 (refs/tags/), 远程跟踪分支 (refs/remotes/), HEAD (指向当前检出的提交或分支)。
    • 存储: 对象存储在 .git/objects/ 中,通过 SHA-1 哈希值寻址。
    • 打包: Git 自动打包松散对象以节省空间 (git gc)。
  2. 编写优秀的提交信息 (Commit Message):
    • 格式:
      • 第一行:简短摘要 (<50字符),动词开头,说明做了什么。
      • 空一行。
      • 详细描述:解释为什么做这些改动,解决了什么问题,可能的影响。使用现在时态。
    • 参考规范: Conventional Commits。
  3. 高效工作流:
    • 频繁提交: 小步快跑,每个提交聚焦一个逻辑更改。
    • 善用分支: 隔离开发,避免在主分支直接修改。
    • 保持主分支稳定: main/master 分支应总是可部署状态。
    • Code Review: 使用 PR/MR 进行代码审查是提高质量的关键。
    • 定期拉取更新: 减少合并冲突。
    • 清理分支: 合并/废弃后及时删除本地和远程分支。
  4. 处理大型仓库/文件:
    • Git LFS (Large File Storage): 将大文件(二进制、媒体)存储在外部服务器,仓库中只存指针。
    • 浅克隆: git clone --depth=1 (只克隆最近一次提交,节省空间和时间)。
    • 稀疏检出: git sparse-checkout (只检出仓库的指定子目录)。
  5. 选择 GUI 工具 (辅助理解):
    • 官方: git gui (提交工具), gitk (历史查看器)。
    • 第三方: Sourcetree, Fork, GitKraken, VS Code GitLens, GitHub Desktop, Tower 等。可视化操作有助于理解分支关系、提交历史。
  6. 持续学习:
    • 官方文档: git help <command> 或 https://git-scm.com/doc 是最权威的参考。
    • Pro Git 书籍: https://git-scm.com/book/en/v2 (免费在线,非常全面)。
    • 社区: Stack Overflow, Git 官方邮件列表/论坛。

关键警告:

  • 谨慎使用 git reset --hardgit push --force (或 git push --force-with-lease): 它们会重写历史。如果历史已被推送到共享远程仓库,强制推送会破坏其他协作者的工作。仅在绝对必要且了解后果时使用(如在个人分支上整理未推送的本地提交)。
  • 理解 rebase vs merge 选择哪种取决于团队约定和对历史整洁度的要求。变基提供更干净的历史,但操作不当风险更高(尤其是在共享分支上)。

总结:

从入门到精通 Git 是一个循序渐进的过程:

  1. 掌握基础: init, clone, add, commit, status, log, .gitignore
  2. 理解分支与协作: branch, checkout/switch, fetch, pull, push, merge, 冲突解决。
  3. 提升效率: rebase, stash, tag, revert, 撤销操作。
  4. 深入原理与高级: 理解对象模型、Reflog、钩子、二分查找、子模块、内部命令。
  5. 实践最佳实践: 优秀提交信息、高效工作流、善用工具、安全操作。

实践是最好的老师! 多动手操作,遇到问题善用 git help 和搜索。理解 Git 的思维方式(快照、分支指针)比死记命令更重要。祝你 Git 之旅顺利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90990.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5多人MOBA+GAS 30、技能升级机制

文章目录前言技能的升级修改一下按键的输入判断是否满级在ASC中升级技能由角色的输入调用ASC的升级功能技能图标的优化技能升级材质&#xff0c;可升级技能图标的闪烁刷新技能升级后的蓝耗和CD&#xff0c;以及蓝不够时技能进入灰色状态修复伤害数字特效只显示3位数的问题前言 …

笔试——Day22

文章目录第一题题目思路代码第二题题目&#xff1a;思路代码第三题题目&#xff1a;思路代码第一题 题目 添加字符 思路 枚举所有字符串a与字符串b相对应的位置 代码 第二题 题目&#xff1a; 数组变换 思路 贪心 以最大值为基准元素&#xff0c;判断其他元素能否变为最…

__getattr__和 __getattribute__ 的用法

1、__getattr__ 的用法当实例对象访问一个不存在的属性时&#xff0c;会执行 __getattr__ 方法&#xff0c;如果属性存在的话&#xff0c;就不会执行案例 class Person:def __init__(self, name, age):self.name nameself.age agedef get_info(self):return f"name: {se…

信息化项目验收测试实战指南

在当今数字化转型的大背景下&#xff0c;信息化项目验收建设已成为企业提升运营效率、优化管理流程的重要手段。然而&#xff0c;很多企业在投入大量资金建设信息系统后&#xff0c;却常常面临系统上线后无法满足实际业务需求的困境。究其原因&#xff0c;往往是由于忽视了信息…

牛顿拉夫逊法PQ分解法计算潮流MATLAB程序计算模型。

牛顿拉夫逊法&PQ分解法计算潮流MATLAB程序计算模型。本程序模型基于MATLAB进行潮流计算&#xff0c;建议先安装matpower插件&#xff08;MATLAB中非常重要的潮流计算的插件&#xff09;。本程序可进行牛拉法和PQ分解法潮流计算的切换&#xff0c;对比潮流计算的结果。很适合…

Go语言实战案例-计算字符串编辑距离

在自然语言处理、拼写纠错、模糊搜索等场景中,我们经常需要衡量两个字符串之间的相似度。编辑距离(Edit Distance) 就是一个经典的衡量方式,它描述了将一个字符串转换为另一个字符串所需的最少操作次数。 一、问题定义:什么是编辑距离? 编辑距离,也称为 Levenshtein Di…

Java时间与日期常用方法

DateDate date new Date(); //获取当前时间 System.out.println(date.getYear() 1900); // 必须加上1900 System.out.println(date.getMonth() 1); // 0~11&#xff0c;必须加上1 System.out.println(date.getDate()); // 1~31&#xff0c;不能加1Ca…

【MySQL】从连接数据库开始:JDBC 编程入门指南

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f31f;一、什么是JDBC&#xff1f; &#x1f31f;二、JDBC编程的步骤 ✨使用步骤 ✨DriverManger &#x1f4ab;定义 &#x1f4ab;DriverManger的主要功能 …

重生之我在暑假学习微服务第一天《MybatisPlus-上篇》

本系列参考黑马程序员微服务课程&#xff0c;有兴趣的可以去查看相关视频&#xff0c;本系列内容采用渐进式方式讲解微服务核心概念与实践方法&#xff0c;每日更新确保知识点的连贯性。通过系统化学习路径帮助开发者掌握分布式系统构建的关键技术。读者可通过平台订阅功能获取…

odoo-060 git版本:发布/生产版本落后开发版本部署

文章目录问题起源目前解决问题起源 周五提交了一个版本&#xff0c;本来打算使用这个版本的&#xff0c;周末更新。 下一个功能比较复杂&#xff0c;周一提交&#xff0c;结果周末没有更新&#xff0c;导致现在还有没测试过的不能发布的。 说明&#xff1a; 原来只有一个mast…

YotoR模型:Transformer与YOLO新结合,打造“又快又准”的目标检测模型

【导读】在目标检测领域&#xff0c;YOLO系列以其高效的推理速度广受欢迎&#xff0c;而Transformer结构则在精度上展现出强大潜力。如何兼顾二者优势&#xff0c;打造一个“又快又准”的模型&#xff0c;是近年来研究热点之一。本文介绍的一项新研究——YotoR&#xff08;You …

白杨SEO:流量的本质是打开率?搞用户搜索流量的玩法怎么做?

大家好&#xff0c;我是白杨SEO&#xff0c;专注研究SEO十年以上&#xff0c;全网SEO流量实战派&#xff0c;AI搜索优化研究者。上周六参加了生财航海家在杭州举行的私域运营大会&#xff0c;主题是围绕私域获客&#xff0c;私域IP&#xff0c;AI私域&#xff0c;精细化管理。白…

Java优雅使用Spring Boot+MQTT推送与订阅

在物联网&#xff08;IoT&#xff09;和智能设备横行的今天&#xff0c;你有没有遇到这样的问题&#xff1a;服务端需要实时把报警、状态更新、控制指令推送给客户端&#xff1b;安卓 App、嵌入式设备、网页等终端&#xff0c;需要轻量且稳定的连接方式&#xff1b;HTTP 太“重…

多目标粒子群优化(MOPSO)解决ZDT1问题

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

Coze Studio概览(三)--智能体管理

本文简要分析了Coze Studio中智能体管理功能&#xff0c;包括功能、架构以及核心流程。Coze Studio 智能体管理功能分析 1. 智能体管理架构概览 Coze Studio的智能体管理系统基于DDD架构&#xff0c;主要包含以下核心模块&#xff1a; 后端架构层次&#xff1a; API层 (coze): …

idea运行tomcat日志乱码问题

原因在于idea和tomcat文件编码格式不一样。可以把idea编码改成UTF-8 File | Settings | Editor | File Encodings 里面把GBK都改成UTF-8help里面 Edit Custom VM Options 添加一行-Dfile.encodingUTF-8重启idea

Javaweb - 13 - AJAX

发送请求的几种方式1. 浏览器的地址框中输入地址&#xff0c;回车2. html --> head --> scrip / linkimg 自动发送请求&#xff0c;无需手动触发3. a 标签&#xff0c;form 表单标签需要手动控制提交产生&#xff0c;且往往需要在新的页面上获得响应信息4. 运行 JS 代码…

qt常用控件-06

文章目录qt常用控件-06spinBox/doubleSpinBoxdateTimeEditdialSliderlistWIdgettableWidgettreeWidget结语很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c11中常见的新增表达 作者&#…

小智源码分析——音频部分(二)

一、利用创建好的对象来调用音频服务 上周从上图的getaudiocode()方法进去感受了一下底层小智的构造如何实现。所以用一个codec来接收我们所构造的音频对象。下来是用构造好的音频对象来调用音频初始化服务Initialize&#xff0c;因为启动函数Application函数的类中有audio_ser…

菜鸟的C#学习(四)

文章目录一、格式说明符1.1、数字格式说明符&#xff08;适用于数值类型&#xff1a;int, double, decimal 等&#xff09;1. 标准数字格式2. 自定义数字格式1.2、日期时间格式说明符&#xff08;适用于 DateTime, DateTimeOffset&#xff09;1. 标准日期时间格式2. 自定义日期…