Tracks
Git 是现代开发者工具箱中的必备工具,以其强大的版本控制能力而闻名。它由 Linus Torvalds 于 2005 年创建,用于支持 Linux 内核的开发,自此成为全球无数软件项目的基石。Git 在管理项目版本方面高效灵活,并为协作提供了有力支持,使其成为各种规模团队不可或缺的工具。
本文旨在通过涵盖从初级到高级的 20 个顶级 Git 面试题,帮助您为技术面试做好准备。无论您是 Git 新手还是希望加深理解,这些问答都将帮助您展示熟练度,顺利通过面试。
基础 Git 面试题
如果您对 Git 还比较陌生,面试中的一些基础问题很可能会围绕入门概念和基本用法。如果需要复习,务必查看 DataCamp 的Git 入门课程。
什么是 Git 仓库?
Git 仓库存储项目文件及其修订历史,并通过跟踪随时间发生的更改来实现版本控制。它可以位于您设备上的本地文件夹,或托管在 GitHub 等在线平台上。借助仓库,用户可以协作、回退到先前版本,并通过 commit、push、pull 等命令高效管理项目开发。
Git 的工作原理是什么?
Git 通过记录项目中文件和目录的更改来运作,捕捉其不断演进的“快照”。用户可以查看更改、创建分支以便并行开发、合并分支,并在需要时回退到先前状态。它同时促进协作,确保软件开发中的有效版本控制。
什么是 git add?
git add 命令用于将更改加入暂存区,以便纳入下一次提交。它会准备工作目录中文件的修改、添加或删除,将其标记为将包含在即将到来的提交快照中。请注意,该命令不会真正提交更改,而是为暂存做准备。
什么是 git push?
git push 命令用于将本地仓库的内容上传到远程仓库。它会把本地仓库中已提交的更改传输到远程仓库,通常托管在 GitHub 或 GitLab 等服务器上。该命令通过让用户与项目成员共享更改来实现协作。
您可以在我们单独的教程中进一步了解Git 的 push 与 pull。
什么是 git status?
git status 命令用于显示 Git 仓库的当前状态。它提供哪些文件被修改、哪些已暂存等待下次提交、哪些未被跟踪等信息。它有助于用户跟踪工作进度,并识别需要提交或暂存的更改。
Git 中的提交(commit)是什么?
提交(commit)表示在某一时间点对仓库中文件更改的快照。当您在 Git 中提交更改时,实际上是保存了当前文件状态,并可附上描述性消息来说明所做的更改(推荐这样做)。
每次提交都会创建一个唯一标识符,使您能够跟踪仓库中的变更历史。提交在版本控制中至关重要,因为它们提供了回退到项目先前状态、审查变更历史以及通过共享更新与他人协作的方式。

