Git面试题

Posted wyl-yulior-000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git面试题相关的知识,希望对你有一定的参考价值。

1.Git和SVN有什么区别?

1.Git是一个分布式的版本控制工具,SVN 是集中版本控制工具

2. Git属于第3代版本控制工具,SVN则属于第2代版本控制工具

3. Git客户端可以在其本地系统上克隆整个存储库,SVN的版本历史记录存储在服务器端存储库中

4. Git即使离线也可以提交,SVN只允许在线提交和回滚

5. Git的Push/pull 操作更快,而SVN Push/pull 操作较慢

6. Git工程可以用 commit 自动共享,但SVN没有任何东西自动共享

 

2. 列举工作中常用的几个git命令?

新增文件的命令:git add file或者git add .

提交文件的命令:git commit –m或者git commit –a

查看工作区状况:git status –s

拉取合并远程分支的操作:git fetch/git merge或者git pull

查看提交记录命令:git reflog

 

3. 什么是 Git 复刻(fork)?复刻(fork)、分支(branch)和克隆(clone)之间有什么区别?

复刻(fork) 是对存储仓库(repository)进行的远程的、服务器端的拷贝,从源头上就有所区别。复刻实际上不是 Git 的范畴。它更像是个政治/社会概念。

克隆(clone) 不是复刻,克隆是个对某个远程仓库的本地拷贝。克隆时,实际上是拷贝整个源存储仓库,包括所有历史记录和分支。

分支(branch) 是一种机制,用于处理单一存储仓库中的变更,并最终目的是用于与其他部分代码合并。

 

4. “拉取请求(pull request)”和“分支(branch)”之间有什么区别?

分支(branch) 是代码的一个独立版本。

拉取请求(pull request) 是当有人用仓库,建立了自己的分支,做了些修改并合并到该分支(把自己修改应用到别人的代码仓库)。

 

5. “git pull”和“git fetch”之间有什么区别?

简单来说,git pull 是 git fetch + git merge。

当你使用 pull,Git 会试着自动为你完成工作。它是上下文(工作环境)敏感的,所以 Git 会把所有拉取的提交合并到你当前处理的分支中。pull 则是 自动合并提交而没有让你复查的过程。如果你没有细心管理你的分支,你可能会频繁遇到冲突。

当你 fetch,Git 会收集目标分支中的所有不存在的提交,并将这些提交存储到本地仓库中。但Git 不会把这些提交合并到当前分支中。这种处理逻辑在当你需要保持仓库更新,在更新文件时又希望处理可能中断的事情时,这将非常实用。而将提交合并到主分支中,则该使用 merge。

 

6. 解释 Forking 工作流程的优点

Forking 工作流程 与其他流行的 Git 工作流程有着根本的区别。它不是用单个服务端仓库充当“中央”代码库,而是为每个开发者提供自己的服务端仓库。Forking 工作流程最常用于公共开源项目中。

Forking 工作流程的主要优点是可以汇集提交贡献,又无需每个开发者提交到一个中央仓库中,从而实现干净的项目历史记录。开发者可以推送(push)代码到自己的服务端仓库,而只有项目维护人员才能直接推送(push)代码到官方仓库中。

当开发者准备发布本地提交时,他们的提交会推送到自己的公共仓库中,而不是官方仓库。然后他们向主仓库提交请求拉取(pull request),这会告知项目维护人员有可以集成的更新。

 

7.Git 中 HEAD、工作树和索引之间的区别?

该工作树/工作目录/工作空间是你看到和编辑的(源)文件的目录树。

该索引/中转区(staging area)是个在 /.git/index,单一的、庞大的二进制文件,该文件列出了当前分支中所有文件的 SHA1 检验和、时间戳和文件名,它不是个带有文件副本的目录。

HEAD是当前检出分支的最后一次提交的引用/指针。

 

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

功能分支(Feature branching)

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

任务分支(Task branching)

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

发布分支(Release branching)

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

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

 

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

可以使用以下命令:

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

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

 

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

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

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

git reset –soft HEAD~N &&

git commit

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

git reset –soft HEAD~N &&

git commit –edit -m"$(git log –format=%B –reverse .HEAD@N)"

 

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

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

