翻译:疯狂的技术宅
未经许可,禁止转载!
本文首发微信公众号:前端先锋
欢迎关注,天天都给你推送新鲜的前端技术文章git
我在工做中很喜欢 Git 。 Git 在许多开发团队中扮演着重要的角色。程序员
关于 Git 面试的第一个问题必须是:面试
Git | SVN |
---|---|
1. Git是一个分布式的版本控制工具 | 1. SVN 是集中版本控制工具 |
2.它属于第3代版本控制工具 | 2.它属于第2代版本控制工具 |
3.客户端能够在其本地系统上克隆整个存储库 | 3.版本历史记录存储在服务器端存储库中 |
4.即便离线也能够提交 | 4.只容许在线提交 |
5.Push/pull 操做更快 | 5.Push/pull 操做较慢 |
6.工程能够用 commit 自动共享 | 6.没有任何东西自动共享 |
我建议你先经过了解 git 的架构再来回答这个问题,以下图所示,试着解释一下这个图:算法
下一组 Git 面试问题将测试你使用 Git 的体验:segmentfault
答案很是简单。
用于写入提交的命令是 git commit -a
。bash
如今解释一下 -a
标志, 经过在命令行上加 -a
指示 git 提交已修改的全部被跟踪文件的新内容。还要提一下,若是你是第一次须要提交新文件,能够在在 git commit -a
以前先 git add <file>
。服务器
你应该说明 “工做目录” 和 “裸存储库” 之间的区别。微信
Git 中的 “裸” 存储库只包含版本控制信息而没有工做文件(没有工做树),而且它不包含特殊的 .git
子目录。相反,它直接在主目录自己包含 .git
子目录中的全部内容,其中工做目录包括:多线程
.git
子目录,其中包含你的仓库全部相关的 Git 修订历史记录。你须要说明使用它的缘由,而不只仅是说出语言的名称。我建议你这样回答:
Git使用 C 语言编写。 GIT 很快,C 语言经过减小运行时的开销来作到这一点。
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
这个问题能够有两个答案,你回答时也要保包含这两个答案,由于根据具体状况可使用如下选项:
git commit -m "commit message"
git revert <name of bad commit>
git pull
命令从中央存储库中提取特定分支的新更改或提交,并更新本地存储库中的目标分支。
git fetch
也用于相同的目的,但它的工做方式略有不一样。当你执行 git fetch
时,它会从所需的分支中提取全部新提交,并将其存储在本地存储库中的新分支中。若是要在目标分支中反映这些更改,必须在 git fetch
以后执行git merge
。只有在对目标分支和获取的分支进行合并后才会更新目标分支。为了方便起见,请记住如下等式:
<center><h5>git pull = git fetch + git merge</h5></center>
For this answer try to explain the below diagram as you can see:
能够经过下图进行解释:
在完成提交以前,能够在称为“staging area”或“index”的中间区域中对其进行格式化和审查。从图中能够看出,每一个更改首先在暂存区域中进行验证,我将其称为“stage file”,而后将更改提交到存储库。
首先应该解释 git stash 的必要性。
一般状况下,当你一直在处理项目的某一部分时,若是你想要在某个时候切换分支去处理其余事情,事情会处于混乱的状态。问题是,你不想把完成了一半的工做的提交,以便你之后就能够回到当前的工做。解决这个问题的答案是 git stash。
再解释什么是git stash。
stash 会将你的工做目录,即修改后的跟踪文件和暂存的更改保存在一堆未完成的更改中,你能够随时从新应用这些更改。
经过说明咱们使用 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}。
对于这个问题,不能仅仅是提供命令,还要解释这个命令究竟作了些什么。
要获取特定提交中已更改的列表文件,请使用如下命令:
git diff-tree -r {hash}
给定提交哈希,这将列出在该提交中更改或添加的全部文件。 -r
标志使命令列出单个文件,而不是仅将它们折叠到根目录名称中。
你还能够包括下面提到的内容,虽然它是可选的,但有助于给面试官留下深入印象。
输出还将包含一些额外信息,能够经过包含两个标志把它们轻松的屏蔽掉:
git diff-tree –no-commit-id –name-only -r {hash}
这里 -no-commit-id
将禁止提交哈希值出如今输出中,而 -name-only
只会打印文件名而不是它们的路径。
首先说明为何咱们须要 git config
。
git 使用你的用户名将提交与身份相关联。 git config
命令可用来更改你的 git 配置,包括你的用户名。
下面用一个例子来解释。
假设你要提供用户名和电子邮件 ID 用来将提交与身份相关联,以便你能够知道是谁进行了特定提交。为此,我将使用:
git config –global user.name "Your Name": 此命令将添加用户名。
git config –global user.email "Your E-mail Address": 此命令将添加电子邮件ID。
Commit 对象包含如下组件,你应该提到如下这三点:
这多是最多见的问题,答案很简单。
要建立存储库,先为项目建立一个目录(若是该目录不存在),而后运行命令 git init。经过运行此命令,将在项目的目录中建立 .git 目录。
将N个提交压缩到单个提交中有两种方式:
git reset –soft HEAD~N && git commit
git reset –soft HEAD~N && git commit –edit -m"$(git log –format=%B –reverse .HEAD@{N})"
我建议你先给出一个Git bisect 的小定义。
Git bisect 用于查找使用二进制搜索引入错误的提交。 Git bisect的命令是
git bisect <subcommand> <options>
既然你已经提到过上面的命令,那就解释一下这个命令会作什么。
此命令用了二进制搜索算法来查找项目历史记录中的哪一个提交引入了错误。你能够经过告诉它已知包含该错误的“错误”提交以及在引入错误以前已知的“良好”提交来使用它。而后 git bisect 在这两个端点之间选择一个提交,并询问你所选的提交是“好”仍是“坏”。它继续缩小范围,直到找到引入更改的确切提交。
我建议你先介绍一下完整性检查。
完整性或冒烟测试用来肯定继续测试是否可行和合理。
下面解释如何实现这一目标。
这能够经过与存储库的 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
状态退出,脚本会有效地阻止提交操做。
这个问题被要求用Git来测试你的分支经验,告诉他们你在之前的工做中如何使用分支以及它的用途是什么,你能够参考如下提到的要点:
要素分支模型将特定要素的全部更改保留在分支内。当经过自动化测试对功能进行全面测试和验证时,该分支将合并到主服务器中。
在此模型中,每一个任务都在其本身的分支上实现,任务键包含在分支名称中。很容易看出哪一个代码实现了哪一个任务,只需在分支名称中查找任务键。
一旦开发分支得到了足够的发布功能,你就能够克隆该分支来造成发布分支。建立该分支将会启动下一个发布周期,因此在此以后不能再添加任何新功能,只有错误修复,文档生成和其余面向发布的任务应该包含在此分支中。一旦准备好发布,该版本将合并到主服务器并标记版本号。此外,它还应该再将自发布以来已经取得的进展合并回开发分支。
最后告诉他们分支策略因团队而异,因此我知道基本的分支操做,如删除、合并、检查分支等。
答案很直接。
要知道某个分支是否已合并为master,你可使用如下命令:
git branch –merged
它列出了已合并到当前分支的分支。
git branch –no-merged
它列出了还没有合并的分支。
SubGit 是将 SVN 到 Git迁移的工具。它建立了一个可写的本地或远程 Subversion 存储库的 Git 镜像,而且只要你愿意,能够随意使用 Subversion 和 Git。
这样作有不少优势,好比你能够从 Subversion 快速一次性导入到 Git 或者在 Atlassian Bitbucket Server 中使用SubGit。咱们能够用 SubGit 建立现有 Subversion 存储库的双向 Git-SVN 镜像。你能够在方便时 push 到 Git 或提交 Subversion。同步由 SubGit 完成。