当前位置:   article > 正文

Git面试题整理(对比)

Git面试题整理(对比)

1.拉取请求pull和分支branch有什么区别

拉取请求(Pull Request)
定义:拉取请求是在代码协作平台上发起的一种通知,它告诉其他团队成员:“我完成了一段代码的工作,请审查并合并到主分支中去”。它不仅是请求合并代码的方式,也是代码审查、讨论和修改的平台。
用途:拉取请求的主要目的是促进代码审查和讨论。通过拉取请求,团队成员可以详细了解所提更改,提出建议或请求进一步的修改,最终决定是否将更改合并到目标分支中。
操作:在GitHub、GitLab或Bitbucket等平台上,当你想将一个分支的更改合并到另一个分支时(通常是将特性分支合并到主分支),你会发起一个拉取请求。
分支(Branch)
定义:分支是Git中的一个独立线路,允许你在隔离的环境中开发功能或修复bug,而不影响主线(如main或master分支)或其他分支。每个分支都代表了代码库中的一个可选的开发路你
用途:分支使得开发者可以在不干扰主线稳定性的情况下工作。完成工作后,可以将分支的更改合并回主线或任何其他分支
操作:通过Git命令如 git branch 、git checkout 、 git merge 等来管理。

区别
概念上:分支是Git的一个核心功能,允许你在不同版本的代码间安全地隔离和开发;而拉取请求是一个高级功能,主要存在于在线代码协作平台上,用于代码审查和合并的流程。
目的上:分支用于隔离开发工作,而拉取请求用于通知和请求其他团队成员审查和合并你在某个分支上的工作。
功能上:分支是代码的物理表示,代表代码的不同版本;拉取请求是团队协作的工具,它提供了一个讨论和审查代码的框架,最终目的是改进和合并代码。

2.pull和fetch有什么区别

git pull
功能: git pull 命令实际上是 git fetch 后跟git merge FETCH_HEAD 的快捷方式。它会从远程仓库获取最新的版本,然后将这些更改合并到你当前的分支中。
用途:当你准备好接受远程仓库中的更改,并希望将这些更改立即合并到你的本地工作分支时,使用 git pull 。

git fetch
功能: git fetch 命令从远程仓库下载到本地仓库的最新内容,但不会自动合并到你当前的工作分支中。它会获取远程仓库所有分支的最新提交(包括那些你在本地尚未创建或跟踪的分支)
用途:使用 git fetch 可以让你看到远程仓库。中的所有更新,但不会影响你本地的工作状态。这对于在合并更改之前先审查这些更改非常有用。

区别
主要区别:最主要的区别是 git fetch 仅仅是下载远程仓库的更改到本地,不会自动合并或修改你的当前工作。而 git pull 会下载这些更改并立即尝试将它们合并到当前分支中。
使用场景:如果你想保持本地仓库更新但又不想立即合并更改(可能需要先审查这些更改),那么 git fetch 是更好的选择。如果你信任这些更改,并希望立即将它们并入你的工作,那么 git pull 是更方便的选项。

3.复刻fork、分支branch、克隆clone有什么区别

复刻(Fork)
定义:复刻是指在GitHub、GitLab等代码托管平台上创建一个项目仓库的完整副本到你的账户下。这个副本是独立的,你在复刻的仓库上的更改不会影响原始仓库,直到你决定通过发起拉取请求(pull request)贡献你的更改
用途:复刻允许你在不影响原始仓库的情况下自由地试验和更改项目。它是开源协作的基础,使得任何人都可以对项目做出贡献。
分支(Branch)
定义:分支是仓库内部的一个独立线路,允许你在隔离的环境中进行开发或修复。每个分支都是对同一个项目的不同版本的引用。
用途:分支使得多任务工作和协作变得容易,开发者可以在不影响主分支(如main 或master)的情况下工作。

克隆(Clone)
定义:克隆是指将远程仓库的完整副本下载到本地计算机。这个副本包括所有的文件、代码、分支和提交历史。
用途:克隆是开始在项目上工作的第一步。它让你能够在本地工作并提交更改,然后通过推送(push)操作将本地更改同步到远程仓库,


区别
层级和位置:复刻是在远程层级上创建仓库的副本,而克隆是将远程仓库的副本下载到本地。分支是在这个仓库内部创建的不同开发线路。
目的:复刻让你可以在自己的版本上工作,独立于原始仓库;分支让你可以在相同仓库内安全地开展新的开发或修复工作;克隆是获得远程仓库副本的手段,以便在本地工作。
协作流程:复刻通常是贡献到开源项目的第一步,分支是进行实际开发的手段,克隆则是将工作从远程仓库带到本地环境的方法。

4.HEAD、工作树、索引有什么区别

HEAD
定义:HEAD是当前分支引用的符号名称,它指向当前分支的最新提交。简单来说,HEAD就是你正在工作的最后一次提交的快照,
作用:HEAD主要用于表示当前的工作环境。当你切换分支时,HEAD会更新以指向新分支的最新提交。在提交操作时,Git会根据HEAD所指的位置来创建新的提交、
工作树(工作目录)
定义:工作树(或工作目录)是项目文件的一3个可见快照,它包含了当前分支上的所有最近拉取的更改。这是你实际编辑、查看和开发的地方。
作用:工作树让你可以看到并编辑项目的当前状态。当你对文件进行更改时,这些更改首先出现在工作树中。

索引(暂存区)
定义:索引(暂存区或称为暂存环境)是一个中介层,它记录了即将被提交到仓库历史中的更改。当你执行 git add 命令时,更改会被添加到索引中。
作用:索引允许你精细控制哪些更改将被包括在下一个提交中。这意味着你可以编辑多个文件,然后选择性地暂存和提交这些更改,以创建一个逻辑上完整的提交。
区别
位置和功能:HEAD是一个指针,指向当前分支的最新提交;工作树是你的文件的实际工作副本;索引是准备提交到仓库的更改的区域。
用途:HEAD用于标识当前查看和工作的历史点;工作树是对文件的实际更改进行编辑的地方;索引是一个准备阶段,用于组织和准备提交的更改。
操作:你可以使用 git checkout 命令移动HEAD,使用编辑器或其他工具修改工作树中的文件,使用 git add 命令更新索引以包括新的或更改的文件准备提交。

5.merge和rebase有什么区别,什么情况要用rebase代替merge

git merge
工作方式:将两个分支的历史合并成一条线。当你执行 git merge 时,Git会创建一个新的"合并提交"(merge commit),这个提交有两个父节点,一个指向当前分支的末端,另一个指向被合并分支的末端。
项目历史:保留了分支的历史信息,显示了一个包含所有分支的真实开发历史的合并图。
使用场景:适用于当你想保持项目历史的真实性和分支间交互的情况。常用于公共分支或团队协作中。
git rebase
工作方式:将一个分支的更改重新应用(reapply)在另一个分支之上。执行 gitrebase时,Git会将更改从一个分支取出(如通过一系列的补丁),然后在另一个分支上逐个应用这些更改。

项目历史:创建一个更线性的项目历史。通过重新应用更改,它仿佛是在一个分支上顺序开发的,消除了分支合并点。
使用场景:适用于当你想要一个干净、线性的项目历史的情况。常用于个人分支上,以整洁地整合最新的上游更改,或在将工作合并到公共分支之前清理提交历史.


主要区别
历史保留:merge保留了所有分支的历史和合并点,而rebase通过改写提交历史来提供一个更线性的历史视图。
冲突解决:在 merge中,冲突一次性解决于合并提交中。在 rebase 过程中,冲突需要在重应用每个提交时逐个解决,可能需要更多的手动干预。
历史改写:rebase实质上是改写了历史,这在共享分支上可能会导致问题。因此,通常建议只在私有分支上使用 rebase,避免对已经推送到远程仓库的公共分支进行rebase

使用 git merge 的情况
1.保留分支历史:git merge 保留了分支的历史因为它会生成一个合并提交,这个提交有两个父提交。这对于记录项目中重要事件,如特性合并和版本发布,非常有用。
2.合并大型或长期特性

使用 git rebase 的情况
1.保持线性项目历史: git rebase 会重新应用一个分支上的更改到另一个分支上。这意味着它可以用来更新一个特性分支,使其包含基分支(如 main 或develop)的最新更改。这种方式避免了合并提交,保持了项目历史的线性,使之更易于理解和导航。
2.清理提交历史:在将特性分支合并到基分支之前,使用 git rebase 可以对提交历史进行整理,比如压缩(squash)多个小提交成一个更有意义的提交,或者重写提交信息以增加清晰度。这样可以保持基分支的提交历史干净整洁,
3.避免不必要的合并提交:对于正在进行的特性开发,使用 git rebase 而不是 git merge 来同步基分支的更改可以避免生成多余的合并提交。这对于跟踪和审查特性开发过程中引入的更改很有帮助。对于大型或长期开发的特性分支,合并而不是变基可以更好地保留项目的历史上下文,尤其是当涉及到多人协作时。

6.git rm 和rm有什么区别

git rm
Git命令: gitrm是一个Git命令,用于从Git仓库中删除文件。这包括将文件从工作目录和暂存区(索引)中移除。
版本控制影响:使用 git rm 删除文件后,这个删除操作会被记录为一个更改,需要通过 gitcommit 命令提交。这意味着删除操作会被版本控制跟踪。

rm
Shell命令:rm是一个Shell命令(如bash或zsh中的命令),用于从文件系统中删除文件或目录,与Git无关。
版本控制影响:使用rm 删除文件只会影响工作录,不会直接影响Git的暂存区或仓库。为了反映这个删除操作到版本控制中,你需要使用 git rm来更新Git的暂存区,或者在删除文件后使用 git add -u 。

区别
上下文: git rm 在Git的上下文中工作,确保删除操作被版本控制系统跟踪;而rm 是一个通用的文件系统命令,用于删除文件或目录,与版本控制无关。
影响范围: git rm 同时影响工作目录和Git的暂存区,删除操作需要被提交;rm 仅影响文件系统,对Git仓库没有直接影响,需要额外的Git命令来同步这个更改到版本控制系统中。

7.Git和SVN有什么区别

1.分布式与集中式
Git是一个分布式版本控制系统(DVCS)。在.Git中,每个开发者的电脑上都有仓库的完整副本,包括全部历史记录。这意味着操作(如提交、分支、合并等)都是在本地执行的,不依赖于网络连接到中央服务器,
SVN是一个集中式版本控制系统(CVCS)。在SVN中,有一个中央仓库,它包含了所有的文件和历史记录。开发者在本地工作时需要频繁地与这个中央仓库通信(如提交更改)。

2.分支和合并
Git对分支和合并提供了一流的支持。在Git中分支是轻量级的(仅是指向特定提交的指针),创建和合并分支非常快速和简单。
SVN的分支和合并相对较重,操作更复杂。在SVN中,分支是通过复制整个项目到另一个录来实现的,这使得分支操作比Git更重量级。

3.数据模型
Git使用内容寻址的文件存储系统。每次提交都是对仓库状态的完整快照,Git通过哈希值来标识和管理对象(如提交、文件等)。
SVN按照线性方式管理版本,每次提交都是基于前一版本的增量更改。它使用版本号来标识项目状态的不同点。
4.性能
Git在性能方面通常比SVN更优,特别是在分支和合并、处理大型项目时。Git的操作大多在本地执行,不需要网络交互。
SVN在处理大型二进制文件时可能表现得更好,因为它可以只检出部分仓库。但是,需要频繁的网络交互可能会减慢操作速度。
5.权限控制
SVN提供了更细粒度的权限控制。管理员可以对仓库的不同部分设置不同的访问权限。
Git的权限控制相对较粗,通常是在仓库级别上。不过,通过使用Git托管服务(如GitHub、GitLab等),可以实现更细粒度的权限管理,

8.GitHub和GitLab有什么区别

1.所有权和托管选项
GitHub:最初是一个独立公司,2018年被微软收购。它提供了免费的公共仓库和私有仓库以及付费的团队和企业选项。GitHub主要是一个基于云的托管服务,但也提供了GitHubEnterprise Server,允许用户在自己的服务器上托管。
GitLab:作为一个单一的应用程序,提供了从项目规划和源代码管理到CI/CD、监控和安全性的全面解决方案。GitLab提供免费和付费版本,包括自托管选项和GitLab.com的云托管服务。

2.集成的CI/CD
GitHub:通过GitHub Actions,提供了内置的CI/CD工具,使开发者可以直接在GitHub仓库中自动化构建、测试和部署他们的代码。
GitLab:内置的CI/CD是GitLab的一个核心特性,允许开发者使用GitLab CI/CD进行自动化流程。GitLah在提供CUCD方面更为全面和灵活。

3.界面和用户体验
GitHub:以其简洁和用户友好的界面而闻名,特别是对于开源项目。GitHub的Pull Reguest是开源项目合作的标准方式。
GitLab:提供了一个更为综合的界面,集成了更多的项目管理和DevOps工具。它的Merg4Request功能与GitHub的Pull Request类似,但是在项目管理和DevOps集成方面提供了更多功能。
4.功能和服务
GitHub:强大的社区特性,如GitHub Pages(静态网站托管)、GitHub Actions(自动化、以及大量的集成和应用程序,CV/CD)
GitLab:提供了一站式的DevOps解决方案,包括问题跟踪、Wiki、CV/CD、容器注册表和Kubernetes集成等、
5.价格策略
GitHub和GitLab都提供免费计划,但它们的付费计划在价格、功能和服务水平方面有所不同。GitLab的自托管选项对于希望完全控制其DevOps工具链的企业来说是一个吸引人的选择。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/126704?site
推荐阅读
相关标签
  

闽ICP备14008679号