Git开发常见问题:面试题和答案合集

2021年12月12日21:35:22 发表评论 964 次浏览

什么是 Git,为什么要使用它?

  • Git 是最流行的、开源的、广泛使用的,也是分布式版本控制系统 (DVCS) 的一个例子,用于以更高效和整洁的方式处理大小项目的开发。
  • 最适合多人团队合作的项目,用于跟踪项目变更,高效支持开发过程的协作。
  • 在版本控制系统的帮助下,开发人员可以确定谁进行了哪些更改,然后运行测试并修复错误(如果有),然后进行必要的功能实现。万一出现任何不可预见的情况,代码可以恢复到任何以前的工作版本,从而节省大量工作。

Git的适用范围:

  • 由于完善的版本控制系统和对协作工作的支持,git 不仅在软件开发人员中广受欢迎,而且在执行其他任务(如文档或任何其他协作工作)的人们中也广受欢迎。一开始看起来很有挑战性,但是一旦我们掌握了 git 的窍门,我们就会发现它让我们的生活变得更加简单。
  • 它有一个惊人的分支系统,支持非线性开发,同时让开发人员对他们的代码负责。这有助于提高开发过程的效率和速度。

基本的Git面试题和答案合集

1. 什么是版本控制系统(VCS)?

Git面试题解析:VCS 会跟踪作为一个团队在项目中工作的开发人员的贡献。他们维护已完成代码更改的历史记录,并且随着项目的发展,开发人员可以在引入新代码、修复错误和运行测试方面占据上风,并充满信心地确保他们以前的工作副本可以随时恢复,以防出现问题.

2.Git常见面试题有哪些:什么是git仓库?

存储库是一种文件结构,git 存储所有基于项目的文件。Git 可以将文件存储在本地或远程存储库中。

3. git clone 有什么作用?

该命令创建现有 git 存储库的副本(或克隆)。一般用于获取远程仓库的副本到本地仓库。

4. git config 命令有什么作用?

git config命令是设置用于定义存储库行为、用户信息和首选项、基于 git 安装的配置以及许多此类内容的配置选项的便捷方式。 

例如:
要在使用 git 命令之前设置你的姓名和电子邮件地址,我们可以运行以下命令:

  • git config --global
    user.name
    “<<你的名字>>”
     
  • git config --global user.email “<<your_email>>”

5. 你能用 git 解释 head 并告诉存储库中可以存在的 head 数量吗?

  • Ahead只不过是对分支的最后一个提交对象的引用。
  • 对于每个存储库,总会有一个默认的 head 称为“master”或现在称为“main”(根据 GitHub),但对可用 head 的数量没有限制。换句话说,它可以有任意数量的头。
  • 用法:

    - 要在最新提交之前转到或签出 1 次提交,我们使用git checkout HEAD~1

    - 要在不丢失更改的情况下取消提交最后 3 次提交,我们首先运行git reset HEAD~3. 然后我们可以看到在最后 3 次提交中所做的更改,然后手动更新并最终提交。

    -为了取消提交最后3个提交,也拆除的变化,我们可以运行命令:git reset --hard HEAD~3。此命令将完全删除所有更改。

    - 要查看在最后 3 次提交中所做的更改,我们可以运行git diff HEAD~3

    - 要通过还原最后 3 次提交来进行新提交,我们可以运行以下命令:git revert --no-commit HEAD~3...HEAD

6. 什么是冲突?

  • Git 通常会自动处理功能合并,但有时在团队环境中工作时,可能会出现冲突的情况,例如:

    1. 当两个单独的分支对文件中的同一行进行更改时
    2. 一个文件在一个分支中被删除但有在其他中进行了修改。
     
  • 这些冲突必须在与团队讨论后手动解决,因为 git 将无法预测必须优先考虑哪些更改以及谁的更改。

7. git ls-tree 的功能是什么?

此命令返回当前存储库的树对象表示以及每个项目的模式和名称以及 blob 的 SHA-1 值。

8. git status 命令有什么作用?

git status 命令用于显示工作目录和索引之间的差异,这有助于深入了解 git 并跟踪跟踪和未跟踪的更改。

9. 定义“索引”。

在对已完成的更改进行提交之前,开发人员可以对文件进行格式化和审查,并对它们进行创新。所有这些都在称为“索引”或“暂存区”的公共区域中完成。

在上图中,“暂存”状态表示暂存区域,并为人们提供了在提交更改之前对其进行评估的机会。

10. git add 命令有什么作用?

  • 此命令将文件和更改添加到现有目录的索引中。
     
  • 你可以使用git add .命令一次添加所有更改。
     
  • 你可以专门使用git add <file_name>命令一个一个地添加文件。
     
  • 你可以使用git add /<folder_name>/命令添加特定文件夹的内容。

