13个Git面试必备问题 *

最优秀的Git开发人员和工程师可以回答的基本问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.

现在就雇佣一名优秀的Git开发人员
Toptal标志是顶级自由软件开发人员的专属网络吗, 设计师, 金融专家, 产品经理, 和世界上的项目经理. 顶级公司雇佣Toptal自由职业者来完成他们最重要的项目.

面试问题

1.

两者的区别是什么 git拉 and git获取?

查看答案

git获取 只从远程存储库下载新数据, 但它不会将任何下载的数据集成到您的工作文件中. 它所做的只是提供这些数据的视图.

git拉 从远程存储库下载数据并将其合并到本地工作文件中. 如果您的本地更改尚未提交,它还可能导致合并冲突. 使用 git藏 命令来隐藏本地更改.

2.

如何还原已经推送并公开的提交?

查看答案

一个或多个提交可以通过使用 git恢复. 这个命令, 在本质上, 创建一个带有补丁的新提交,这些补丁可以取消在特定提交中引入的更改. 如果需要恢复的提交已经发布,或者不能更改存储库历史记录, git恢复 可以用来恢复提交吗. 运行以下命令将恢复最后两次提交:

git恢复 HEAD~2..HEAD

另外, 用户总是可以检出过去某个特定提交的状态, 再来一次.

3.

如何将最后的N次提交压缩成一次提交?

查看答案

将多个提交压缩为单个提交将覆盖历史记录, 而且应该谨慎行事. 但是,在功能分支中工作时,这很有用. 压缩当前分支的最后N个提交, 运行以下命令({N}替换为你想要压缩的提交数):

git变基 -i HEAD~{N}

运行此命令后,将打开一个编辑器,其中包含这N个提交消息的列表,每行一个. 每一行都以单词“pick”开头. 将“pick”替换为“squash”或“s”将告诉Git将提交与之前的提交合并. 要将所有N个提交合并为一个提交,请将列表中的每个提交设置为squash,除了第一个提交. 退出编辑器后,如果没有冲突发生, git变基 是否允许您为新的合并提交创建新的提交消息.

申请加入Toptal的发展网络

并享受可靠、稳定、远程 自由Git开发者职位

申请成为自由职业者
4.

如何找到在特定提交中已更改的文件列表?

查看答案
Git diff-tree -r {hash}

给定提交散列,它将列出在该提交中更改或添加的所有文件. The -r 标志使命令列表单独的文件, 而不是将它们仅折叠成根目录名称.

输出还将包括一些额外的信息, 这可以通过包含几个标志来很容易地抑制:

Git diff-tree——no-commit-id——name-only -r {hash}

Here ——no-commit-id 将阻止提交哈希出现在输出中,并且 ——名义 将只打印文件名,而不是它们的路径.

5.

如何设置一个脚本,使其在每次存储库通过推送接收新提交时运行?

查看答案

将脚本配置为每次存储库通过推送接收新提交时运行, 需要定义一个预接收, update, 或者一个post-receive钩子,具体取决于何时需要触发脚本.

当提交被推送到目标存储库中时,将调用目标存储库中的预接收钩子. 任何绑定到此钩子的脚本都将在任何引用更新之前执行. 这是一个有用的钩子,可以运行脚本,帮助执行开发策略.

更新钩子的工作方式与预接收钩子类似, 并且在实际进行任何更新之前也会触发. However, 每次提交被推送到目标存储库时,都会调用更新钩子一次.

Finally, 在更新被接收到目标存储库之后,调用存储库中的Post-receive钩子. 这里是配置简单部署脚本的理想场所, 调用一些持续集成系统, 向存储库维护者发送通知电子邮件, etc.

钩子在每个Git存储库中都是本地的,不受版本控制. 脚本可以在hooks目录中创建。.git”目录, 也可以在其他地方创建脚本,并将指向这些脚本的链接放在目录中.

6.

What is git平分? 如何使用它来确定(回归)bug的来源?

查看答案

Git提供了一种相当有效的机制来查找错误提交. 而不是让用户尝试每一个提交,以找出第一个引入某些特定问题的代码, git平分 允许用户对存储库的整个历史执行一种二进制搜索.

通过发出命令 Git等分启动,存储库进入对分模式. 在此之后,你所要做的就是识别一个好的和一个坏的提交:

Git bisect bad #将当前版本标记为bad
Git bisect good {hash或tag} #将给定的hash或tag标记为良好,理想情况下是一些较早的提交

一旦完成了这些,Git就会有一系列需要探索的提交. 每一步, 它将签出这个范围内的某个提交, 并要求你识别它是好是坏. 在此之后,这个区间将被有效地减半, 而且整个搜索所需的步骤比范围内实际提交的数量要少得多. 一旦发现第一个错误提交, 或者需要结束平分模式, 可以使用以下命令退出模式并重置对分状态:

Git等分复位
7.

引用提交的不同方式有哪些?

查看答案

在Git中,每个提交都有一个唯一的哈希值. 这些散列可用于在各种场景中标识相应的提交(例如在尝试使用 Git checkout {hash} 命令).

此外,Git还维护了一些特定提交的别名,称为refs. Also, 您在存储库中创建的每个标签都有效地成为ref(这就是为什么您可以在各种git命令中使用标签而不是提交哈希)。. Git还维护了一些特殊的别名,这些别名会根据存储库的状态而变化, 例如HEAD, FETCH_HEAD, MERGE_HEAD, etc.

Git还允许提交作为相对提交来引用. 例如, HEAD~1指的是HEAD的提交父节点, HEAD~2是指HEAD的祖父级, 等等......。. 在合并提交情况下, 哪个提交有两个父节点, ^可用于选择两个父节点中的一个, e.g. HEAD^2可以用来跟踪第二个父节点.

