13个Git面试必备问题 *
最优秀的Git开发人员和工程师可以回答的基本问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.
现在就雇佣一名优秀的Git开发人员面试问题
git获取
只从远程存储库下载新数据, 但它不会将任何下载的数据集成到您的工作文件中. 它所做的只是提供这些数据的视图.
git拉
从远程存储库下载数据并将其合并到本地工作文件中. 如果您的本地更改尚未提交,它还可能导致合并冲突. 使用 git藏
命令来隐藏本地更改.
一个或多个提交可以通过使用 git恢复. 这个命令, 在本质上, 创建一个带有补丁的新提交,这些补丁可以取消在特定提交中引入的更改. 如果需要恢复的提交已经发布,或者不能更改存储库历史记录, git恢复 可以用来恢复提交吗. 运行以下命令将恢复最后两次提交:
git恢复 HEAD~2..HEAD
另外, 用户总是可以检出过去某个特定提交的状态, 再来一次.
将多个提交压缩为单个提交将覆盖历史记录, 而且应该谨慎行事. 但是,在功能分支中工作时,这很有用. 压缩当前分支的最后N个提交, 运行以下命令({N}替换为你想要压缩的提交数):
git变基 -i HEAD~{N}
运行此命令后,将打开一个编辑器,其中包含这N个提交消息的列表,每行一个. 每一行都以单词“pick”开头. 将“pick”替换为“squash”或“s”将告诉Git将提交与之前的提交合并. 要将所有N个提交合并为一个提交,请将列表中的每个提交设置为squash,除了第一个提交. 退出编辑器后,如果没有冲突发生, git变基 是否允许您为新的合并提交创建新的提交消息.
申请加入Toptal的发展网络
并享受可靠、稳定、远程 自由Git开发者职位
Git diff-tree -r {hash}
给定提交散列,它将列出在该提交中更改或添加的所有文件. The -r 标志使命令列表单独的文件, 而不是将它们仅折叠成根目录名称.
输出还将包括一些额外的信息, 这可以通过包含几个标志来很容易地抑制:
Git diff-tree——no-commit-id——name-only -r {hash}
Here ——no-commit-id 将阻止提交哈希出现在输出中,并且 ——名义 将只打印文件名,而不是它们的路径.
将脚本配置为每次存储库通过推送接收新提交时运行, 需要定义一个预接收, 更新, 或者一个post-receive钩子,具体取决于何时需要触发脚本.
当提交被推送到目标存储库中时,将调用目标存储库中的预接收钩子. 任何绑定到此钩子的脚本都将在任何引用更新之前执行. 这是一个有用的钩子,可以运行脚本,帮助执行开发策略.
更新钩子的工作方式与预接收钩子类似, 并且在实际进行任何更新之前也会触发. 然而, 每次提交被推送到目标存储库时,都会调用更新钩子一次.
最后, 在更新被接收到目标存储库之后,调用存储库中的Post-receive钩子. 这里是配置简单部署脚本的理想场所, 调用一些持续集成系统, 向存储库维护者发送通知电子邮件, etc.
钩子在每个Git存储库中都是本地的,不受版本控制. 脚本可以在hooks目录中创建。.git”目录, 也可以在其他地方创建脚本,并将指向这些脚本的链接放在目录中.
Git提供了一种相当有效的机制来查找错误提交. 而不是让用户尝试每一个提交,以找出第一个引入某些特定问题的代码, git平分 允许用户对存储库的整个历史执行一种二进制搜索.
通过发出命令 Git等分启动,存储库进入对分模式. 在此之后,你所要做的就是识别一个好的和一个坏的提交:
Git bisect bad #将当前版本标记为bad
Git bisect good {hash或tag} #将给定的hash或tag标记为良好,理想情况下是一些较早的提交
一旦完成了这些,Git就会有一系列需要探索的提交. 每一步, 它将签出这个范围内的某个提交, 并要求你识别它是好是坏. 在此之后,这个区间将被有效地减半, 而且整个搜索所需的步骤比范围内实际提交的数量要少得多. 一旦发现第一个错误提交, 或者需要结束平分模式, 可以使用以下命令退出模式并重置对分状态:
Git等分复位
在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可以用来跟踪第二个父节点.
最后是规格. 它们用于将本地和远程分支映射在一起. 然而, 这些可用于引用驻留在远程分支上的提交,允许从本地Git环境控制和操作它们.
简单来说, git变基 允许将分支的第一次提交移动到新的起始位置. 例如, 如果一个特性分支是从master创建的, 从那时起,主分支收到了新的提交, git变基 可以用来将特征分支移动到master的尖端吗. 该命令将有效地重播在master尖端的特性分支中所做的更改, 允许冲突在过程中得到解决. 小心行事, 这将允许功能分支相对容易地合并到主分支中,有时甚至是一个简单的快进操作.
这可以通过绑定到存储库的预提交钩子的简单脚本来完成. 预提交钩子在提交之前被触发, 甚至在要求您输入提交消息之前. 在这个脚本中可以运行其他工具, 例如检查,并对提交到存储库的更改执行完整性检查. 例如,如下脚本:
#!/bin/sh
文件=$(git diff——cached——name-only——diff-filter=ACM | grep ').go$')
if [ -z files ]; then
退出0
fi
unmtd =$(gofmt -l $files)
if [ -z unfmtd ]; then
退出0
fi
回声“一些 .Go文件不会被fmt。
出口1
检查是否有 .即将提交的go文件需要通过标准的go源代码格式化工具 gofmt. 以非零状态退出, 该脚本有效地防止将提交应用到存储库.
在reflog中签出对该分支的最新提交,然后将其作为新分支签出.
你需要使用 择优挑选
command. 它提供了回放现有提交到当前位置/分支的可能性. 因此,您需要切换到目标分支(例如.g. Git签出开发
)和呼叫
Git 择优挑选{提交的哈希值}
.
尽管应用了相同的更改, 这将是一个带有新散列的新提交,因为更改应用于不同的目标.
Cherry-pick使用diff来查找分支之间的差异.
由于合并提交属于不同的分支,它有两个父类和两个更改集.
例如,如果您有合并提交ref 63年ad84c
,你必须详细说明 -m
然后使用parent 1
作为基础:
Git checkout release_branch
Git cherry pick -m 1 63年ad84c
当多个必须合并的提交在同一位置或同一行代码中有一些更改时,就会出现冲突. Git将无法预测哪个更改应该优先执行. 这是一个git冲突.
解决git中的冲突, 编辑文件以修复冲突的更改,然后通过运行添加已解决的文件 git添加
. 之后,要提交修复后的合并,请运行 git提交
. Git会记住你正处于合并过程中,所以它会正确设置提交的父节点.
面试不仅仅是棘手的技术问题, 所以这些只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能回答所有的问题, 回答所有问题也不能保证成为A级考生. 一天结束的时候, 招聘仍然是一门艺术,一门科学,需要大量的工作.
为什么Toptal
提出面试问题
提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.
寻找Git开发人员?
寻找 Git开发者? 查看Toptal的Git开发人员.
亚历山大Korzynski
Aleksander是一位资深的Linux工程师,他帮助组织实现战略软件交付目标, 比如敏捷性, 可靠性, 和安全. 作为Toptal/Google的承包商,他设计了一个支持近1000名开发人员的CD管道. 在剑桥大学, he tuned the performance of applications in a >£1 million Linux HPC cluster. Aleksander可以配置云、CI/CD和发布自动化.
显示更多德米特里•Ryazantsev
Dmitry是一名有六年多经验的安卓开发人员,他善于沟通,总是试图找到最适合项目的技术. 他在Git、Lua (Corona SDK)、RxJava和Dagger方面经验丰富. 他与一个庞大的团队合作开发了安装量超过1000万的Yandex浏览器. 他还开发了自己的项目——一款250人的游戏,000个安装,并发布了其他几个应用程序.
显示更多Jakob Laegdsmand
Jakob是一位具有广泛专业知识的web开发人员和解决方案架构师, 15年以上工作经验,优秀的沟通能力. 作为一名工匠和纯粹主义者,他努力始终如一地交付原始代码. 他最擅长的是使可持续发展和创造性的组织实现他们的目标,并构建工具/仪表板来帮助他们完成任务. Jakob独立工作,在团队中表现出色. 他创立了自己的软件即服务产品“我的根”.
显示更多Toptal连接 Top 3% 世界各地的自由职业人才.
加入Toptal社区.