Git总结 | Git面试都问些啥?

news2024/12/23 5:51:42

什么是Git为什么要用Git等等这些相信看到该标题点进来的同学也不希望浪费时间再看一遍,那么直接进入主题,对于日常工作中常用的Git相关操作进行整理,一起看看吧

面试官:你常用的Git操作是什么?
候选人:git clone
面试官:还有吗?
候选人:没了,我是cv工程师
面试官:好好好这么玩是吧,你最好都能答上来

插播,更多文字总结·指南·实用工具·科技前沿动态第一时间更新在公粽号【啥都会一点的研究生

在这里插入图片描述

如何在Git中创建新分支

git branch <branch-name>

该命令会在当前的位置创建一个新分支,但并不会切换到这个新分支。如果希望切换到新创建的分支,可以使用以下命令

git checkout -b <branch-name>

或者,从Git 2.23版本后,可以使用以下命令来创建并切换到新分支

git switch -c <branch-name>

也正好可以回答“如何在Git中切换分支”

如何删除Git中的分支?

git branch -d <branch-name>

branch-name是待删除的分支名称,该命令会删除本地分支但如果分支有未合并的更改Git会拒绝删除,并提醒先合并或解决冲突

如果确定要强制删除分支,包括未合并的更改,可以使用以下命令

git branch -D <branch-name>

注意,无法删除主分支、当前所在分支或非分支的内容

此外,如果想要删除远程仓库中的分支,可以使用

git push origin --delete <branch-name>

删除分支后commit会发生什么

本地分支

如果分支上的所有更改都已经合并到其他分支,那么分支的删除是安全的,本地分支上的commit历史将被移除

如果分支上有未合并的更改,删除分支时,Git 会阻止删除,并提醒先合并或处理这些更改。这是为了确保不会意外丢失未合并的工作

远程分支

远程分支的删除不会直接删除分支上的commit,而是在远程仓库中标记分支为已删除。这样其他协作者可以看到分支已被删除,但仍然可以在本地找到分支的commit历史直到远程仓库执行了垃圾回收(garbage collection)来清理这些已删除的分支

什么是Git垃圾收集器?

Git 垃圾收集器(Garbage Collector)是一个负责清理不再被引用的 Git 对象的机制。在 Git 中,所有的数据都被存储为对象,包括提交(commits)、树对象(trees)、标签(tags)等。有时候,由于分支切换、分支删除等操作,一些对象可能变得不再可达,但仍然占用着存储空间

Git 垃圾收集器的作用是定期运行,查找那些不再被引用的对象,并将其从 Git 数据库中删除,以释放存储空间。垃圾收集器有助于保持 Git 仓库的健康状态,防止不必要的存储空间占用

在日常使用中,大部分情况下,开发者不需要手动触发 Git 垃圾收集器,因为 Git 会在执行一些操作时自动进行清理。然而,有时可能希望手动运行垃圾收集器,可以使用以下命令

git gc

git gc 和 git gc --auto 有什么区别?

git gc

手动触发 Git 垃圾收集器的方式。当运行git gc时,Git 会执行一系列的清理操作,包括垃圾收集和优化存储等

git gc --auto

自动垃圾收集。在这种模式下,Git 会自动判断是否需要运行垃圾收集,如果需要则执行。通常Git 在一些操作(比如commit、merge等)之后会自动检查并执行垃圾收集,所以大部分时间不需要手动运行 git gc --auto

git gc --no-prune 的作用是什么?

git gc --no-prune 用于运行 Git 垃圾收集器但不执行实际的对象删除操作。在正常的 git gc 运行中,Git 会查找不再需要的对象,并将它们从存储中删除以释放磁盘空间。然而,使用 --no-prune 选项,Git 会执行垃圾收集的其他方面,但保留不再需要的对象而不进行删除

这个选项有时候可能会用于调试或特定的维护场景,允许查看垃圾收集器标记的对象,但不会真正删除它们。这样可以在不改变存储结构的情况下,查看 Git 认为哪些对象可以被清理

什么是 git merge?

git merge 是 Git 中用于合并不同分支的命令。将两个或多个分支的历史和更改集成到一个新的commit中的过程。合并操作通常用于将一个分支的变更合并到另一个分支,以确保这两个分支包含了相同的代码更改

