关于 Git 的 20 个面试题[每日前端夜话0x75]

关于 Git 的 20 个面试题[每日前端夜话0x75]

疯狂的技术宅 前端先锋 前端

每日前端夜话0x75
每日前端夜话,陪你聊前端。
天天晚上18:00准时推送。
正文共:3604 字
预计阅读时间: 10 分钟
翻译:疯狂的技术宅
来源:edurekagit

关于 Git 的 20 个面试题[每日前端夜话0x75]

我在工做中很喜欢 Git 。 Git 在许多开发团队中扮演着重要的角色。面试

关于 Git 面试的第一个问题必须是:算法

Q1. Git和SVN有什么区别?


关于 Git 的 20 个面试题[每日前端夜话0x75]

Q2. 什么是Git?


我建议你先经过了解 git 的架构再来回答这个问题,以下图所示,试着解释一下这个图:服务器

  • Git 是分布式版本控制系统(DVCS)。它能够跟踪文件的更改,并容许你恢复到任何特定版本的更改。
  • 与 SVN 等其余版本控制系统(VCS)相比,其分布式架构具备许多优点,一个主要优势是它不依赖于中央服务器来存储项目文件的全部版本。
  • 每一个开发人员均可以“克隆”我在图中用“Local repository”标注的存储库的副本,而且在他的硬盘驱动器上具备项目的完整历史记录,所以当服务器中断时,你须要的全部恢复数据都在你队友的本地 Git 存储库中。
  • 还有一个中央云存储库,开发人员能够向其提交更改,并与其余团队成员进行共享,如图所示,全部协做者都在提交更改“远程存储库”。
    关于 Git 的 20 个面试题[每日前端夜话0x75]
    Git 架构

    Q3. 在 Git 中提交的命令是什么?


答案很是简单。
用于写入提交的命令是 git commit -a。架构

如今解释一下 -a 标志, 经过在命令行上加 -a 指示 git 提交已修改的全部被跟踪文件的新内容。还要提一下,若是你是第一次须要提交新文件,能够在在 git commit -a 以前先 git add <file>。分布式

Q4. 什么是 Git 中的“裸存储库”?


你应该说明 “工做目录” 和 “裸存储库” 之间的区别。ide

Git 中的 “裸” 存储库只包含版本控制信息而没有工做文件(没有工做树),而且它不包含特殊的 .git 子目录。相反,它直接在主目录自己包含 .git 子目录中的全部内容,其中工做目录包括:工具

  • 一个 .git 子目录,其中包含你的仓库全部相关的 Git 修订历史记录。
  • 工做树,或签出的项目文件的副本。

    Q5. Git 是用什么语言编写的?


你须要说明使用它的缘由,而不只仅是说出语言的名称。我建议你这样回答:测试

Git使用 C 语言编写。 GIT 很快,C 语言经过减小运行时的开销来作到这一点。

Q6. 在Git中,你如何还原已


经 push 并公开的提交?

There can be two answers to this question and make sure that you include both because any of the below options can be used depending on the situation: 1
这个问题能够有两个答案,你回答时也要保包含这两个答案,由于根据具体状况可使用如下选项:

  • 删除或修复新提交中的错误文件,并将其推送到远程存储库。这是修复错误的最天然方式。对文件进行必要的修改后,将其提交到我将使用的远程存储库
1git commit -m "commit message"
  • 建立一个新的提交,撤消在错误提交中所作的全部更改。可使用命令:
1git revert <name of bad commit>

Q7. git pull 和 git fetch 有什么区别?


git pull 命令从中央存储库中提取特定分支的新更改或提交,并更新本地存储库中的目标分支。

git fetch 也用于相同的目的,但它的工做方式略有不一样。当你执行 git fetch 时,它会从所需的分支中提取全部新提交,并将其存储在本地存储库中的新分支中。若是要在目标分支中反映这些更改,必须在 git fetch 以后执行git merge。只有在对目标分支和获取的分支进行合并后才会更新目标分支。为了方便起见,请记住如下等式:

