git面试题

解释Git的fetch、merge和rebase命令的区别,以及在什么情况下你会选择使用它们

1、git fetch只会拉取远程的内容分支到本地,但是不会自动合并,
是否合并取决于用户的操作。
2、get merge则不同,get merge会将两个分支进行合并,两条分支线在合并处会产生一个交点并新增一条commit记录
3、git rebase 把分叉的提交历史"整理"成一条直线,看上去更直观.缺点是本地的分叉提交已经被修改过了。
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

fetch 是获取信息,不改变工作目录和索引。
merge 用于合并分支,会产生一个新的合并提交,保留所有历史。
rebase 用于整合分支,通过重新应用提交来使历史更加线性,但会改变提交历史。
选择使用哪个命令取决于你的具体需求:是否需要查看远程更新(fetch)、是否希望保留合并提交的历史记录
(merge)或追求简洁的线性历史(rebase),以及团队的协作规范。

在Git中,什么是“fast-forward”合并?它与非“fast-forward”合并有什么不同?

1、如果当前分支在合并分支前,没有做过额外提交。那么合并分支的过程不会产生的新的提交记录,而是直接
将分支上的提交添加进来,这称为 fast-forward 合并;这种合并方式不会创建新的提交,而是直接在当前
分支中合并提交,且当旧分支被移除后,其分支信息也会被一并删除。
2、在当前分支分离出子分支后,做了一些修改;而分离出的子分支也做了修改。这个时候再使用 git merge,
就会触发 no-fast-forward 策略了。
Git 会在当前分支(active branch)额外创建一个新的 合并提交(merging commit)。这条提交记录既指向
当前分支,又指向合并分支。

解释Forking工作流程的优点?

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

1. 明确的项目所有权和贡献者角色
Forking工作流程通过复刻和拉取请求明确区分了项目维护者和贡献者的角色,确保了项目的所有权和控制权保持在核
心维护者手中。
2. 提高项目的安全性
贡献者无法直接向主仓库提交更改,这减少了误操作或恶意更改对项目的直接影响。所有的更改都需要通过审查流程,
从而提高了代码的安全性和质量。
3. 促进代码审查和质量控制
拉取请求提供了一个自然的代码审查机制,团队成员可以在合并更改之前讨论、审查和修改代码。这有助于保持代码质
量和一致性。
4. 降低项目维护的门槛
贡献者通过自己的复刻工作,这意味着他们可以自由地实验和提交更改,而不需要项目维护者提前授予仓库的写入权
限。这降低了参与和贡献的门槛,鼓励了更多的开源贡献。
5. 灵活的协作和集成流程
Forking工作流程适应于各种规模的项目和团队,从小型项目到大型企业级开源项目。它支持灵活的协作模式和集成策
略,如持续集成/持续部署(CI/CD)。
6. 便于管理和跟踪贡献
所有贡献都通过拉取请求进行,使得跟踪和管理外部贡献变得容易。项目维护者可以清晰地看到每个贡献的历史和背景

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

复刻(fork):复刻是指将一个项目的源代码从一个仓库复制到另一个仓库的过程,它可以让你在自己的仓库中创建一
个完全独立的副本,以便在不影响原始仓库的情况下进行开发。

分支(branch):分支是指在一个仓库中创建一个新的分支,以便在不影响主分支的情况下进行开发。

克隆(clone):克隆是指将一个仓库的源代码复制到另一个仓库的过程,它可以让你在自己的仓库中创建一个完全独立
的副本,以便在不影响原始仓库的情况下进行开发。

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

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

拉取请求(pull request):
    拉取请求是在代码协作平台上发起的一种通知,它告诉其他团队成员:“我完成了一段代码的工作,请审查并合并到
    主分支中去”。它不仅是请求合并代码的方式,也是代码审查、讨论和修改的平台。

分支(branch):
    分支是Git中的一个独立线路,允许你在隔离的环境中开发功能或修复bug,而不影响主线(如main或master分
    支)或其他分支。每个分支都代表了代码库中的一个可选的开发路径。

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

简述Git Flow的分支类型和作用 ?

git flow中规定了有五种分支,分别为master、develop、hotfix、release、feature。

master:存储正式发布的历史,每次提交都代表一个生产环境中的发布版本,只接收hotfix和release的合并;
release:该分支为预发布分支,作为提测分支,由develop分支拉取,最终合并进master;
hotfix:该分支为bug修复分支,当有线上bug时,由master分支拉取hotfix进行修改,最终合并给master;
develop:该分支作为开发分支,包含了下一个发布周期中的所有新开发特性,拉取feature分支,feature合并之后,
由develop拉取release进行提测;
feature:用于开发新功能或改进,每个功能分支专注于构建单一的功能或修复,每一个独立的需求单独拉取feature,
开发完成之后合并进develop。

Git Flow提供了一种清晰的分支管理策略,通过定义特定的分支类型和工作流程来帮助团队管理复杂的开发和发布过
程。这种工作流程尤其适用于有固定发布周期或需要维护多个版本的项目。

如果分支是否已合并为master,你可以通过什么方式检测知道?

1、git branch --merged  列出了所有已经被合并到当前分支的分支
2、git merge-base <branch-name> master命令找出两个分支最近的共同祖先。
3、git show <branch-name> 检查这个共同祖先是否是分支的最新提交
4、git log --graph --oneline --decorate <branch-name> 搜索分支的提交是否出现在master分支的历史
5、git cherry master <branch-name> 显示两个分支间的差异提交。未被合并的提交会被标记为+

简述什么是“git cherry-pick”?

git cherry-pick是一个强大的Git命令,用于将一个或多个其他分支的提交应用到当前分支。
这个命令让你能够选择性地拾取某个分支上的提交
单个提交:git cherry-pick [commit-hash],这里[commit-hash]是你想要拾取的提交的哈希值。
多个提交:可以连续列出多个提交哈希值,也可以使用范围操作符,如git cherry-pick startHash^..endHash,
这将拾取从startHash到endHash之间的所有提交(包括endHash,但不包括startHash)
冲突:git cherry-pick可能会引起冲突,就像合并操作一样。如果发生冲突,Git会停止应用提交,让你解决冲突。
解决后,你需要使用git cherry-pick --continue来继续应用提交。
选择性地引入更改:虽然cherry-pick提供了高度的选择性,但它也可能导致分支历史混乱,尤其是当被拾取的提交依
赖于其他未被拾取的更改时。
powered by GitbookEdit Time: 2024-07-09 16:59:46