中级Git面试题和答案合集

11.为什么认为在Git上工作很容易?

Git面试题解析:在 git 的帮助下,开发人员在更快、更高效地执行开发过程方面获得了许多优势。使工作更容易的 git 的一些主要功能是:

  • 分支功能:

    - 由于其复杂的分支功能,开发人员可以轻松地针对项目的不同功能在多个分支上工作。
    - 它还具有更简单的合并选项以及用于跟踪它的高效工作流功能图。
     
  • 分布式开发方式:

    - Git 是一个分布式系统,由于这种性质,如果数据从主服务器丢失,跟踪和定位数据会变得更容易。
    - 在此系统中,开发人员获得服务器上存在的存储库文件。与此文件一起,此文件的副本也存储在称为本地存储库的开发人员系统中。
    - 因此,项目的可扩展性得到了极大的提高。
     
  • 拉取请求功能:

    - 此功能有助于团队开发人员之间更轻松的交互,以协调合并操作。
    - 它正确跟踪开发人员对代码所做的更改。
     
  • 有效的发布周期:

    - 由于存在种类繁多的特性,git 有助于提高发布周期的速度,并有助于以有效的方式改进项目工作流程。

12. 你将如何创建一个 git 仓库?

  • 在你的系统中安装 git。 
  • 然后为了创建一个 git 存储库,为项目创建一个文件夹,然后运行git init
  • 这样做将在项目文件夹中创建一个 .git 文件,表明存储库已创建。

13. 告诉我一些关于 git stash 的事情?

Git stash 可用于我们需要在分支之间切换,同时又不想丢失当前分支中的编辑的情况。运行该git stash命令基本上会将当前工作目录状态和索引推送到堆栈以备将来使用,从而为其他任务提供一个干净的工作目录。

14. Git常见面试题有哪些:删除分支的命令是什么?

  • 要删除一个分支,我们可以简单地使用命令git branch –d [head]
  • 要在本地删除分支,我们可以简单地运行以下命令: git branch -d <local_branch_name>
  • 要远程删除分支,请运行以下命令: git push origin --delete <remote_branch_name>
  • 删除分支场景有多种原因。其中一个原因是在将特性分支合并到开发分支后将其删除。

15. git remote 和 git clone 命令有什么区别?

git remote命令在git config其中创建一个条目  ,指定特定 URL 的名称。而git clone通过复制位于 URL 的现有存储库来创建新的 git 存储库。

16. git stash apply 命令有什么作用?

  • git stash apply命令用于将作品从使用git stash命令存储更改的堆栈中带回工作目录。
  • 这有助于开发人员在切换到其他分支之前从他们上次离开工作的地方恢复他们的工作。

17. git pull 和 git fetch 的区别。

pullfetch
此命令从位于远程中央存储库中的当前工作分支中提取新更改。此命令也用于类似目的,但它遵循两步过程: 
1. 从所需分支拉取所有提交和更改,并将它们存储在本地存储库的新分支中。 
current
2. 对于要反映在当前/目标分支中的更改,git fetch应后跟git merge命令。
git pull = git fetch + git merge

18.你能给出“pull request”和“branch”的区别吗?

pull requestbranch
当需要将开发人员的更改放入另一个人的代码分支时,会完成此过程。 分支只不过是代码的一个单独版本。

19、为什么我们不把git“pull request”称为“push request”?

  • 之所以这样称呼“推送请求”,是因为它是在目标存储库请求我们将更改推送到它时完成的。
  • “拉取请求”之所以如此命名是因为 repo 请求目标存储库从中获取(或拉取)更改。

20. 你能说出 Git 和 GitHub 的区别吗?

GitGitHub
这是一个安装在本地机器上的分布式版本控制系统它允许开发人员跟踪提交历史并支持协作工作。这是一个使用git开发的基于云的源代码库
这是由“Linux 基金会”维护的。这被“微软”收购了
SVN、Mercurial等是竞争对手GitLab、Atlassian BitBucket 等是竞争对手。
  • GitHub 提供了多种服务,如分叉、用户管理等,并为协作工作提供了一个中央存储库。

21. git diff 和 git status 命令有什么作用?

git diffgit status
这显示了提交、工作树之间的变化。这显示了工作目录和索引之间的区别这对于深入理解 git 至关重要。
  • git diff以类似的方式工作,git status唯一的区别是显示提交之间以及工作目录和索引之间的差异。

22. 必须运行什么才能将多个提交(最后 N 个)压缩为单个提交?

将多个提交压缩到单个提交会覆盖历史记录,这就是为什么建议完全谨慎地完成的原因。这一步可以通过运行以下命令来完成:git rebase -i HEAD~{{N}}其中 {{N}} 表示需要压缩的提交数。

23. 如果分支已经推送到中央存储库中但意外从每个团队成员的本地计算机中删除,你将如何恢复该分支?

我们可以通过在 reflog 中检出此分支的最新提交,然后将其作为新分支检出来恢复这一点。

24. 你能谈谈 git reflog 吗?

Git面试题解析:此命令跟踪在存储库引用(可以是分支或标签)中所做的每一个更改,并维护在本地创建或检出的分支/标签日志历史记录。参考日志,例如创建或克隆分支、检出、重命名或在分支上进行的任何提交的提交快照,由 Git 维护并由“reflog”命令列出。

  • 仅当分支是在本地创建或从本地存储库中的远程存储库中检出以供 Git 存储其参考历史日志时,才能进行这种分支恢复。
  • 此命令应在具有丢失分支的存储库中执行。

25. 什么是提交对象?

一个提交对象由以下组件组成:

  • 表示项目在给定时间点的状态的一组文件。
  • 对父提交对象的引用。
  • 称为 SHA-1 名称的 40 个字符的字符串唯一标识提交对象。

26.解释git config中的级别以及如何使用它们配置值?

  • 为了让 git 工作,它使用一组默认通过配置文件(或配置文件)预定义的配置。我们可以通过修改这些基本上是文本文件的文件来更改 git 的默认行为。为了做到这一点,了解 git 如何识别这些文件很重要。它通过以下步骤来实现:

    - 首先,git 在系统范围的 gitconfig 文件中搜索配置值,该文件存储在<<installation_path>>/etc/gitconfig文件中,该文件定义了设置并应用于系统的每个用户及其所有存储库。
         - 如果你希望 git 从此特定文件中搜索并对其进行读/写,我们可以将选项传递--system给 git config 命令。

    - 接下来,git 搜索~/.gitconfig文件或~/.config/git/config具有特定于用户的范围。
       - 可以让 Git 专门绕过--globalgit config 命令从这个文件中读/写。

    - 最后,git 在我们当前正在处理的本地存储库的 git 目录中搜索配置值。
       - 这些配置值仅特定于该特定存储库,可以通过传递--local给 git config 命令来访问。这是在我们未指定任何级别的情况下访问和修改的默认配置文件。

27. 什么是分离的 HEAD,是什么导致了这种情况以及如何避免这种情况?

Detached HEAD 表示当前签出的存储库不是本地分支。这可能由以下情况引起:

  • 当一个分支是一个只读分支并且我们尝试创建一个对该分支的提交时,那么这些提交可以被称为“自由浮动”的提交,没有连接到任何分支。他们将处于分离状态。
  • 当我们检出一个标签或一个特定的提交,然后我们尝试执行一个新的提交时,提交将不会再连接到任何分支。当我们现在尝试检出一个分支时,这些新提交将自动放置在顶部。

    为了确保分离状态不会发生,=而不是检查提交/标签,我们可以创建一个源自该提交的分支,然后我们可以使用以下命令切换到新创建的分支:git checkout -b <<new_branch_name>>。这可确保签出新分支而不是提交/标记,从而确保不会发生分离状态。

28. Git常见面试题有哪些:git annotate 命令有什么作用?

  • 此命令使用来自引入该更改的提交的信息注释给定文件中的每一行。此命令还可以选择从给定的修订版进行注释。
  • 句法: git annotate [<options>] <file> [<revision>]
  • 你可以从此处的官方 git 文档中了解有关此命令的更多信息。

29. git stash apply 和 git stash pop 命令有什么区别?

  • git stash pop 命令在应用它后丢弃指定的存储(默认情况下最顶层的存储)。
  • git stash apply命令将 stash 留在 stash 列表中以备将来重用。如果我们想从列表中删除它,我们可以使用该git stash drop命令。
git stash pop = git stash apply + git stash drop

高级Git面试题和答案合集

30. 什么命令可以帮助我们知道合并到master的分支列表?

  • git branch --merged 有助于获取已合并到当前分支的分支列表。
  • 注意:git branch --no-merged列出尚未合并到当前分支的分支。

31. 你将如何解决 Git 中的冲突?

  • 只要多人跨多个分支处理同一个文件,就会发生冲突。在这种情况下,git 将无法自动解决它,因为它无法决定哪些更改必须获得优先级。
  • 以下是解决 git 冲突的步骤:
    1. 识别有冲突的文件。
    2. 与处理过文件的成员讨论并确保在文件中完成了所需的更改。
    3. 使用 git add 命令将这些文件添加到暂存部分。
    4. 使用 git commit 命令提交这些更改。
    5. 最后,使用 git 将更改推送到分支。

32. 在提交损坏的情况下,最好的建议步骤是:创建额外的提交或修改现有的提交?

  • 由于以下原因,始终建议创建额外的提交而不是修改现有的提交:
    - 执行修改操作会破坏先前保存的该提交的状态。如果只有提交消息被更改或销毁,这是可以接受的,但可能会出现提交内容被修改的情况。这会导致与提交相关的重要信息丢失。
    - 过度使用git commit --amend可能会产生严重的影响,因为小的提交修正会随着时间的推移继续增长并收集不相关的变化。

33. 如何恢复已经推送的错误提交?

在某些情况下,我们希望从推送的更改中恢复并返回到以前的版本。为了解决这个问题,根据情况有两种可能的方法:

  • 方法1:修复文件的错误更改并创建新的提交并推送到远程存储库。此步骤是修复不良更改的最简单也是最推荐的方法。你可以使用以下命令:git commit -m "<message>"
  • 方法 2:可以创建新提交以恢复在错误提交中所做的更改。它可以使用git revert <name of bad commit>

34. “git cherry-pick”命令的功能是什么?

此命令用于将某些提交从一个分支引入存储库中的另一个分支。最常见的用例是当我们想要将维护分支的提交或向后移植到开发分支时。

35. 解释从 git index 中删除文件而不从本地文件系统中删除所涉及的步骤?

  • 有时,当我们在使用 git add 命令时不小心时,我们最终会在 git 索引中拥有某些不需要的文件。使用该命令git rm将从索引和本地工作树中删除文件,这并不总是可取的。
     
  • git rm我们可以使用git reset命令从暂存版本中删除文件,然后将该文件添加到 .gitignore 文件中,以避免再次重复相同的错误,而不是使用该命令。
git reset <file_name> # remove file from index
echo filename >> .gitingore  # add file to .gitignore to avoid mistake repetition.

36. git merge 和 git rebase 选择哪个命令时,考虑的因素有哪些?

Git面试题解析:这两个命令都确保来自一个分支的更改以非常不同的方式集成到另一个分支中。Git rebase 可以被认为是说使用另一个分支作为工作的新基础。

  • 如有疑问,始终首选使用该git merge命令。

    以下是一些决定何时使用合并和变基命令的因素:
     
  • 如果我们的分支从团队外部的其他开发人员那里获得贡献,例如在开源或公共存储库中,那么 rebase 不是首选。
    - 这是因为 rebase 会破坏分支并导致存储库损坏和不一致,除非使用该git pull --rebase命令。
  • Rebase 是一个非常具有破坏性的操作。如果未正确应用,则会导致已提交的工作丢失,这可能会破坏其他开发人员对存储库所做贡献的一致性。
  • 如果遵循每个功能都有分支的模型,那么在那里 rebase 不是一个好主意,因为它会跟踪开发人员所做的相关提交。但是,如果团队遵循团队的每个开发人员都有分支,那么该分支就没有其他有用的信息要传达。在这个模型中,rebase 没有任何危害,可以使用。
  • 如果有可能需要将提交还原到先前的提交,那么还原变基几乎是不可能的,因为提交数据将被破坏。在这种情况下,可以使用合并。

37. 如何找到在合并操作后破坏某些内容的提交?

  • 如果我们不确定要准确查看什么,这可能是一个耗时的过程。幸运的是,git 提供了一个很好的搜索工具,它以二进制搜索作为git-bisect命令的原理工作。
  • 初始设置如下:
 git bisect start         # initiates bisecting session
git bisect bad           # marks current revision as bad
git bisect good revision # marks last known commit as good revision
  • 运行上述命令后,git 会检查一个标记为“好”和“坏”版本之间的修订版。可以通过将提交标记为“好”或“坏”来再次运行此步骤,并且该过程将继续,直到找到具有错误的提交。

38. git reset --mixed 和 git merge --abort 的功能是什么?

  • git reset --mixed 命令用于撤消对工作目录和 git 索引的更改。
  • git merge --abort 命令用于停止合并过程并返回到合并发生前的状态。

39. Git常见面试题有哪些:你能说出 git revert 和 git reset 的区别吗?

git revertgit reset
此命令用于创建一个新提交,该提交撤消先前提交的更改。此命令用于撤消在 git 存储库中所做的本地更改
使用此命令向项目添加新历史记录而不修改现有历史记录此命令对提交历史、git 索引和工作目录进行操作。

Git面试题和答案合集结论

40. 结论

在本文中,我们已经看到了 git 的介绍和范围以及最常见的 git 面试问题。Git 的受欢迎程度正在以惊人的速度增长,预计有一天世界各地的所有开发人员都将在 git 的帮助下作为一个整体一起工作。

Git 是一个免费可用的分布式版本控制系统,可帮助开发人员在他们的项目上与多人协作并使他们的生活变得轻松。有了如此多的范围和不断增长的需求,git 已经发展成为开发人员生活中不可分割的一部分。

GitHandbookhttps://guides.github.com/introduction/git-handbook/

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: