Git 相关面试

一、对 Git 的理解?Git 和 SVN 的区别?
  • 是一个开源的分布式版本控制系统,使用它可以跟踪所有文件的改动,可以指向任意特定版本的更改。
  • 它最大的优势就是不需要依赖中央服务器来存储项目,在么有网络的情况下也可以 add、commit 操作,起到本地保存作用。
  • 它是用C语言编写的,Git 快,是因为C语言通过减少运行时的开销来实现的。
GitSVN
分布式版本控制系统集中式版本控制系统
不依赖与中央服务器依赖于中央服务器
客户端可以clone整个远程仓库版本存储记录在服务器端村粗
离线也可以执行commit操作离线状态无法操作
pull / push 操作较快pull / push 操作缓慢
二、git stash 使用?
  • 首先说明其必要性:在实际开发中,当你在当前分支下处理一个项目时,突然需要切换到别的分支下,如果你直接切换,会使其处于混乱状态。为了能够保留住当前分支的修改,可以使用 git stash;
  • git stash可以将你的工作区的修改内存存储在栈区中,你可以随时去使用这些更改。

使用场景:
(1)解决冲突时,会先 git stash,然后解决冲突
(2)开发过程中遇紧急开发需求但当前修改还不能够提交时,会先 git stash ,在进行紧急任务的开发,之后再通过 git stash pop 来取出栈区中的内容继续开发
(3)切换分支时,当前工作区的内容还不能提交,会先 git 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

git stash drop stash@{0}。   //删除指定项
四、提交过程中,怎么会发生冲突?该怎么解决?

产生冲突:在实际开发中,如果A和B同时修改了一个文件,B提交文件后,A再去提交,就会出现非他自己的修改,就会产生冲突。

解决:

  1. 一般情况下,需要在编译器里对比 本地文件 和远程文件 的区别,然后把远程文件上的内容手工修改到本地文件,然后再提交冲突的文件使其保证与远程分支的文件一致,这样才会消除冲突,然后再提交自己修改的部分。注意:修改本地冲突文件使其与远程仓库的文件保持一致后,需要提交后才能消除冲突,否则无法继续提交。必要时可与同事交流,消除冲突。
  2. 使用命令来解决

(1)git stash    //把工作区的修改提交到栈区,目的是保存工作区的修改
(2)git pull    //把远程分支的代码拉取到本地,目的是解决冲突
(3)git stash pop    //把保存在栈区的修改部分,合并到最新的工作空间中

五、git merge 和 git rebase 的区别?
  1. 首先二者的性质都是分支合并的命令;
  2. git merge branch会把branch分支的差异内容pull到本地(即拿到要合并分支的最新内容),然后与本地分支的内容一并形成一个committer对象提交到主分支上,合并后的分支与主分支一致;
    merge 会把公共分支和你当前的commit 合并在一起,形成一个新的 commit 提交
    在这里插入图片描述
  3. git rebase branch会把branch分支优先合并到主分支,然后把本地分支的commit放到主分支后面,合并后的分支就好像从合并后主分支又拉了一个分支一样,本地分支本身不会保留提交历史。
    git rebase 你其实可以把它理解成是“重新设置基线”,将你的当前分支重新设置开始点。这个时候才能知道你当前分支于你需要比较的分支之间的差异。
    rebase 会把你当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。
    在这里插入图片描述

注意:
(1)不要在公共分支上使用rebase
(2)本地与远程对应同一条分支,应优先使用rebase,而不是merge
(3)二者只是使用场景不同而已

为什么不要再公共分支使用rebase?

因为往后放的这些 commit 都是新的,这样其他从这个公共分支拉出去的人,都需要再 rebase,相当于你 rebase 东西进来,就都是新的 commit 了

  • 1-2-3 是现在的分支状态
  • 这个时候从原来的master ,checkout出来一个prod分支
  • 然后master提交了4.5,prod提交了6.7
  • 这个时候master分支状态就是1-2-3-4-5,prod状态变成1-2-3-6-7
  • 如果在prod上用rebase master ,prod分支状态就成了1-2-3-4-5-6-7
  • 如果是merge,prod分支状态就变成了1-2-3-6-7-8,
  • … |4-5|
  • 会出来一个8,这个8的提交就是把4-5合进来的提交

常用指令:
git rebase -i dev      // 将Dev合并到当前分支
git rebase --abort      // 放弃一次合并
。。。

六、项目中是使用的GitFlow工作流程吗?它有什么好处?