git merge <branch-name>

将指定分支 中的更改合并到当前分支。在执行合并之前,通常需要确保当前分支是要合并的目标分支

git merge有哪些策略?

Fast-forward Merge

Fast-forward(快进)合并发生在当前分支上没有新的commit时,当试图将一个分支合并到另一个分支时,如果没有需要合并的新commitGit 可以直接将目标分支指针移动到源分支的位置,而无需创建新的合并commit,举例说明更清晰

假设有两个分支,masterfeature,并且它们的commit历史如下

  A---B---C  master
       \
        D---E  feature

在这个情况下,在 master 分支执行了 Fast-forward 合并

# 切换到 master 分支
git checkout master

# Fast-forward 合并 feature 分支
git merge feature

Git 将会简单地移动 master 指针到 feature 分支的最新commit E 上,形成一个直线式的commit历史

  A---B---C
       \
        D---E  master, feature

需要注意的是,Fast-forward 合并只能发生在当前分支没有新commit的情况下。如果有新的commit,Git 将执行普通的三方合并(three-way merge)来创建一个新的合并commit

Three-way Merge

Three-way merge(三方合并)通常用于解决分支之间存在冲突的情况。这种合并方式涉及三个版本的代码:两个分支的最新commit(共同祖先和当前分支的最新commit)以及它们的共同祖先,依旧搭配例子食用

任然还是masterfeature分支,commit历史如下

      A---B---C  master
           \
            D---E  feature

执行合并命令

# 切换到 master 分支
git checkout master

# 合并 feature 分支
git merge feature

Three-way merge会干嘛?Git 会找到两个分支的最近共同祖先(commit B),以及它们各自的最新commit(commit C 和 commit E)

      A---B---C
           \ /
            D---E  master, feature

在这个情况下,Git 将会比较三个版本的代码(B、C、E),并尝试合并它们。如果没有冲突,Git 会自动创建一个新的合并commit,形成一个合并后的commit历史

      A---B---C---F  master
           \ /   /
            D---E  feature

如果合并过程中存在冲突,Git 将会标记,等待用户手动解决。用户解决冲突后,再执行 git merge --continue 来完成合并

讲完了两种merge策略,怎么人为指定哪个合并策略?

git merge --no-ff <branch-name>

--no-ff 选项用于强制创建一个新的合并commit,即使可以执行快速前进合并,这样可以保留每个分支的独立历史

要执行Fast-forward 合并,则

git merge --ff <branch-name>

合并提交(Merge Commit)和常规提交(Regular Commit)有什么区别?

Merge Commit

git merge 命令创建,用于合并分支,通常会产生一个新的合并节点,有两个或多个父commit

Regular Commit

git commit 命令创建,记录了在当前分支上的一次更改,产生一个普通节点,只有一个父commit

如何撤消 git commit ?

可以使用git resetgit reset 命令允许将当前分支的 HEAD 指针移动到不同的位置,有三个主要的选项:--soft--mixed--hard,对应于不同的重置模式

git reset --soft
git reset --soft <commit>

回退 HEAD 指针到指定的commit,但保留所有的更改。即不会修改工作目录或暂存区,所有的更改都被标记为未commit的更改,可以直接重新commit

git reset --mixed
git reset --mixed <commit>

默认的reset模式。回退 HEAD 指针到指定的commit,并且重置暂存区但保留工作目录中的更改即未commit的更改会保留在工作目录,但不会被标记为暂存区的更改,需要重新add并commit

git reset --hard
git reset --hard <commit>

最彻底的reset模式。回退 HEAD 指针到指定的commit,重置暂存区,并删除工作目录中未commit的更改慎用这个玩意,因为它会永久性地删除未commit的更改

git reset 和 git revert 有什么区别?

git reset

用于将分支的 HEAD 指针和工作目录重置到指定的commit,可以选择是否保留未commit的更改,主要用于本地分支上的操作,慎用于已推送到远程仓库的分支,以免引起冲突

git reset --soft HEAD^  # 保留未commit的更改,将这些更改标记为暂存区的更改,不修改工作目录
git reset --mixed HEAD^  # 默认模式,将未commit的更改标记为未暂存区的更改,不修改工作目录
git reset --hard HEAD^  # 丢弃未commit的更改,重置暂存区和工作目录到指定的commit
git revert

创建新的commit,撤销指定commit及其之后的更改,而不修改commit历史,适用于已经推送到远程仓库的commit,避免修改历史引起问题

git revert HEAD  # 撤销最后一次commit
git revert <commit-hash>  # 撤销指定commit

Git 中的暂存是什么?

在Git中,“暂存”(Staging)指的是将工作目录中的修改或新文件添加到Git的索引中(也称为暂存区),以便随后commit这些更改。暂存的主要目的是允许选择性地commit文件而不是全部文件的修改,一般的步骤为

  1. 修改文件: 在工作目录中对文件进行修改
  2. 将修改添加到暂存区
git add 文件名
  1. commit到Git仓库
git commit -m "description"

通过使用暂存区,可以控制哪些修改被包含在下次commit中,从而更加灵活地管理项目的版本历史

git rebase 是什么?

git rebase 是 Git 中用于合并分支的一种方式,它与 git merge 类似,但有一些重要的区别

在使用 git rebase 时,通常会选择一个基础分支(base branch)和一个目标分支(target branch)。基础分支上的commit将被移至目标分支上,这个过程涉及到逐个应用commit,因此它会改写commit历史

git rebase <base-branch>

同样以例子来说明,假设我们有两个分支,mainfeature,它们的commit历史如下

          A---B---C main
         /
    D---E---F---G feature

在这个例子中,我们希望将 feature 分支上的commit整合到 main 分支上

执行 git checkout main 切换到 main 分支,然后执行 git rebase feature

git checkout main
git rebase feature

这将会创建一个新的commit历史:

                  A'--B'--C' main
                 /
    D---E---F---G feature

A’、B’ 和C’ 通过逐个应用 feature 分支上的commit得到,这是 git rebase 的基本工作方式

要注意的是,原来的E 、 F、G 并没有被修改,它们保留在历史中。新的commit A’、B’ 和 C’ 被创建,并在 main 分支上形成了一个更加线性的历史

没明白的可以参考

https://git-scm.com/docs/git-rebase

  • git merge 通过多次合并commit生成更全面、更易读的历史记录,如果两个分支有冲突,Git 会生成一个合并commit,需要手动解决冲突
  • git rebase 通过更少的commit创建更清晰、线性的历史记录,在 rebase 过程中,如果有冲突,Git 会逐个应用commit并在每个冲突点停下,需要手动解决冲突,然后继续 rebase。该方式更容易引入风险,因为会修改commit历史,可能导致冲突或数据丢失。

git tag 作用?

git tag 用于给 Git 中的commit打上标签(tag),这些标签通常用于标识某个特殊的commit,比如软件版本发布。标签提供了一个稳定的引用,使得方便地回溯到某个特定的commit,常用的命令选项有

  • -a:用于创建一个带注释的标签
  • -m:指定标签的注释信息
  • -l:列出已有的标签
git tag -a v1.0 -m "Version 1.0 release"

列出所有tag

git tag

列出匹配条件下的tag

git tag -l "v1.*"

git stash 是什么?

git stash 是一个用于保存当前工作目录和暂存区的临时状态的命令。允许在切换分支、应用补丁或执行其他操作之前,将当前的修改存储起来,以便稍后重新应用,非常非常实用,常见的使用场景如

  • 保存当前工作目录和暂存区的状态
git stash save "Work in progress"
  • 切换到其他分支进行操作
git checkout other-branch
  • 在其他分支进行操作
# 在 other-branch 上进行一些操作
  • 切回原始分支并恢复 stash
git checkout original-branch
git stash apply

或者,如果想同时删除 stash,可以使用:

git stash pop

此外,还有一些其他常用命令

git stash list # 显示 Git 存储库中所有存储的列表,以及有关每个存储的一些信息

git stash branch <branch-name> # 将更改应用到不同的分支

git cherry-pick 有什么作用?

git cherry-pick 将指定的commit复制到当前分支,创建一个新的commit,但不会将整个分支合并过来通常用于在不合并整个分支的情况下引入或应用特定的更改

git cherry-pick <commit-hash> # <commit-hash> 是要应用的commit的哈希值

git pull 和 git fetch 之间有什么区别?

git pullgit fetch 都是用于从远程仓库获取更新的 Git 命令,但区别为

git fetch
git fetch origin
  • 从远程仓库获取更新的信息,但并不自动合并或更新本地工作目录, 只是把远程分支的引用和相关对象(commit、tree等)下载到本地,需要手动合并或者在需要的时候将远程分支的变更整合到本地分支上
git pull
git pull origin master
  • 从远程仓库获取更新的信息,并尝试将本地工作目录自动合并到获取的更新中
  • git pull 实际上包含了 git fetch,比如在执行 git fetch 之后,立即执行 git merge 也可以将远程分支的更改合并到当前本地分支

面试官:好好好,你tm装13是吧

以上就是本期全部内容,整理总结不易,期待点赞在看,我是啥都生,下次再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java序列化、反序列化-为什么要使用序列化?Serializable接口的作用?

什么是序列化和反序列化&#xff1f; 把对象转换成字节序列把字节序列恢复成对象 结合OSI七层协议模型&#xff0c;序列化和反序列化是在那一层做的&#xff1f; 在OSI七层模型中&#xff0c;序列化工作的层级是表示层。这一层的主要功能包括把应用层的对象转换成一段连续的二进…

5.5 DataFrame.rolling()创建滚动窗口对象

DataFrame.rolling创建滚动窗口对象 一、介绍二、代码一、介绍 DataFrame.rolling() 是 pandas 中用于创建滚动窗口对象的函数,它可以对时间序列或其他类型的数据进行滚动计算。下面是该函数的一些参数说明: DataFrame.rolling(window, min_periods=None, center=False, win_…

Flink系列之:自定义函数

Flink系列之&#xff1a;自定义函数 一、自定义函数二、概述三、开发指南四、函数类五、求值方法六、类型推导七、自动类型推导八、定制类型推导九、确定性十、内置函数的确定性十一、运行时集成十二、标量函数十三、表值函数十四、聚合函数十五、表值聚合函数 一、自定义函数 …

Windows使用VNC Viewer远程桌面Ubuntu【内网穿透】

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

微信小程序背景图片设置

问题 :微信小程序通过css:background-image引入背景图片失败 [渲染层网络层错误] pages/wode/wode.wxss 中的本地资源图片无法通过 WXSS 获取&#xff0c;可以使用网络图片&#xff0c;或者 base64&#xff0c;或者使用<image/>标签 解决方法微信小程序在使用backgroun…

每日一题:LeetCode-LCR 016. 无重复字符的最长子串

每日一题系列&#xff08;day 15&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

[Kubernetes]3. k8s集群Service详解

在上一节讲解了k8s 的pod,deployment,以及借助pod,deployment来部署项目,但会存在问题: 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod访问还需要端口转发Pod重创后IP变了,名字也变了针对上面的问题,可以借助Service来解决,下面就来看看Service怎么使用 一.Service详…

SpringBoot中使用@Async实现异步调用

SpringBoot中使用Async实现异步调用 什么是异步调用?异步调用对应的是同步调用&#xff0c;同步调用指程序按照定义顺序依次执行&#xff0c;每一行程序都必须等待上 一行程序执行完成之后才能执行&#xff1b;异步调用指程序在顺序执行时&#xff0c;不等待异步调用的语句返…

Python 实现:OCR在图片中提取文字(基于Gradio实现)

Paddle OCR PaddleOCR 基于深度学习技术实现的&#xff0c;使用十分简单。 先看效果 可以看出来识别效果还是不错的&#xff0c;里面的“湿”字识别成了繁体字。如果不是连体字&#xff0c;就不会出现这个问题。 1.测试环境 操作系统&#xff1a;Win10 Python&#xff1a;3…

ROS机器人入门

http://www.autolabor.com.cn/book/ROSTutorials/ 1、ROS简介 ROS 是一个适用于机器人的开源的元操作系统。其实它并不是一个真正的操作系统&#xff0c;其 底层的任务调度、编译、寻址等任务还是由 Linux 操作系统完成&#xff0c;也就是说 ROS 实际上是运 行在 Linux 上的次级…

xv6 文件系统(下)

〇、前言 计算机崩溃后如何恢复&#xff0c;是一个很重要的话题。对于内存中的数据无关痛痒&#xff0c;开机后重新载入就能解决问题&#xff1b;但是对于持久化存储设备&#xff0c;当你尝试修改一个文件&#xff0c;突然断电当你重新打开文件后&#xff0c;这个文件的状态是…

Java基础回顾——面向对象编程

文章目录 面向对象基础方法构造方法默认构造方法多构造方法 方法重载继承多态抽象类接口静态字段和静态方法包作用域内部类 写在最后 https://www.liaoxuefeng.com/wiki/1252599548343744/1255943520012800 面向对象编程Object-Oriented Programming&#xff0c;简称OOP&#…

06. Python模块

目录 1、前言 2、什么是模块 3、Python标准库模块 3.1、os模块 3.2、datetime 模块 3.3、random模块 4、自定义模块 4.1、创建和使用 4.2、模块命名空间 4.3、作用域 5、安装第三方依赖 5.1、使用 pip 安装单个依赖 5.2、从 requirements.txt 安装依赖 5.3、安装指…

Python:(Sentinel-1)如何解析SNAP输出的HDF5文件并输出为GeoTIFF?

博客已同步微信公众号&#xff1a;GIS茄子&#xff1b;若博客出现纰漏或有更多问题交流欢迎关注GIS茄子&#xff0c;或者邮箱联系(推荐-见主页). Python&#xff1a;&#xff08;Sentinel-1&#xff09;如何解析SNAP输出的HDF5文件并输出为GeoTIFF&#xff1f; 01 前言 最近…

【NI-RIO入门】使用LabVIEW进行数据采集测量

于ni kb摘录 选择合适的编程模式 CompactRIO系统具有至少两个用户可选模式。某些CompactRIO型号具有附加的用户可选模式&#xff0c;可以在实时NI-DAQmx中进行编程。请参考本文以判断您的CompactRIO是否能够使用实时NI-DAQmx。将目标添加到项目后&#xff0c;将提示您选择要使…

TestSSLServer4.exe工具使用方法简单介绍(查SSL的加密版本SSL3或是TLS1.2)

一、工具使用方法介绍 工具使用方法参照&#xff1a;http://www.bolet.org/TestSSLServer/ 全篇英文看不懂&#xff0c;翻译了下&#xff0c;能用到的简单介绍如下&#xff1a; 将下载的TestSSLServer4.exe工具放到桌面上&#xff0c;CMD命令行进入到桌面目录&#xff0c;执…

Gitee基础知识

目录 1-gitee 1.1gitee介绍 1.2git与gitee的关系 1.3在国内为什么选择Gitee 2-注册与创建远程仓库 2.1注册 2.2创建远程仓库 2.3配置ssh公钥 2.3.1公钥的生成方法&#xff1a; 2.3.2 在gitee中配置公钥 2.3.4验证公钥 3-添加与推送远程仓库master 3.1基本命令…

78-C语言-完数的判断,以及输出其因子

简介&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为完数&#xff0c;C语言编程找出1000之内的所有完数&#xff0c;并输出其因子。因子可以整除该数字的数&#xff0c; 如6的因子&#xff1a;1 2 3&#xff0c;6%10 6%20 6%30 解释全在注…

20 5G中高速列车通信:设计相关元素以减轻高移动性带来的影响

文章目录 一 、物理层设计1 DMRS2 CSI 和SRS3 PTRS4 多天线配置 二 初始接入三 目前面临困难 解决问题&#xff1a;列车高速移动&#xff0c;会使信道相干时间较短、多普勒频移和多普勒扩展较大等问题。为了在列车高速移动中解决这些问题&#xff0c;这篇文章概括了5G关键技术&…

掌动智能浅谈云网络流量分析的主要过程

在云计算时代&#xff0c;网络流量分析成为确保网络安全和性能的重要环节。随着企业和组织将应用和服务迁移到云平台&#xff0c;对云网络流量进行深入的分析变得至关重要。本文将介绍云网络流量分析的主要过程&#xff0c;以帮助读者更好地理解如何有效地监控和管理云环境中的…