1.一个 .git 子目录,其中包含你的仓库所有相关的 Git 修订历史记录。

2.工作树,或签出的项目文件的副本。

 

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

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

 

13. 在Git中,你如何还原已经 push 并公开的提交?

1.删除或修复新提交中的错误文件,并将其推送到远程存储库。这是修复错误的最自然方式。对文件进行必要的修改后,将其提交到我将使用的远程存储库

git commit -m "commit message"

2.创建一个新的提交,撤消在错误提交中所做的所有更改。可以使用命令:

git revert <name of bad commit>

 

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

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

 

15.如果本次提交误操作,如何撤销?

如果想撤销提交到索引区的文件,可以通过git reset HEAD file;如果想撤销提交到本地仓库的文件,可以通过git reset –soft HEAD^n恢复当前分支的版本库至上一次提交的状态,索引区和工作空间不变更;可以通过git reset –mixed HEAD^n恢复当前分支的版本库和索引区至上一次提交的状态,工作区不变更;可以通过git reset –hard HEAD^n恢复当前分支的版本库、索引区和工作空间至上一次提交的状态。

 

16.你使用过git stash命令吗?你一般什么情况下会使用它?

命令git stash是把工作区修改的内容存储在栈区。

以下几种情况会使用到它:

1.解决冲突文件时,会先执行git stash,然后解决冲突;

2.遇到紧急开发任务但目前任务不能提交时,会先执行git stash,然后进行紧急任务的开发,然后通过git stash pop取出栈区的内容继续开发;

3.切换分支时,当前工作空间内容不能提交时,会先执行git stash再进行分支切换。

 

17.使用过git merge和git rebase吗?它们之间有什么区别?

简单的说,git merge和git rebase都是合并分支的命令。

git merge branch会把branch分支的差异内容pull到本地,然后与本地分支的内容一并形成一个committer对象提交到主分支上,合并后的分支与主分支一致;

git rebase branch会把branch分支优先合并到主分支,然后把本地分支的commit放到主分支后面,合并后的分支就好像从合并后主分支又拉了一个分支一样,本地分支本身不会保留提交历史。

 

18. 如何把本地仓库的内容推向一个空的远程仓库?

首先确保本地仓库与远程之间是连同的。如果提交失败,则需要进行下面的命令进行连通:

git remote add origin 远程仓库地址

如果是第一次推送,则进行下面命令:

git push -u origin master

注意:-u 是指定origin为默认主分支

之后的提交,只需要下面的命令:

git push origin master

 

19.说明新建一个GIT功能分支的步骤,提供每个步骤的指令,并对指令进行说明。

Git branch name     创建名字为name的branch

Git checkout xxx_dev    切换到名字为xxx_dev的分支

Git pull    从远程分支拉取代码到本地分支

Git checkout -b main_furture_xxx    创建并切换到main_furture_xxx

Git push origin main_furture_xxx    执行推送的操作,完成本地分支向远程分支的同步

 

20.如何查看文件的提交历史和分支的提交历史。

使用git log查看文件提交历史

    Git log filename

使用git log查看分支提交历史

    Git log branch file

 

21.我们在本地工程常会修改一些配置文件,这些文件不需要被提交,而我们又不想每次执行git status时都让这些文件显示出来,我们该如何操作?

在Git工作区的跟目录下创建一个特殊的.gitignore文件,然后把忽略的文件名编辑进去,Git就会自动忽略这些文件。

 

22.当GIT出现your-branch-is-ahead-of-origin-master-by-3-commits这一情况时,该如何处理?

Git commit

Git pull

Git push

 

23.什么是“git cherry-pick”?

命令 git cherry-pick 通常用于把特定提交从存储仓库的一个分支引入到其他分支中。常见的用途是从维护的分支到开发分支进行向前或回滚提交。

这与其他操作(例如:合并(merge)、变基(rebase))形成鲜明对比,后者通常是把许多提交应用到其他分支中。

以上是关于Git面试题的主要内容,如果未能解决你的问题,请参考以下文章

IT企业面试题(java描述)-字符串旋转(旋转字母或者单词)

2022 最新 Git 面试题

管理知识 - IT项目经理面试题

git相关面试题

git相关面试题

Git面试题