最后是规格. 它们用于将本地和远程分支映射在一起. However, 这些可用于引用驻留在远程分支上的提交,允许从本地Git环境控制和操作它们.

8.

What is git变基 以及如何在合并前使用它来解决特性分支中的冲突?

查看答案

简单来说, git变基 允许将分支的第一次提交移动到新的起始位置. 例如, 如果一个特性分支是从master创建的, 从那时起,主分支收到了新的提交, git变基 可以用来将特征分支移动到master的尖端吗. 该命令将有效地重播在master尖端的特性分支中所做的更改, 允许冲突在过程中得到解决. 小心行事, 这将允许功能分支相对容易地合并到主分支中,有时甚至是一个简单的快进操作.

9.

如何配置Git存储库,以便在提交之前运行代码完整性检查工具, 并在测试失败时防止他们?

查看答案

这可以通过绑定到存储库的预提交钩子的简单脚本来完成. 预提交钩子在提交之前被触发, 甚至在要求您输入提交消息之前. 在这个脚本中可以运行其他工具, 例如检查,并对提交到存储库的更改执行完整性检查. 例如,如下脚本:

#!/bin/sh
文件=$(git diff——cached——name-only——diff-filter=ACM | grep ').go$')
if [ -z files ]; then
    exit 0
fi
unmtd =$(gofmt -l $files)
if [ -z unfmtd ]; then
    exit 0
fi
回声“一些 .Go文件不会被fmt。
exit 1

检查是否有 .即将提交的go文件需要通过标准的go源代码格式化工具 gofmt. 以非零状态退出, 该脚本有效地防止将提交应用到存储库.

10.

你的一个队友不小心删除了一个分支, 并且已经将这些更改推送到git中央仓库. 没有其他git仓库,你的其他队友也没有本地副本. 你将如何恢复这个分支?

查看答案

在reflog中签出对该分支的最新提交,然后将其作为新分支签出.

11.

如何将一个分支中的提交复制到另一个分支中.g. 从已发布分支提交到当前开发分支的热修复?

查看答案

你需要使用 择优挑选 command. 它提供了回放现有提交到当前位置/分支的可能性. 因此,您需要切换到目标分支(例如.g. Git签出开发)和呼叫 Git 择优挑选{提交的哈希值}.

尽管应用了相同的更改, 这将是一个带有新散列的新提交,因为更改应用于不同的目标.

12.

如何挑选合并提交?

查看答案

Cherry-pick使用diff来查找分支之间的差异.

由于合并提交属于不同的分支,它有两个父类和两个更改集.

例如,如果您有合并提交ref 63年ad84c,你必须详细说明 -m 然后使用parent 1 作为基础:

Git checkout release_branch
Git cherry pick -m 1 63年ad84c
13.

git中的冲突是什么?如何解决?

查看答案

当多个必须合并的提交在同一位置或同一行代码中有一些更改时,就会出现冲突. Git将无法预测哪个更改应该优先执行. 这是一个git冲突.

解决git中的冲突, 编辑文件以修复冲突的更改,然后通过运行添加已解决的文件 git add. 之后,要提交修复后的合并,请运行 git提交. Git会记住你正处于合并过程中,所以它会正确设置提交的父节点.

面试不仅仅是棘手的技术问题, 所以这些只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能回答所有的问题, 回答所有问题也不能保证成为A级考生. 一天结束的时候, 招聘仍然是一门艺术,一门科学,需要大量的工作.

为什么Toptal

厌倦了面试候选人? 不知道该问什么才能让你得到一份好工作?

让Toptal为你找到最合适的人.

现在就雇佣一名优秀的Git开发人员

我们的Git开发者专属网络

希望找到一份Git开发人员的工作?

让Toptal为你找到合适的工作.

申请成为Git开发者

工作机会从我们的网络

提出面试问题

提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.

*所有字段均为必填项

寻找Git开发人员?

寻找 Git开发者? 查看Toptal的Git开发人员.

查尔斯·库克博士.D.

自由Git开发人员

美国Toptal成员 Since 2014年7月29日

查尔斯有博士学位.D. 并花了三年时间为NASA开发定制数据处理和分析程序. 他的专长是可扩展, 企业级应用程序开发和高吞吐量工程解决方案. 他也是GreatVocab的创始人和所有者.为此,他利用数据分析和控制理论中的新概念开发了核心系统.

显示更多

Darin Erat Sleiter

自由Git开发人员

BrazilToptal成员 Since 2016年10月11日

Darin是一名数据科学家和工程师,拥有斯坦福大学物理学博士学位. 他对数据和机器学习充满热情,并参与了许多行业和应用程序的数据科学项目. 达林与人共同创立了一家人工智能公司,并领导了一个数据科学家团队,开发了一款使用机器学习和优化技术来降低数据中心能耗的产品. 他急切地等待着量子计算机的出现.

显示更多

安东尼·范教授

自由Git开发人员

美国Toptal成员 Since 2018年10月18日

Antoine是一位经验丰富的专业人士,拥有独特的技能和对软件开发的热情, 使他在任何环境下都是无价的财富. 他的专业知识涵盖了开发周期的所有阶段, 从在初创公司组建工程团队到管理预算, 体系结构, 和财富500强公司的流程. 他对软件开发坚定不移的热情促进了创造性思维和协作, 激励团队达到新的高度.

显示更多

Toptal连接 Top 3% 世界各地的自由职业人才.

加入Toptal社区.

了解更多