查看 DataCamp 的Git 速查表,助您备战面试
Git 中的分支是什么?
分支是指从主开发线(通常称为main,过去称为master 分支)分出,以便在不影响主代码库的情况下开发新功能、修复问题或进行试验。它允许在同一仓库中并行存在多条开发线。
每个分支代表独立的开发线及其各自的提交,使开发者能够同时处理不同的功能或修复。分支有助于项目内的协作、试验与组织;当某个分支上的更改完成并通过测试后,可以将其合并回主代码库。
Git 中的冲突是什么?
当不同贡献者对同一文件的同一部分进行相互冲突的更改时(通常发生在合并或变基操作期间),就会产生冲突。Git 无法自动解决这些冲突,需要用户手动干预以消除不一致。
要解决冲突,打开受影响的文件——Git 会用 <<<<<<<、======= 和 >>>>>>> 标记出冲突区。编辑文件保留正确版本,移除这些标记,然后:
git add <resolved-file>
git commit
git mergetool 可以让这一过程更直观、易于操作。Git 中的合并(merge)是什么?
合并是 Git 中的基础操作,有助于协作与跨分支整合更改。具体而言,合并是将不同分支上的更改合并到一个分支(通常是主分支,如 master 或 main)的过程。
合并会把一个分支上的更改整合到另一个分支中,生成一个新的提交,将两个分支的历史合并在一起。您可以在我们的单独教程中了解更多如何解决 Git 合并冲突。
中级 Git 面试题
什么是 Git 中的远程仓库(remote)?
远程仓库是在服务器或另一台计算机上托管的仓库,用于协作与共享代码。它充当集中位置,开发者可以将本地更改 push 上去,也可以 pull 下他人的更改。
远程仓库通常设置在 GitHub、GitLab 或 Bitbucket 等托管平台上,它们通过提供一个公共位置来存储与同步项目代码,从而支持分布式开发并促进团队合作。
如何回退一个已经被推送并公开的提交?
可以使用 git revert <commit-hash> 命令来回退已经被推送并公开的提交。
具体步骤如下:
1. 通过找到提交哈希来确定要回退的提交。可使用 git log 查看提交历史并定位目标提交的哈希。
2. 获得提交哈希后,使用 git revert 命令加上该哈希,创建一个新提交来撤销该提交引入的更改。例如:
git revert <commit-hash>
3. Git 会打开文本编辑器以填写回退提交的提交消息。您可按需编辑,然后保存并关闭编辑器。
4. 保存提交消息后,Git 将创建一个新提交,实质上撤销了指定提交引入的更改。该新提交会加入历史,等效回退原始提交所做的更改。
5. 最后,将该新提交 push 到远程仓库以公开回退,命令如下:
git push origin <branch-name>
使用 git revert 会创建一个新提交来撤销原提交引入的更改,既能完成回退,又不会更改提交历史。相比之下,git reset 或 git amend 可能会改写历史,从而给已经拉取了这些更改的协作者带来问题,因此 revert 更安全。
什么是 git stash?
git stash 是一个用于临时保存尚未准备好提交的工作区更改的命令。它允许开发者在不提交到仓库的情况下保存修改。
当您需要切换分支且不想提交或丢失当前更改时,stash 很有用。之后,您可以将暂存的更改应用回工作目录,或从栈中弹出以继续处理。
什么是 git reflog?
git reflog 用于查看引用日志,记录对 HEAD 指针的更改以及仓库中被检出的提交历史。它按时间顺序列出在仓库中执行的最近操作,包括提交、检出、合并和重置等。
reflog 有助于恢复丢失的提交或分支,并帮助理解仓库中操作的先后顺序。
如何让一个已存在的本地分支跟踪远程分支?
可使用 git branch 命令配合 --set-upstream-to 或 -u 选项,并跟上远程分支名称来设置跟踪关系。
语法如下:
git branch --set-upstream-to=<remote-name>/<branch-name>
或
git branch -u <remote-name>/<branch-name>
高级 Git 面试题
如何在 Git 中为不同项目管理多套配置?
要处理多种配置,可将 git config 命令与 --global、--system 或 --local 标志结合使用,在不同层级调整配置。或者在 Git 配置中使用 includeIf,根据仓库路径有条件地引入特定设置。
如何在 Git 中处理大文件?
大文件会影响仓库体积和性能,处理起来具有挑战。可使用 Git LFS 将大文件存储在 Git 仓库之外,同时在仓库中保留指向它们的轻量级指针。这能减小仓库体积并提升性能。Git LFS 支持多种存储提供方,并能与 Git 工作流无缝集成。
git submodule 的用途是什么?如何更新子模块?
git submodule 用于管理 Git 仓库中的外部依赖。它允许您将外部仓库作为子模块包含在主仓库中。当您希望引入外部代码且与主项目代码库保持分离时,这非常有用。
在 Git 中更新子模块,可按以下步骤进行:
-
进入主仓库中子模块所在的目录。
-
使用
git fetch从子模块的远程仓库获取最新更改。 -
若要更新到子模块所跟踪分支的最新提交,可使用
git pull。 -
或者,若要更新到特定提交或分支,可使用
git checkout并跟上目标提交哈希或分支名。 -
将子模块更新到期望状态后,需要在主仓库中提交这些更改,以反映子模块的新状态。
什么是 git cherry-pick?在何种情况下会用到?
git cherry-pick 允许您将某一分支上的特定提交应用到另一分支,而无需合并整个分支。
git cherry-pick <commit-hash>
main 分支修复,但您也需要该修复出现在 release 分支——您可以仅 cherry-pick 那个提交,而不是把整个 main 合并进 release。当某个提交被误提交到错误分支时也很有用:将其 cherry-pick 到正确分支,然后在不该存在的分支上回退该提交。
什么是 git bisect?它用于做什么?
git bisect 是一种调试工具,使用二分查找来定位引入缺陷的具体提交。无需手动逐个检出提交,您只需告诉 Git 哪个提交是“good”(无 bug),哪个是“bad”(含 bug),Git 会检出介于两者之间的提交,每次将搜索空间减半,直到找到元凶。
git bisect start
git bisect bad # 当前提交有缺陷
git bisect good <commit-hash> # 这个更早的提交是正常的
# Git 会检出一个中间提交;您进行测试,然后:
git bisect good # 或 git bisect bad
# 重复,直到 Git 找到第一个有问题的提交
git bisect reset # 完成后回到原始状态
在拥有数百次提交的大型仓库中,这比人工搜索要快得多。
什么是 Git hooks?它们如何使用?
Git hooks 是在 Git 工作流的特定时刻自动运行的脚本。它们位于仓库的 .git/hooks/ 目录中,可用任意脚本语言编写。
主要有两类:
-
客户端钩子在本地机器上运行——例如
pre-commit(在创建提交之前运行)或commit-msg(校验提交消息格式)。 -
服务器端钩子在远程服务器上运行——例如
pre-receive(在接收推送的提交之前运行)。
常见用法是在 pre-commit 钩子中自动运行代码规范检查或测试集,以在提交前把关,从而在团队中统一代码质量标准。
请注意,钩子在克隆仓库时并不会被复制,因此依赖钩子的团队通常通过单独脚本或如 pre-commit(Python 包)等工具来共享它们。
常被混淆的 Git 概念问答
git fetch 与 git pull 有何区别?
git fetch 与 git pull 的主要区别在于它们的作用及如何更新本地仓库。
git fetch 会将远程仓库的更改取回到本地仓库。它会更新本地的远程跟踪分支(如 origin/master)以反映远程仓库的状态,但不会更新工作目录,也不会将任何更改合并到当前分支。这意味着在 fetch 之后,您可以先审查远程仓库中的更改,而不影响本地工作。
git pull 同样会从远程仓库取回更改,但更进一步:它在一步中完成获取并将更改合并到当前分支。本质上,它等同于先执行 git fetch,然后执行 git merge,将远程更改并入当前分支。
git reset 有什么作用?
git reset 命令用于将当前 HEAD 重置到指定状态。这意味着它可用于撤销更改、取消暂存文件,或将 HEAD 指针移动到另一个提交。注意,git reset 有三种主要模式:
--soft:将 HEAD 指针重置到特定提交,但保留更改在暂存区。文件在工作目录中仍保持修改状态,您可以重新提交。
--mixed:将 HEAD 指针重置到特定提交,但取消暂存更改。文件在工作目录中仍保持修改状态,但不会暂存用于提交。
--hard:将 HEAD 指针重置到特定提交,并丢弃工作目录和暂存区中的所有更改。请谨慎使用,因为它会永久删除未提交的更改。
重要:切勿对已推送到共享远程分支的提交使用 git reset --hard。它会改写历史,并给已经拉取这些提交的队友带来严重问题。针对公共提交,请改用 git revert。
git push --force-with-lease 相较于 git push --force 有何重要意义?
git push --force-with-lease 是比 git push --force 更为谨慎的强制推送方式,因为它能防止意外覆盖他人在远程仓库上的更改。
当您使用 git push --force 时,无论自上次 fetch 以来远程是否被他人更新,都会强制推送,可能导致其他开发者的工作被无意覆盖。
相比之下,git push --force-with-lease 更安全。它会检查您要推送的远程分支自上次 fetch 起是否已被他人更新;若已更新,则拒绝本次推送,从而避免无意中覆盖他人更改。
什么是 git rebase?它与 git merge 有何不同?
git rebase 与 git merge 都能将一个分支的更改集成到另一个分支,但方式不同。
-
git merge会创建一个新的“合并提交”,将两个分支的历史合并在一起。这保留了分支何时分叉与合并的完整历史,有利于审计与团队透明度。 -
git rebase会将一个分支上的提交移动或重放到另一个分支之上,生成干净、线性的提交历史而不含合并提交。这让日志更易阅读,但会改写提交历史。因此变基的黄金法则是:切勿对他人正在协作的分支进行 rebase。
git clone 与 git fork 有何区别?
克隆(Cloning)会在您的机器上创建远程仓库的本地副本。您仍连接到同一个仓库,并可在有权限的情况下将更改推回去。
git clone https://github.com/user/repo.git
对于无权直接写入原仓库的开源贡献者而言,fork 是标准工作流程。
如何准备 Git 面试
在面试中展示您的 Git 知识与经验,对于体现您在版本控制与团队协作方面的能力至关重要。
以下是准备技术面试时应遵循的一些建议,帮助您有效传达自己的 Git 技能:
掌握 Git 基础
确保您扎实掌握 Git 基础,包括仓库、分支、合并、提交,以及 pull、push、clone、commit 等基本命令。这些基础将构成面试交流的核心。同时,深入理解版本控制等关键原理,弄清 Git 与其他版本控制系统的差异也很有帮助。
最后,熟悉多种 Git 方法论,如 Git Flow、GitHub Flow 和 GitLab Flow。评估各自的优缺点,并明确它们各自最适用的场景。
我们的Git 完全指南是熟悉这些基础知识的良好起点。
积累动手经验
使用 Git 越多,知识就越扎实。经常练习能提升您对各种命令与流程的熟悉度。尽量将 Git 融入日常工作以增加实践机会,务必尝试创建分支、进行合并并解决冲突。
如果您不确定该做哪些项目来获得 Git 的实操经验,参与 GitHub 等平台上的开源项目,是接触行业标准协作工具与工作流的绝佳途径。
了解常见问题及其排查方法
使用 Git 时难免会遇到问题。常见问题包括合并冲突、游离(detached)HEAD 状态、回退更改以及恢复丢失的提交。诊断 Git 问题不仅能提升故障排查能力,也能加深对 Git 底层机制的理解。
通过主动排错并分析错误信息,您将洞悉 Git 的内部工作原理,并能更高效地定位与解决问题。这种积极做法既能降低潜在风险,也能有效建立管理版本控制流程的信心与专业度。
练习模拟面试
通过参与模拟面试,候选人可以识别自己在 Git 知识与沟通技巧方面的薄弱环节,从而更有针对性地进行准备。
此外,模拟面试还能让候选人通过处理真实感很强的 Git 场景与编码练习来打磨问题解决能力。这样的实操练习有助于增强对 Git 的信心,并提升在面试中清晰表达思路的能力。
结语
Git 是广泛用于软件开发的强大版本控制系统,可用于管理代码变更、与他人协作并维护项目历史。在技术面试中熟悉 Git 至关重要:它体现您对关键开发工具与工作流的熟练掌握,展示协作能力,并突显您在团队环境中高效管理代码的能力。
此外,理解 Git 的概念与命令能促成高效的版本控制实践,确保代码完整性、项目连续性与开发流程的顺畅。因此,对于正在应对技术面试并追求成功职业发展的软件工程师与开发者而言,Git 知识极其宝贵。
若想继续学习,请查看以下资源: