查看原文
其他

什么是 Git 的 cherry-pick?

编程导航 2024-01-21

The following article is from 面试鸭 Author 编程导航和鱼友们

大家好呀,今天继续给大家分享一些优质面试题,希望对正在找工作的小伙伴有所帮助。

后端

题目一

什么是 Git 的 cherry-pick?

官方解析

Git 的 cherry-pick 是一种将指定的提交(commit)应用到当前分支的操作。它可以帮助我们将某个分支上的某次提交复制到另一个分支上,而无需将整个分支合并过来。

通常,我们在使用 Git 进行版本控制时,会在不同的分支上进行不同的开发工作。有时候,我们需要将某个分支上的某次提交(commit)应用到当前分支上,这时候就可以使用 cherry-pick 操作。

使用 cherry-pick 操作,我们可以复制指定的提交,然后将其应用到当前分支上,这个提交就成为了当前分支上的一个新的提交。cherry-pick 操作可以方便地将某个分支上的某个功能或修复应用到另一个分支上,而无需将整个分支合并过来。

cherry-pick 操作的使用方法如下:

git cherry-pick <commit-id>

其中, 指定了要复制的提交的 ID。这个命令将复制指定的提交,然后将其应用到当前分支上。

需要注意的是,使用 cherry-pick 操作时,可能会出现冲突,这时候需要手动解决冲突,并提交一个新的提交来解决冲突。因此,在使用 cherry-pick 操作之前,我们需要仔细考虑哪些提交需要复制,以及是否会产生冲突等问题。

鱼友的精彩回答

维萨斯的回答

当前分支是在main上面!!!

git chery-pick C3 C4 C7

Starry 的回答

Git 的 cherry-pick 命令,允许将某个分支上的一个或多个提交应用到另一个分支上。

git cherry-pick 命令的作用:是将某个分支的指定提交复制到当前所在的分支上,而不是将整个分支合并过来。这可以方便地将某些特定的修改应用到其他分支上,而无需将整个分支合并。

简单来说,就是将指定的提交(commit)应用于其他分支。

使用 cherry-pick 命令时,需要指定要复制的提交的哈希值或者是可以移植的提交标识符(例如:branchname~2)。这个命令会自动找出这些提交所依赖的其他提交,并把它们也一并复制到目标分支上。

需要注意的是,如果多个提交之间存在冲突,则需要手动解决这些冲突。此外,cherry-pick 命令的使用应该谨慎,因为它可能会导致代码库中出现重复的代码和历史记录。

  1. 基本用法:
git cherry-pick <commitHash>

这个命令会将指定的提交 commitHash,应用到当前分支,会在当前分支产生一个新的提交,当然它们的哈希值是不一样的。

  1. 转移多个提交 Cherry pick 支持一次转移多个提交。

比如:将 A 和 B 两个提交应用到当前分支。这会在当前分支生成两个对应的新提交。

git cherry-pick <HashA> <HashB>

转移一系列的连续提交:

git cherry-pick A..B 

可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。

  1. 常用配置 git cherry-pick 命令的常用配置项如下。

(1)-e,--edit

打开外部编辑器,编辑提交信息。

(2)-n,--no-commit

只更新工作区和暂存区,不产生新的提交。

(3)-x

在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。

(4)-s,--signoff

在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

(5)-m parent-number,--mainline parent-number

如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。

-m 配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号。

JIA 的回答

在 Git 中,cherry-pick 是一种将某个分支上的一个或多个提交应用到另一个分支的操作。通常情况下,我们会使用 git merge 命令将一个分支合并到另一个分支,但是有时候我们并不想将整个分支合并过来,而是只想选择其中的一些提交进行合并,这时候就可以使用 cherry-pick 命令。具体来说,cherry-pick 命令会将指定的提交复制到当前分支,并创建一个新的提交,这个新的提交与原提交的 SHA 值不同,但是提交的内容是相同的。这样就可以实现将某个分支上的一些提交应用到当前分支的目的。使用 cherry-pick 命令的步骤如下:

  1. 切换到要应用提交的目标分支,例如:git checkout master。
  2. 执行 cherry-pick 命令,指定要应用的提交的 SHA 值,例如:git cherry-pick 123456。
  3. 解决冲突(如果有的话)。
  4. 提交更改,例如:git commit -m "Merge commit message"。需要注意的是,使用 cherry-pick 命令可能会导致提交历史出现分叉,因为新的提交与原提交的 SHA 值不同。此外,如果要应用的提交中包含一些依赖于其他提交的更改,那么 cherry-pick 命令可能会失败,因为这些依赖的提交并不在当前分支上。因此,在使用 cherry-pick 命令时,需要仔细考虑其带来的影响,并进行必要的测试和验证。

题目二

如何在 Linux 中查看系统资源使用情况?比如内存、CPU、网络端口。

官方解析

在 Linux 中,可以使用一些命令和工具来查看系统资源使用情况。下面介绍一些常用的命令和工具:

  1. top:top 命令可以实时地显示系统中各个进程的资源使用情况,包括 CPU 使用率、内存使用率、进程 ID 等信息。可以通过 top 命令来查看当前系统的 CPU 和内存使用情况。
  2. free:free 命令可以查看系统中的内存使用情况,包括总内存量、已使用内存量和可用内存量等。可以通过 free 命令来查看当前系统的内存使用情况。
  3. df:df 命令可以查看系统中磁盘的使用情况,包括磁盘总容量、已使用空间和可用空间等。可以通过 df 命令来查看当前系统的磁盘使用情况。
  4. iostat:iostat 命令可以查看系统的 CPU 和磁盘 I/O 使用情况。可以通过 iostat 命令来查看当前系统的 CPU 和磁盘 I/O 使用情况。
  5. netstat:netstat 命令可以查看系统中的网络连接情况,包括本地地址、远程地址、连接状态等信息。可以通过 netstat 命令来查看当前系统的网络连接情况。
  6. lsof:lsof 命令可以查看系统中打开的文件和网络连接情况,包括文件名、文件描述符、进程 ID、进程名等信息。可以通过 lsof 命令来查看当前系统的文件和网络连接情况。

这些命令和工具都可以帮助我们了解当前系统资源的使用情况,方便我们对系统进行优化和管理。同时,也可以通过一些其他的工具,如 htop、iotop 等,来查看系统资源使用情况。

鱼友的精彩回答

爱吃鱼蛋的回答

在 Linux 中,有多种命令可以查看系统资源使用情况。以下是常用的几个命令:

  1. top:top 命令可以实时显示系统进程和资源使用情况,包括 CPU 占用率、内存占用率、交换分区占用率等。按下键盘上的 M 键可以按照内存占用率排序,按下键盘上的 P 键可以按照 CPU 占用率排序;
$ top
  1. free:free 命令可以显示系统内存使用情况,包括总内存、已用内存、空闲内存、缓存和交换分区等信息。运行 free 命令时,可以添加参数 -h 以更友好的方式显示输出结果;
$ free -h
  1. vmstat:vmstat 命令可以显示系统虚拟内存使用情况,包括内存、交换分区、CPU 和 I/O 等信息。运行 vmstat 命令时,可以添加参数 -a 以显示所有的活动和非活动内存块;
$ vmstat -a
  1. ps:ps 命令可以显示系统进程列表和相关信息,包括进程 ID、进程名、用户、内存占用等。可以通过结合不同的参数来获取更详细的信息,还可结合管道符进行筛选,比如 ps aux 可以显示所有进程的详细信息;
$ ps aux
  1. netstat:netstat 命令可以显示当前网络连接状态和相关信息,包括本地 IP 地址、远程 IP 地址、端口号等。可以通过结合不同的参数来获取更详细的信息,比如 netstat -tulpn 可以显示所有 TCP 和 UDP 连接的详细信息,包括 PID 和进程名称;
$ netstat -tulpn

猫十二懿的回答

以下是Linux中一些常用的命令来查看系统资源使用情况:

  • top:实时动态地显示系统的 CPU 使用情况、进程信息、内存占用情况等。可以使用 q 键退出。top命令可以实时显示各个进程的 CPU 占用率、内存占用率等信息。
  • htop:类似于 top,但是在交互性和功能上更加强大。可以使用 q 键退出。
  • free:查看系统内存的使用情况,包括总共的内存量、已使用的内存量、空闲的内存量等。可以使用 -h 参数让输出结果以易读的方式显示。
    • 内存使用情况:free -h,其中 -h 参数可以让输出结果以易读的方式显示,该命令可以显示系统总共的内存量、已使用的内存量、空闲的内存量等信息。
  • vmstat:以文本形式显示系统的 CPU 使用情况、内存使用情况、虚拟内存使用情况等。可以使用 -s 参数来查看更详细的信息。
  • sar:收集系统历史性能数据,并以报告形式输出。可以通过安装 sysstat 包来使用该命令。
  • iostat:显示磁盘 I/O 活动情况,包括读写速度、等待时间等信息。可以使用 -x 参数来显示更详细的信息。
    • iostat -c 1 1 命令可以显示 CPU 的负载情况。
  • mpstat:显示每个 CPU 核心的使用情况,包括用户模式下和内核模式下的占用情况、CPU 间的切换次数等信息。
  • nmon:显示 Linux 系统的各种性能指标,包括 CPU 使用率、内存使用率、磁盘 I/O 使用率、网络吞吐量等。可以使用交互式界面查看。
  • netstat:可以查看正在使用的网络连接、监听的端口等信息。如果只想查看特定端口的连接情况,可以使用 netstat -an | grep PORT 命令来进行过滤。
    • 该命令可以显示当前正在使用的网络连接、监听的端口等信息。如果只想查看特定端口的连接情况,可以使用 netstat -an | grep PORT 命令来进行过滤,其中 PORT 指代特定的端口号。

题目三

如何用 Nginx 做限流,有几种限流算法,分别如何实现?

官方解析

Nginx 可以通过配置限制每个客户端请求的速率来实现限流。具体来说,Nginx 有两种限流方式:基于请求速率限制和基于连接速率限制。

下面分别介绍这两种方式以及常用的限流算法。

  1. 基于请求速率限制:基于请求速率限制是指限制每个客户端的请求速率,常用的限流算法有以下几种:

  • 漏桶算法:在单位时间内处理一定数量的请求,多余的请求则会放入一个“漏桶”中,随后以固定速率处理。

  • 令牌桶算法:在每个单位时间内,将一定数量的“令牌”放入桶中,每次请求需要获取一个令牌才能被处理,当桶中没有令牌时,请求将被拒绝。

  • 计数器算法:简单地对请求计数,并限制每个客户端在单位时间内最多可以处理的请求数量。

在 Nginx 中实现基于请求速率的限流通常需要使用模块,如 ngx_http_limit_req_module、ngx_http_limit_conn_module 等。

  1. 基于连接速率限制:基于连接速率限制是指限制每个客户端的连接速率,常用的限流算法有以下几种:

  • 并发连接数:限制每个客户端同时能够建立的连接数,以此来限制连接速率。

  • 队列长度:将每个连接加入到一个队列中,限制队列中同时存在的连接数量,以此来限制连接速率。

在 Nginx 中实现基于连接速率的限流通常需要使用模块,如 ngx_http_limit_conn_module 等。

要实现基于请求速率或连接速率的限流,我们需要在 Nginx 配置文件中设置相应的限流规则。以下是一个基于漏桶算法的 Nginx 配置示例:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    server {
        location / {
            limit_req zone=one burst=20;
            proxy_pass http://backend;
        }
    }
}

其中,limit_req_zone 指定了一个名为 one 的共享内存区域,用于存储请求的统计信息,同时指定了速率为 10r/s。在 location 中,limit_req 指定了限流规则,并将请求转发到后端服务器。

需要注意的是,不同的限流算法适用于不同的场景,我们需要根据实际情况选择合适的算法和配置参数。同时,在实际应用中,为了防止恶意攻击和 DDOS 攻击,通常需要将多种限流算法组合起来使用。

鱼友的精彩回答

猿二哈的回答

Nginx的限流

  1. Nginx的限流策略有两种:限制访问频率,限制并发连接数
  2. 限制访问频率:limit_req_zone
  3. 其实现为:limit_req_zone key zone rate
  4. key表示定义限流的对象
  5. zone表示定义共享内存区来存储访问信息
  6. rate表示设置最大的访问速率
  7. 限制并发连接数:limit_conn_zone
  8. 其实现为:limit_conn_zone key zone
  9. key表示定义限流的对象
  10. zone表示定义共享区内存来存储访问信息

Nginx的限流算法有三种:计数器,漏桶算法,桶令牌算法

  1. 计数器:计数器在接收一个请求时,会进行累加,累加有上限,不能超过这个值。超过这个值之后的请求会被拦截。计数器会周期性的置零,这就导致计数器算法存在临界问题:在计数器置零前后有大量的请求过来,此时可能会超过允许的最大请求数。
  2. 漏桶算法:流进同的水滴的速率是随机的,流出桶的水滴的速率是固定的。当桶满时,水会溢出。这样就实现了限流的目的。应用场景有:流量整型,流量控制
  3. 通令牌算法:放进桶中的令牌的速率是固定的,请求取出令牌的速率时随机的。当请求达到时,会先去桶中获取令牌。若桶中没有令牌,则请求等待。当桶中的令牌容量满时,新的令牌会被丢弃。

关键词:限制访问频率,限制并发连接数,key,zone,rate,共享内存区,计数器,临界问题,漏桶算法,桶令牌算法,

前端


题目一

什么是前端跨平台?你用过哪些跨平台框架?

官方解析

前端跨平台是指可以在不同的操作系统、不同的浏览器或设备上运行相同的前端应用程序,达到统一的用户体验。目前主要的前端跨平台技术包括以下几种:

  1. 响应式设计:通过 CSS3 媒体查询和弹性布局等技术,使得网站在不同的设备上能够自适应地显示,并提供统一的用户体验。
  2. Progressive Web App(PWA):是一种利用现代 Web 技术开发的应用程序,具有类似于原生应用的交互和体验。PWA 可以在任何平台上运行,可以通过安装到设备主屏幕、离线访问等方式提供更好的用户体验。
  3. 跨平台框架:使用跨平台框架可以开发出一份代码,然后通过框架提供的工具将代码转换成可以在多个平台上运行的应用程序。主要的跨平台框架包括 React Native、Flutter、Ionic、Electron 等。

我用过的跨平台框架包括 React Native 和 Electron。React Native 可以在 iOS 和 Android 平台上开发原生应用,同时也可以在 Web 平台上使用 React 框架进行开发。Electron 可以将 Web 应用程序打包成桌面应用程序,可以在 Windows、macOS 和 Linux 等多个平台上运行。这些跨平台框架可以大大简化开发过程,提高开发效率,同时也可以保证应用程序在多个平台上的兼容性和用户体验。

题目二

git pull 和 git fetch 命令分别有什么作用?二者有什么区别?

官方解析

git pull 和 git fetch 命令都是用于将远程仓库的代码同步到本地仓库。它们的作用如下:

  • git pull 命令用于将远程仓库的代码同步到本地仓库,并且合并(merge)到当前分支。相当于先执行 git fetch 命令获取远程仓库的最新代码,然后执行 git merge 命令合并代码到当前分支。

  • git fetch 命令用于将远程仓库的代码同步到本地仓库,但不会自动将远程分支合并到本地分支。它只是将远程仓库的代码下载到本地仓库,并更新本地仓库对应的远程分支的指针位置。

二者的区别在于,git pull 命令会自动将远程分支合并到本地分支,而 git fetch 命令则只是更新本地仓库的远程分支指针位置,不会自动合并代码。

因此,在多人协作开发的场景下,如果本地分支与远程分支有冲突,建议先使用 git fetch 命令将远程代码同步到本地仓库,然后手动合并代码,再进行提交。这样可以避免自动合并代码导致的冲突问题。

总的来说,git pull 命令适用于简单的场景,而 git fetch 命令适用于复杂的场景,比如需要手动合并代码的情况。

鱼友的精彩回答

猫十二懿的回答

git pull和git fetch都是用于拉取远程代码的命令,但它们在执行过程中有一些区别。

  1. git fetch:

使用 git fetch 可以从远程仓库获取最新代码。执行 git fetch 后,并不会对当前本地代码进行任何改动,也不会自动合并代码。它会将远程仓库的代码更新到本地的一个单独的分支上(例如,origin/master分支),并且该分支的指针会向前移动到最新的提交记录。这个过程只会更新本地代码库的信息,但是不会合并到你的工作区。如果要将远程分支合并到本地分支,则需要使用 git merge 命令进行合并操作。

示例:

git fetch origin master    // 从远程的origin仓库的master分支获取最新版本到本地的origin/master分支
git merge origin/master   // 将本地的origin/master分支合并到当前所在的分支
  1. git pull:

git pull 是将远程仓库的最新代码更新到本地,并与本地仓库合并的操作。

它的执行过程大致可以分为以下步骤:

  1. 获取远程仓库的更新信息

使用 git fetch 命令获取远程仓库的最新(或指定)分支的相关更新信息,包括分支名称、最新的提交记录等,在本地创建一个对应于远程分支的本地分支(默认情况下名称为origin/remote_branch_name)。

  1. 合并远程分支到本地分支

使用 git merge 命令将本地分支与远程分支进行合并,这个过程会将本地分支里的代码与远程分支里的代码进行比较,然后执行一个三方合并操作,将两者的差异代码融合在一起。

  1. 解决合并冲突

如果本地分支和远程分支之间存在代码冲突,那么在执行合并操作时就会出现合并冲突。此时需要手动解决冲突,然后重新添加、提交、推送本地分支。

  1. 更新工作区

最后,将合并后的代码更新到工作区,使得工作区的代码也同步到最新的状态。

因此,git pull 可以看做是 git fetch 和 git merge 命令的组合,先获取远程仓库的更新信息,再将其与本地分支进行合并,并将合并后的代码更新到工作区。在合并过程中,如果出现代码冲突,则需要手动解决冲突,然后重新提交本地分支。

示例:

git pull origin master   //将远程的origin仓库的master分支获取最新版本并merge到当前分支

git fetch和git pull 的区别:

  • git fetch 只是将远程仓库的代码下载到本地,可以选择合并或不合并到本地分支
  • git pull 则是将远程仓库的最新代码下载到本地,并直接合并到当前分支中,它相当于是先执行 git fetch,再执行 git merge 的操作。

题目三

什么是 Javascript 的事件流?有哪些事件流模型?

官方解析

JavaScript 的事件流是指浏览器中所有事件的传递和处理过程。事件流可以分为三个阶段:事件捕获、目标阶段和事件冒泡。

  1. 事件捕获阶段:事件从最外层的文档节点一直往下传递,直到事件到达事件的目标元素。在这个过程中,事件会经过父节点和祖先节点,直到到达目标节点。如果在这个过程中有事件处理程序,则事件将被调用。
  2. 目标阶段:事件到达了目标元素后,将在目标元素上调用事件处理程序。如果有多个事件处理程序绑定到目标元素上,将按照它们的顺序执行。
  3. 事件冒泡阶段:事件在目标元素上处理后,会从目标元素开始,向上传递回文档节点。在这个过程中,事件也会遇到任何绑定的事件处理程序。

目前有两种事件流模型:

  1. W3C 标准事件模型(DOM2级事件模型):事件流由三个阶段组成:捕获阶段、目标阶段和冒泡阶段。这种事件模型中,事件处理程序的调用顺序与它们注册的顺序相同。
  2. Microsoft 事件模型(IE 事件模型):事件流由两个阶段组成:目标阶段和冒泡阶段。在这个事件模型中,事件处理程序的调用顺序与它们注册的相反。

总体来说,W3C 标准事件模型是当前主流的事件流模型。对于事件流,我们需要了解事件捕获、目标阶段和事件冒泡,以便于正确地使用事件处理程序。

星球活动

1.欢迎参与 30 天面试题挑战活动 ,搞定高频面试题,斩杀面试官!

2.欢迎已加入星球的同学 免费申请一年编程导航网站会员 !

3.欢迎学习 鱼皮最新原创项目教程,手把手教你做出项目、写出高分简历!

加入我们

欢迎加入鱼皮的编程导航知识星球,鱼皮会 1 对 1 回答您的问题、直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。

💎 加入星球后,您可以:

1)添加鱼皮本人微信,向他 1 对 1 提问,帮您解决问题、告别迷茫!点击了解详情

2)获取海量编程知识和资源,包括:3000+ 鱼皮的编程答疑和求职指导、原创编程学习路线、几十万字的编程学习知识库、几十 T 编程学习资源、500+ 精华帖等!点击了解详情

3)找鱼皮咨询求职建议和优化简历,次数不限!点击了解详情

4)鱼皮直播从 0 到 1 带大家做出项目,已有 50+ 直播、完结 3 套项目、10+ 项目分享,帮您掌握独立开发项目的能力、丰富简历!点击了解详情

外面一套项目课就上千元了,而星球内所有项目都有指导答疑,轻松解决问题

星球提供的所有服务,都是为了帮您更好地学编程、找到理想的工作。诚挚地欢迎您的加入,这可能是最好的学习机会,也是最值得的一笔投资!

长按扫码领优惠券加入,也可以添加微信 yupi1085 咨询星球(备注“想加星球”):

往期推荐

编程导航,火了!

他,找到了方向

面了15家,放弃了大厂梦

Bean 的生命周期是什么?

面试被面麻,终于上岸知乎了!

Redis 的持久化机制有哪些?




继续滑动看下一个

什么是 Git 的 cherry-pick?

向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存