GitFlow可以用来管理分支。GitFlow工作流中常用的分支有下面几类:

  • master分支:最为稳定功能比较完整的随时可发布的代码,即代码开发完成,经过测试,没有明显的bug,才能合并到 master 中。请注意永远不要在 master 分支上直接开发和提交代码,以确保 master 上的代码一直可用;
  • develop分支:用作平时开发的主分支,并一直存在,永远是功能最新最全的分支,包含所有要发布 到下一个 release 的代码,主要用于合并其他分支,比如 feature 分支; 如果修改代码,新建 feature 分支修改完再合并到 develop 分支。所有的 feature、release 分支都是从 develop 分支上拉的。
  • feature分支:这个分支主要是用来开发新的功能,一旦开发完成,通过测试没问题(这个测试,测试新功能没问题),我们合并回develop 分支进入下一个 release
  • release分支:用于发布准备的专门分支。当开发进行到一定程度,或者说快到了既定的发布日,可以发布时,建立一个 release 分支并指定版本号(可以在 finish 的时候添加)。开发人员可以对 release 分支上的代码进行集中测试和修改bug。(这个测试,测试新功能与已有的功能是否有冲突,兼容性)全部完成经过测试没有问题后,将 release 分支上的代码合并到 master 分支和 develop 分支
  • hotfix分支:用于修复线上代码的bug。**从 master 分支上拉。**完成 hotfix 后,打上 tag 我们合并回 master 和 develop 分支。

GitFlow主要工作流程:

  • 1.初始化项目为gitflow , 默认创建master分支 , 然后从master拉取第一个develop分支

  • 2.从develop拉取feature分支进行编码开发(多个开发人员拉取多个feature同时进行并行开发 , 互不影响)

  • 3.feature分支完成后 , 合并到develop(不推送 , feature功能完成还未提测 , 推送后会影响其他功能分支的开发);合并feature到develop , 可以选择删除当前feature , 也可以不删除。但当前feature就不可更改了,必须从release分支继续编码修改

  • 4.从develop拉取release分支进行提测 , 提测过程中在release分支上修改BUG

  • 5.release分支上线后 , 合并release分支到develop/master并推送;合并之后,可选删除当前release分支,若不删除,则当前release不可修改。线上有问题也必须从master拉取hotfix分支进行修改;

  • 6.上线之后若发现线上BUG , 从master拉取hotfix进行BUG修改;

  • 7.hotfix通过测试上线后,合并hotfix分支到develop/master并推送;合并之后,可选删除当前hotfix ,若不删除,则当前hotfix不可修改,若补丁未修复,需要从master拉取新的hotfix继续修改;

  • 8.当进行一个feature时 , 若develop分支有变动 , 如其他开发人员完成功能并上线 , 则需要将完成的功能合并到自己分支上,即合并develop到当前feature分支;

  • 9.当进行一个release分支时 , 若develop分支有变动 , 如其他开发人员完成功能并上线 , 则需要将完成的功能合并到自己分支上,即合并develop到当前release分支 (!!! 因为当前release分支通过测试后会发布到线上 , 如果不合并最新的develop分支 , 就会发生丢代码的情况);

GitFlow的好处:
为不同的分支分配一个明确的角色,并定义分支之间如何交互以及什么时间交互;可以帮助大型项目理清分支之间的关系,简化分支的复杂度。

七、使用过git cherry-pick,有什么作用?

命令git cherry-pick可以把branch A的commit复制到branch B上。

在branch B上进行命令操作:
复制单个提交:git cherry-pick commitId
复制多个提交:git cherry-pick commitId1…commitId3
注意:复制多个提交的命令不包含commitId1.

八、git系统中HEAD、工作树和索引之间的区别?
  1. HEAD文件包含当前分支的引用(指针);
  2. 工作树 把当前分支检出到工作空间后形成的目录树,一般的开发工作都会基于工作树进行;
  3. 索引index文件 是对工作树进行代码修改后,通过add命令更新索引文件;git系统通过索引index文件生成 tree 对象;
九、如何把本地仓库的内容推向一个空的远程仓库?

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

git remote add origin XXXX

注意:XXXX是你的远程仓库地址。
如果是第一次推送,则进行下面命令:

git push -u origin master

注意:-u 是指定origin为默认主分支
之后的提交,只需要下面的命令:

git push origin master
十、如果我想修改提交的历史信息,应该用什么命令?
// 会用到的命令是
git log [-number]
git rebase -i HEAD~[number]
git commit --amend
git rebase --continue
十一、已经拉取了release分支,但又发现了线上bug,处理方式?
  1. release分支没有修改:将hot fix-*合并到master、develop分支后,重新拉取release;
  2. release分支有修改:将bug修复后,hotfix-*合并到master、develo和release分支。
十二、
待完善 …

温馨提示:本文部分内容摘自:博文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值