git pull = git fetch + git merge

Q8. git中的“staging area”或“index”是什么?


For this answer try to explain the below diagram as you can see:
能够经过下图进行解释:

在完成提交以前,能够在称为“staging area”或“index”的中间区域中对其进行格式化和审查。从图中能够看出,每一个更改首先在暂存区域中进行验证,我将其称为“stage file”,而后将更改提交到存储库。
关于 Git 的 20 个面试题[每日前端夜话0x75]

Staging Area

Q9. 什么是 git stash?


首先应该解释 git stash 的必要性。

一般状况下,当你一直在处理项目的某一部分时,若是你想要在某个时候切换分支去处理其余事情,事情会处于混乱的状态。问题是,你不想把完成了一半的工做的提交,以便你之后就能够回到当前的工做。解决这个问题的答案是 git stash。

再解释什么是git stash。

stash 会将你的工做目录,即修改后的跟踪文件和暂存的更改保存在一堆未完成的更改中,你能够随时从新应用这些更改。

Q10. 什么是git stash drop?


经过说明咱们使用 git stash drop 的目的来回答这个问题。

git stash drop 命令用于删除隐藏的项目。默认状况下,它将删除最后添加的存储项,若是提供参数的话,它还能够删除特定项。

下面举个例子。

若是要从隐藏项目列表中删除特定的存储项目,可使用如下命令:

git stash list:它将显示隐藏项目列表,如:

stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert “added file_size”
stash@{2}: WIP on master: 21d80a5 added number to log

若是要删除名为 stash@{0} 的项目,请使用命令 git stash drop stash@{0}。

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


对于这个问题,不能仅仅是提供命令,还要解释这个命令究竟作了些什么。

要获取特定提交中已更改的列表文件,请使用如下命令:

git diff-tree -r {hash}

给定提交哈希,这将列出在该提交中更改或添加的全部文件。 -r 标志使命令列出单个文件,而不是仅将它们折叠到根目录名称中。

你还能够包括下面提到的内容,虽然它是可选的,但有助于给面试官留下深入印象。

输出还将包含一些额外信息,能够经过包含两个标志把它们轻松的屏蔽掉:

git diff-tree –no-commit-id –name-only -r {hash}

这里 -no-commit-id 将禁止提交哈希值出如今输出中,而 -name-only 只会打印文件名而不是它们的路径。

Q12. git config 的功能是什么?


首先说明为何咱们须要 git config。

git 使用你的用户名将提交与身份相关联。 git config 命令可用来更改你的 git 配置,包括你的用户名。

下面用一个例子来解释。

假设你要提供用户名和电子邮件 ID 用来将提交与身份相关联,以便你能够知道是谁进行了特定提交。为此,我将使用:

git config –global user.name "Your Name": 此命令将添加用户名。

git config –global user.email "Your E-mail Address": 此命令将添加电子邮件ID。

Q13. 提交对象包含什么?


Commit 对象包含如下组件,你应该提到如下这三点:

  • 一组文件,表示给定时间点的项目状态
  • 引用父提交对象
  • SHAI 名称,一个40个字符的字符串,提交对象的惟一标识。

    Q14. 如何在Git中建立存储库?


这多是最多见的问题,答案很简单。

要建立存储库,先为项目建立一个目录(若是该目录不存在),而后运行命令 git init。经过运行此命令,将在项目的目录中建立 .git 目录。

Q15. 怎样将 N 次提交压缩成一次提交?


将N个提交压缩到单个提交中有两种方式:

  • 若是要从头开始编写新的提交消息,请使用如下命令:
1git reset –soft HEAD~N &&
2git commit
  • 若是你想在新的提交消息中串联现有的提交消息,那么须要提取这些消息并将它们传给 git commit,能够这样:
1git reset –soft HEAD~N &&
2git commit –edit -m"$(git log –format=%B –reverse .HEAD@{N})"

