
文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载本指南以 devops-exercises 仓库中 Git 专题 为核心完整梳理其三大动手练习与七大面试问答板块覆盖 Git 的基础提交、分支、合并、变基、diff 原理与内部对象结构并结合仓库中的 monorepo 性能优化场景展开源码级讲解。读完本文你将掌握一套可直接上手的 Git 操作命令集同时具备回答 Git 面试题与诊断大型仓库性能问题的完整知识框架。Git 专题在项目中的定位devops-exercises 是一个面向 DevOps/SRE 技术面试准备的练习与问答集合Git 是其核心专题之一与 DevOps、Shell、Kubernetes、CI/CD 等板块并列见 README 总览。Git 专题采用练习 问答双轨结构Exercises提供可复现的操作任务Questions则按主题整理高频面试问题覆盖从入门概念到 Git 内部实现的多个层次。动手练习一完成你的第一次提交练习入口见 commit_01.md目标是通过一个最小案例完整走一遍创建仓库 → 暂存 → 提交 → 验证的流程。任务清单创建一个新目录将其初始化为 Git 仓库新建一个名为file的文件内容为 hello commit提交该新文件运行一条 Git 命令验证提交已被记录参考答案完整解法见 commit_01_solution.mdmkdir my_repo cd my_repo git init echo hello_commit file git add file git commit -a -m Its my first commit. Exciting! git log逐条解读git init会在目录内创建.git文件夹——这正是判断某个目录是否为 Git 仓库的判据。Git 专题在问答中明确指出检查是否存在.git目录即可确认仓库身份。git add file将文件放入暂存区staging area。git commit -a -m ...中的-a会自动暂存已被跟踪文件的修改并直接提交-m提供提交信息。git log用于验证提交记录。另一种验证方式是git status它通过两次 diff 判断工作目录、暂存区与 HEAD 之间是否一致详见下文Git 内部机制。练习后的思考题提交commit带来了哪些好处提交为项目建立了可回溯的历史快照每个提交携带作者、时间与说明支持差异对比、回滚与协作同步。除了git log还有别的方式验证提交存在吗可以运行git status确认工作区干净无待提交变更或使用git show、git rev-parse HEAD查看最新提交的哈希值。动手练习二分支的力量——让开发与主线并行练习入口见 branch_01.md目标是理解分支的创建与隔离能力。任务清单选择一个已有至少一个提交的 Git 仓库或新建一个创建一个名为dev的新分支修改仓库中的某个文件创建新提交验证该提交只存在于dev分支参考答案完整解法见 branch_01_solution.mdcd some_repository echo master branch file1 git add file1 git commit -a -m added file1 git checkout -b dev echo dev branch file2 git add file2 git commit -a -m added file2验证分支隔离git log # 在 dev 分支上应看到两个提交 git checkout master git log # 回到 master应只看到一个提交背后的原理分支本质上是一个指向某条工作线最新提交的指针或引用。执行git checkout -b dev时Git 调用update-ref机制把当前分支最后一个提交的 SHA-1 写入新分支引用而 Git 之所以知道当前分支的 SHA-1靠的是.git/HEAD文件——它记录了当前分支所指向的引用路径如refs/heads/dev。git checkout some_branch执行后.git/HEAD会被更新为/refs/heads/some_branch。这些结论均来自 Git 专题问答 中 Branches 一节。练习后的思考题分支为什么有用请给出一个真实场景。分支允许开发者在隔离环境中试验改动而不影响主线例如为某个功能创建feature/xxx分支开发并自测完成后再合并回main也可以用于修复线上缺陷时快速拉出hotfix分支而不必中断其他成员的开发进度。动手练习三合并提交——用 rebase 整理历史练习入口见 squashing_commits.md目标是把多个琐碎提交压合成一个干净提交。任务清单在仓库中新建一个内容为 Mario 的文件并提交将文件内容改为 Mario Luigi 并再次提交验证存在两个独立提交将最近两个提交压合成一个参考答案完整解法见 squashing_commits.mdecho Mario new_file git add new_file git commit -m New file echo Mario Luigi new_file git commit -a -m Added Luigi git log # 确认两个提交压合提交git rebase -i HEAD~2交互式 rebase 会打开编辑器显示类似内容pick 5412076 New file pick 4016808 Added Luigi把第二个提交的指令从pick改为squashpick 5412076 New file squash 4016808 Added Luigi保存后为压合后的提交填写新的提交信息即可。注意若git rebase -i HEAD~2报错例如invalid upstream HEAD~2说明第二个提交其实是仓库的根提交root commit没有合法的父提交。此时可改用git rebase -i --root允许改写根提交或先创建一个初始提交使HEAD~2指向有效提交。练习后的思考题压合提交的理由是什么压合让历史更干净避免大量诸如 removed a character 式的琐碎提交便于代码评审与后续追溯。能否压合超过 2 个提交可以git rebase -i HEAD~N中N可以是任意大于等于 2 的整数被压合的提交统一改为squash即可。Git 基础概念问答如何判断某个目录是否为 Git 仓库检查目录中是否存在.git目录。该目录承载了版本控制的全部必要信息提交历史、远程仓库地址、HEAD 引用等它还保存了提交日志支持历史回滚相关内容见 Git 专题问答。git directory、working directory与staging area的区别这三者是 Git 工作流的三个状态区域Git 目录存放项目的元数据与对象数据库是整个 Git 的核心git clone从远程复制的正是这部分内容。工作目录项目某一版本的单一检出checkout文件从 Git 目录中的压缩数据库解压到磁盘供你使用或修改。暂存区通常位于 Git 目录内的一个简单文件记录下一次提交将包含的内容也称为 index。git pull与git fetch的区别简言之git pull git fetch git merge。git pull从远程或中央仓库获取全部变更并直接合并到你本地仓库的对应分支而git fetch只把远程变更取到本地仓库中的一个独立分支上暂存合并与否由你自行决定。如何检查文件是否被跟踪以及如何开始跟踪git ls-files file返回码为 0 表示该文件已被跟踪git blame file可查看文件历史也间接反映其跟踪状态对于新建文件运行git add FILES即可让 Git 开始跟踪。gitignore的作用.gitignore用于确保某些文件不被 Git 跟踪。若要停止跟踪一个当前已被跟踪的文件则应使用git rm --cached。此机制与你有一些文件不想让 Git 跟踪的实战场景一致把它们加入.gitignore即可保证其永远不会进入暂存区。提交前如何查看改动git diff可以比较两个提交、两个文件、一棵树与暂存区等任意两者之间的差异。git status能告诉我们什么git status帮助你理解仓库中文件的跟踪状态重点落在工作目录与暂存区上你可以获知工作目录中有哪些改动、暂存区中有哪些待提交内容以及文件是否被跟踪。unstaged的含义一个位于工作目录中、但既不在 HEAD 也不在暂存区的文件被称为 unstaged未暂存。大型仓库monorepo性能调优实战Git 专题中讨论了一个极具实战价值的场景团队使用包含数十万文件的 monorepogit status等操作耗时数秒甚至数分钟该如何优化这组问答来自 Scenarios 板块其背后原因与解法都值得展开。为什么会慢许多 Git 操作与文件系统状态强相关。以git status为例它内部会执行两次 diff一次对比 HEAD 与 index一次对比 index 与工作目录。这两次 diff 需要对海量文件发起大量lstat()系统调用当文件数量达到数十万级别时耗时自然成倍增长。解法一启用 fsmonitor文件系统监视器Git 内置了fsmonitor与 Watchman 集成。启用后Git 会启动一个守护进程持续监视工作目录的变更并缓存状态这样git status无需扫描整个工作目录而是直接使用 index 的缓存状态。如上图所示未启用 fsmonitor 时git status需对仓库全部文件逐个执行lstat()再与索引对比启用后只需借助文件系统监视器检查自索引时间戳以来发生变更的文件从而显著减少系统调用、提升速度。解法二开启feature.manyFiles配置执行git config feature.manyFiles true会同时做两件事设置index.version 4在索引中启用路径前缀压缩设置core.untrackedCachetrue默认保持keepuntracked cache 记录工作目录中所有文件与目录的 mtime后续遍历时可直接跳过 mtime 未更新的条目启用前建议先运行git update-index --test-untracked-cache做一次测试确保你的系统支持 mtime 操作。解法三周期性运行git maintenanceGit 内置git-maintenance命令可优化仓库结构使git add、git fetch等命令更快同时减少仓库占用的磁盘空间。建议周期性执行例如每天一次。解法四用 sparse checkout 精简工作目录只跟踪开发者实际使用或修改的文件——仓库中常有为运行或可访问性所需、但开发者从不修改的生成文件跟踪它们毫无价值。利用 Git 的sparse checkout功能可以避免这些文件被填充进工作目录再结合构建系统对某个组件依赖哪些文件的精确分析可以让工作目录只保留一小部分必要文件git add、git status等命令随之显著提速。分支与合并策略问答常见分支策略flowGit flowGitHub flowTrunk based development主干开发GitLab flow分支是什么分支就是一条工作线的头部的一个简单指针或引用——这是正确的说法True。如何让devel分支与main保持同步git checkout main git pull git checkout devel git merge maingit branch BRANCH背后发生了什么Git 运行update-ref把当前分支最后一个提交的 SHA-1 写入新建分支而该 SHA-1 来自.git/HEAD文件。如何把devel合并进maingit checkout main git merge devel git push origin main如何解决合并冲突打开冲突文件定位冲突内容依据团队约定与同事协商或自行决定保留哪些改动解决后用git add file_name暂存文件运行git rebase --continue完成流程熟悉哪些合并策略以下列出常用策略其中recursive是默认策略recursive递归resolve解析ours保留我方theirs保留他方什么是 Octopus merge适用于一次合并多个分支的场景也是此类场景的默认策略主要用于将多个 topic 分支打包合并git reset与git revert的区别git revert会创建一个新提交来撤销上一次提交的改动历史被保留git reset的行为取决于用法它可以修改 index也可以改变分支头branch head当前指向的提交。变基Rebase与日常操作问答如何把第四个提交移到最上面使用git rebase命令。什么时候使用git rebase典型场景团队在从main拉出的feature分支上完成开发后希望把功能分支合并回main且不保留功能分支上零散的提交历史此时git rebase非常有用。如何将某个文件回退到之前的提交git checkout HEAD~1 -- /path/of/the/file如何撤销本地文件的改动提交前git checkout -- file_name如何丢弃本地提交git reset HEAD~1用于移除最近一次提交若想连同改动一起丢弃使用git reset --hard。如何删除远程分支使用语法git push origin :[branch_name]。gitattributes 是什么何时使用gitattributes允许按路径名或路径模式定义属性。例如可用它统一不同平台的行尾符Windows 与 Unix 分别使用\r\n和\n在.gitattributes中写入* textauto即可让 Windows 用户得到\r\n、Unix/Linux 用户得到\n。从 Git 移除文件但保留在文件系统上说法使用git rm可从 Git 移除文件但保留在文件系统是False。若想保留文件于文件系统应使用git reset file_name。深入 Git 内部diff 与对象模型如何列出仓库当前的引用referencesfind .git/refs/git diff能做什么比较两个提交、两个文件、一棵树与暂存区等等任意两者的差异。git diff-index HEAD与git diff HEAD哪个更快git diff-index更快但公平地说是因为它做得更少——它不检查内容只比对元数据如时间戳。git diff还被哪些 Git 命令使用git status内部使用 diff 机制做比较以此告知用户哪些文件被跟踪以及当前的状态。git status是如何工作的简言之它内部运行两次git diff对比 HEAD 与暂存区对比暂存区与工作目录为什么git status在大型仓库中依然相对快一方面源于数据结构每个提交中的文件存储在 tree 对象中index 是 tree 对象的扁平化结构index 中所有文件都带有预计算的哈希diff 操作本质上是在比较哈希另一方面源于缓存index 会缓存工作目录的信息当 Git 已缓存某个文件的信息时无需再去查看工作目录中的对应文件这两点与上文 monorepo 性能问答中提到的lstat()系统调用、fsmonitor、untracked cache 形成了完整呼应理解 Git 的对象模型与缓存机制是排查大型仓库性能问题的前提。结语用练习 问答驱动 Git 能力提升本指南完整复现了 devops-exercises Git 专题的三个练习commit_01.md、branch_01.md、squashing_commits.md及其配套解法commit_01_solution.md、branch_01_solution.md、squashing_commits.md并系统梳理了 Git 专题问答 中的基础概念、场景优化、分支合并、变基、diff 与内部机制。建议按先动手做练习、再自测问答、最后针对薄弱点重做练习的节奏使用练习负责把命令变成肌肉记忆问答负责把原理变成知识体系——两者结合正是应对 Git 面试与实际工程问题的有效路径。赞分享文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载相关推荐devops-exercises 实战Git 首次提交完整指南——从 git init 到 commit 与 git log 验证devops exercises 实战Git 首次提交完整指南——从 git init 到 commit 与 git log 验证 本篇以 devops ex文档教程DevOps运维devops-exercises Git 实战完成你的第一次提交Commit 01从仓库初始化到提交验证devops exercises Git 实战完成你的第一次提交Commit 01从仓库初始化到提交验证 本篇文章围绕 devops exercises文档教程DevOps运维Open Generative AI移动应用开发进展跨平台AI创作新体验Open Generative AI移动应用开发进展跨平台AI创作新体验 Open Generative AI作为开源AI视频平台的替代方案正在积极拓展移动AI 应用媒体生成大模型创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考