ホームページ  >  記事  >  開発ツール  >  Git に関する面接での 20 の質問

Git に関する面接での 20 の質問

青灯夜游
青灯夜游転載
2020-01-04 09:38:428573ブラウズ

私は仕事で Git が大好きです。 Git は多くの開発チームで重要な役割を果たしており、不可欠なテクノロジです。したがって、ここでは、Git 面接でよくある質問をいくつか用意してあります。

Git に関する面接での 20 の質問

Git 面接に関する最初の質問は次のとおりです:

1. Git と SVN の違いは何ですか?

##SVN##1. Git は分散型バージョン管理ツールです ##1. SVN は集中型バージョン管理ツールです #2. 第 3 世代に属しますバージョン管理ツール2。これは第 2 世代のバージョン管理ツールに属します3。クライアントはローカル システム上にリポジトリ全体のクローンを作成できます 3. バージョン履歴はサーバー側のリポジトリに保存されます4. オフラインでも提出できます4. オンラインでの提出のみが許可されます5.プッシュ/プル操作が高速になります5.プッシュ/プル操作が遅い
#Git
##6.コミットを使用してプロジェクトを自動化できます共有 6. 自動的に共有されるものはありません

2.Git とは何ですか?

#この質問に答える前に、まず git のアーキテクチャを理解することをお勧めします。次の図に示すように、この図について説明してください。

##●Git は分散型です。バージョン管理システム (DVCS)。ファイルへの変更を追跡し、変更を特定のバージョンに戻すことができます。

##● SVN などの他のバージョン管理システム (VCS) と比較すると、その分散アーキテクチャには多くの利点があり、大きな利点の 1 つは、プロジェクト ファイルのすべてのバージョンを保存するために中央サーバーに依存しないことです。

##●各開発者は、図で「ローカル リポジトリ」とマークしたリポジトリのコピーを「複製」し、プロジェクトの完全な履歴を自分のハード ドライブに保存できるため、現時点ではサーバーがダウンしたときに、必要なリカバリ データはすべてチームメイトのローカル Git リポジトリにあります。

#●開発者が変更を送信して他のチーム メンバーと共有できる中央のクラウド リポジトリもあります。図に示すように、すべての共同作業者が変更を「リモート リポジトリ」に送信しています。

次の Git 面接の質問では、Git の使用経験をテストします:

Git に関する面接での 20 の質問

3. commit コマンドは Git にありますか?

答えはとても簡単です。 コミットの書き込みに使用されるコマンドは git commit -a

です。
次に、-a フラグについて説明します。コマンド ラインに -a

を追加すると、変更されたすべての追跡ファイルの新しいコンテンツをコミットするように git に指示します。また、初めて新しいファイルを送信する必要がある場合は、

git commit -a の前に git add <file></file> を実行できることにも言及します。 4. Git の「ベア リポジトリ」とは何ですか?

「作業ディレクトリ」と「ベアリポジトリ」の違いを説明する必要があります。 Git の「裸の」リポジトリには、バージョン管理情報のみが含まれ、作業ファイル (作業ツリーはありません) は含まれません。また、特別な .git

サブディレクトリも含まれません。代わりに、ホーム ディレクトリ自体の

.git

サブディレクトリにあるすべてのものが直接含まれており、作業ディレクトリには次のものが含まれます。

1. .git サブディレクトリ。リポジトリに関連するすべての Git リビジョン履歴。

2. 作業ツリー、またはチェックアウトされたプロジェクト ファイルのコピー。

5. Git はどの言語で書かれていますか?

単に言語の名前を述べるのではなく、それを使用する理由を説明する必要があります。これに答えることをお勧めします: Git は C 言語で書かれています。 GIT は高速であり、C は実行時のオーバーヘッドを削減することでこれを実現します。

6. Git では、プッシュされて公開されたコミットをどのように復元しますか?

この質問には 2 つの答えが考えられますが、状況に応じて以下のオプションのいずれかを使用できるため、必ず両方を含めてください: 1答えは 2 つあります。この質問の回答には、必ず両方の回答も含めてください。状況に応じて次のオプションが利用可能です。 新しいコミット内の誤ったファイルを削除または修正し、リモート リポジトリにプッシュします。これはエラーを修正する最も自然な方法です。ファイルに必要な変更を加えた後、使用するリモート リポジトリにファイルをコミットします。

git commit -m "commit message"

# 新しいコミットを作成し、不正なコミットで行われたすべての変更を元に戻します。次のコマンドを使用できます:

git revert <name></name>

7. git pull と git fetch の違いは何ですか?

git pull コマンドは、特定のブランチの新しい変更またはコミットを中央リポジトリから取得し、ローカル リポジトリのターゲット ブランチを更新します。

git fetch も同じ目的に使用されますが、動作は少し異なります。 git fetch

を実行すると、目的のブランチからすべての新しいコミットがフェッチされ、ローカル リポジトリの新しいブランチに保存されます。これらの変更をターゲット ブランチに反映させたい場合は、

git fetch の後に git merge を実行する必要があります。ターゲット ブランチは、ターゲット ブランチとフェッチされたブランチをマージした後にのみ更新されます。便宜上、次の方程式を覚えておいてください: <center><h5>git pull = git fetch git merge</h5></center>

8. git の「ステージング領域」または「インデックス」とは何ですか?

この答えについては、ご覧のとおり、以下の図を説明してみてください。「ステージング領域」または「インデックス」の中間領域をフォーマットして確認します。図からわかるように、各変更はまずステージング領域 (私は「ステージ ファイル」と呼んでいます) で検証され、その後変更がリポジトリにコミットされます。

Git に関する面接での 20 の質問

9. 什么是 git stash?

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

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

再解释什么是git stash。

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

10. 什么是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}

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

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

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

git diff-tree -r {hash}

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

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

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

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

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

12. 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。

13. 提交对象包含什么?

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

 ● 一组文件,表示给定时间点的项目状态

 ● 引用父提交对象

 ● SHAI 名称,一个40个字符的字符串,提交对象的唯一标识。

14. 如何在Git中创建存储库?

这可能是最常见的问题,答案很简单。

要创建存储库,先为项目创建一个目录(如果该目录不存在),然后运行命令 git init。通过运行此命令,将在项目的目录中创建 .git 目录。

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

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

 ● 如果要从头开始编写新的提交消息,请使用以下命令:

git reset –soft HEAD~N &&
git commit

 ● 如果你想在新的提交消息中串联现有的提交消息,那么需要提取这些消息并将它们传给 git commit,可以这样:

git reset –soft HEAD~N &&
git commit –edit -m"$(git log –format=%B –reverse .HEAD@{N})"

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

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

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

git bisect <subcommand> <options></options></subcommand>

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

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

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

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

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

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

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

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

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

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

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

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

 ● 功能分支(Feature branching)

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

 ● 任务分支(Task branching)

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

 ● 发布分支(Release branching)

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

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

19. 如果分支是否已合并为master,你可以通过什么手段知道?

答案很直接。

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

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

git branch –no-merged 它列出了尚未合并的分支。

20. 什么是SubGit?

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

这样做有很多优点,比如你可以从 Subversion 快速一次性导入到 Git 或者在 Atlassian Bitbucket Server 中使用SubGit。我们可以用 SubGit 创建现有 Subversion 存储库的双向 Git-SVN 镜像。你可以在方便时 push 到 Git 或提交 Subversion。同步由 SubGit 完成。

推荐学习:git教程

以上がGit に関する面接での 20 の質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。