Q16. 什么是 Git bisect?如何使用它来肯定(回归)错误的来源?


我建议你先给出一个Git bisect 的小定义。

Git bisect 用于查找使用二进制搜索引入错误的提交。 Git bisect的命令是

1git bisect <subcommand> <options>

既然你已经提到过上面的命令,那就解释一下这个命令会作什么。

此命令用了二进制搜索算法来查找项目历史记录中的哪一个提交引入了错误。你能够经过告诉它已知包含该错误的“错误”提交以及在引入错误以前已知的“良好”提交来使用它。而后 git bisect 在这两个端点之间选择一个提交,并询问你所选的提交是“好”仍是“坏”。它继续缩小范围,直到找到引入更改的确切提交。

Q17. 若是想要在提交以前运行代码性检查工具,并在测试失败时阻止提交,该怎样配置 Git 存储库?

我建议你先介绍一下完整性检查。

完整性或冒烟测试用来肯定继续测试是否可行和合理。

下面解释如何实现这一目标。

这能够经过与存储库的 pre-commit hook 相关的简单脚原本完成。git 会在提交以前触发 pre-commit hook。你能够在这个脚本中运行其余工具,例如 linters,并对提交到存储库中的更改执行完整性检查。

最后举个例子,你能够参考下面的脚本:

1#!/bin/sh
 2files=$(git diff –cached –name-only –diff-filter=ACM | grep ‘.go$’)
 3if [ -z files ]; then
 4    exit 0
 5fi
 6unfmtd=$(gofmt -l $files)
 7if [ -z unfmtd ]; then
 8    exit 0
 9fi
10echo “Some .go files are not fmt’d”
11exit 1

这段脚本检查是否须要经过标准 Go 源代码格式化工具 gofmt 传递全部即将提交的 .go 文件。若是脚步以非 0 状态退出,脚本会有效地阻止提交操做。

Q18. 描述一下你所使用的分支策略?


这个问题被要求用Git来测试你的分支经验,告诉他们你在之前的工做中如何使用分支以及它的用途是什么,你能够参考如下提到的要点:

  • 功能分支(Feature branching)

要素分支模型将特定要素的全部更改保留在分支内。当经过自动化测试对功能进行全面测试和验证时,该分支将合并到主服务器中。

  • 任务分支(Task branching)

在此模型中,每一个任务都在其本身的分支上实现,任务键包含在分支名称中。很容易看出哪一个代码实现了哪一个任务,只需在分支名称中查找任务键。

  • 发布分支(Release branching)

一旦开发分支得到了足够的发布功能,你就能够克隆该分支来造成发布分支。建立该分支将会启动下一个发布周期,因此在此以后不能再添加任何新功能,只有错误修复,文档生成和其余面向发布的任务应该包含在此分支中。一旦准备好发布,该版本将合并到主服务器并标记版本号。此外,它还应该再将自发布以来已经取得的进展合并回开发分支。

最后告诉他们分支策略因团队而异,因此我知道基本的分支操做,如删除、合并、检查分支等。

Q19. 若是分支是否已合并为master,你能够经过什么手段知道?

答案很直接。

要知道某个分支是否已合并为master,你可使用如下命令:

git branch –merged 它列出了已合并到当前分支的分支。

git branch –no-merged 它列出了还没有合并的分支。

Q20. 什么是SubGit?


SubGit 是将 SVN 到 Git迁移的工具。它建立了一个可写的本地或远程 Subversion 存储库的 Git 镜像,而且只要你愿意,能够随意使用 Subversion 和 Git。

这样作有不少优势,好比你能够从 Subversion 快速一次性导入到 Git 或者在 Atlassian Bitbucket Server 中使用SubGit。咱们能够用 SubGit 建立现有 Subversion 存储库的双向 Git-SVN 镜像。你能够在方便时 push 到 Git 或提交 Subversion。同步由 SubGit 完成。

原文:https://www.edureka.co/blog/interview-questions/git-interview-questions/

相关文章
相关标签/搜索