2023年12月

这款即将推出的 Zorin OS 17 能为你带来什么样的视觉盛宴?你有何感想?

作为公认 最美的 Linux 发行版 之一,Zorin OS 的下一轮升级近在眼前。

在正式推出之前,他们已经公开了 Zorin 17 的各项新功能和首个测试版的发布时间。

那么,让我们一起来探索 Zorin 17 的新增内容吧。

Zorin OS 17:最好的部分

Zorin OS 17 将成为一个主要版本,它是一个长期支持版本(直到 2027 年 6 月),并且包含许多令人兴奋的新改进。

据开发人员称,Zorin OS 17 的设计初衷是为他们提供“迄今为止最卓越且最精致的计算体验”,而且这一说法似乎有理有据。

比如,Zorin OS 17 引入了“空间桌面”的设计理念,用以提升用户对于桌面活动的认知。

在 Zorin OS 17 的测试版中,展现出了新颖的 “桌面立方体” 效果,用户可以通过富有深度感的 3D 立方视角在工作区之间切换。它运用了视差效果,使应用窗口呈现出独特的悬浮感。

此外,还引入了全新的 “空间窗口切换器”,以整洁的 3D 切换效果替代了标准的平面 / 2D 的 Alt+TabSuper+Tab 窗口切换。

在我看来,这些看起来确实不错。然而,这些效果可能不是每个人都喜欢,好在默认情况下这些“空间特性”是不启用的

尽管如此,这确实是大胆的一步。Linux 发行版引入了更多的视觉交互特性,这实在不常见。鉴于 Zorin OS 原本就是颜值出众的发行版,新的多任务处理流程和空间桌面无疑将其视觉体验提升了一个档次。

macOS 用户或 Windows 用户可能不喜欢典型的 Linux 发行版用户界面,他们可能会考虑尝试使用 Zorin OS 的可视化方法来使用 Linux。

虽然这可能并不是科技突破,但我坚信,它对于把视觉体验视为优先的大量用户来说,其改变是实实在在的。

与此同时,Zorin OS 依然保持了骄人的核心优势——“赋予用户对自己体验的掌控”。看得出,他们将这些视觉元素融入进去,并使得计算体验充满了乐趣。

你必须从 Zorin 外观 Appearance 设置下的新“ 效果 Effects ”部分手动启用这些功能。

然后是高级窗口平铺体验,这是社区最需要的功能之一。

现在,你可以轻松实现窗口在屏幕四分之一角落的平铺,甚至可以用键盘快捷键调整窗口在屏幕上的排布。这使得无痛的多任务处理变得触手可及

甚至软件商店也进行了改进,速度更快,并采用了新设计和更新的主页,以非常直观的方式列出了应用。应用详细信息页面也得到了改进,以显示更大的截图和新信息。

同样,引入了新的快速设置菜单,使你可以方便地访问重要设置,并且允许你使用新的电源模式选项(性能/平衡)调整系统性能。电源模式应该对笔记本电脑用户有帮助。

开发人员还展示了一种新的截图和屏幕录制工具,如果你使用过 GNOME 的原生工具,那用这个工具会让你感觉非常得心应手。

他们还提到了两种新的桌面布局,一种是类似 ChromeOS 布局,另一种是类似 GNOME 2 布局。

ChromeOS-like layout

这些布局将在 Zorin OS 17 Pro 发布时提供。

总的来说,看到 Zorin OS 在追求的高质量用户体验,这的确是 Linux 发行版中少有的。这应当能让 Zorin 在众多发行版中脱颖而出,并有可能吸引更多的 Windows 和 macOS 用户尝试 Linux。

有关即将发布的 Zorin OS 17 版本的更多详细信息,你可以参考 官方博客

最后,你有兴趣提前一睹为快吗?

? 你现在就可以从 官方网站 下载 Zorin OS 17 Core Beta。请记住,不建议用于生产/日常使用
Zorin OS 17 Core Beta

? 你对 Zorin 17 的发布感到兴奋吗? 请在下面告诉我们!


via: https://news.itsfoss.com/zorin-os-17-beta/

作者:Sourav Rudra 选题:lujun9972 译者:geekpi 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出

1 人工智能聊天机器人被用来越狱其它人工智能

现代聊天机器人有能力通过伪装特定性格或像虚构人物一样行事来扮演角色。新研究利用了这一能力,要求一个特定的人工智能聊天机器人充当研究助手。然后,研究人员指示这个助手帮助开发可以 “越狱” 其他聊天机器人的提示语。事实证明,研究助理聊天机器人的自动攻击技术在 42.5% 的时间内成功地攻击了 GPT-4,对 Claude 2 的攻击有 61% 的成功率,对开源聊天机器人 Vicuna 的攻击有 35.9% 的成功率。研究人员称,这种助理聊天机器人提升了 25 倍的越狱效率。

(插图:DA/43112e8c-6b66-45f5-b877-a0dd29ae9afa)

消息来源:Scientific American
老王点评:“黑化”的 AI 果然会影响更多 AI。

2 几乎所有密码管理器在安卓上会泄露凭证

当安卓应用程序在 WebView 中加载登录页面时,密码管理器被调用来自动填写凭证时,理想情况下,它应该只自动填写已加载的谷歌或 Facebook 等页面。但研究人员发现,自动填写操作可能会意外地将凭证暴露给底层应用程序。这个漏洞的影响非常大,尤其是在应用程序是恶意程序的情况下。几乎所有的密码管理器,包括 1Password、LastPass、Keeper 和 Enpass,在最新的安卓设备上都存在这个名为 “AutoSpill” 的漏洞。甚至,即使禁用了 JavaScript 注入,大多数密码管理器也容易发生凭据泄漏。该团队还在调查该漏洞是否可以在 iOS 上复制。

(插图:DA/d05324b2-2021-40ba-8d03-023261eea4c0)

消息来源:Tech Crunch
老王点评:这锅不能是 WebView 一个人背,这些密码管理器也要背。

3 苹果公司发布了可以发挥苹果芯片特性的机器学习框架

MLX 是一个类似于 NumPy 的阵列框架,旨在苹果处理器上实现高效灵活的机器学习。其目的是为使用苹果硬件的研究人员简化 ML 模型的训练和部署。这不是一个面向消费者的工具;它为开发人员提供了一个构建 ML 模型的强大环境。MLX 增加了对统一内存模型的支持,这意味着数组位于共享内存中,可以在任何支持的设备类型上执行操作,而无需执行数据拷贝。除了 Python API,MLX 还有一个功能齐全的 C++ API。

(插图:DA/c3e61e5a-8725-4938-b44e-075edff5edd1)

消息来源:Computer World
老王点评:看来苹果也在 AI 方面做了一些工作。

我了解到,如果你能找到适合你的方法,不管老师和其他学生怎么说,你都可以学到任何你感兴趣的开源技能。

我生于 1982 年,以人类的年岁计算,这只过去了 40 年(在写这篇文章的时候)。然而就计算机发展而言,那已经是很久以前了。十岁的时候,我得到了我的第一台电脑,一台 Commodare 64 计算机。后来,我买了一台 Amiga,到了13岁的时候,我买了一台 “IBM 兼容” 机(那时,大家都这么称呼它)。

高中的时候,我用图形计算器做了很多基本的编程。高二的时候,我学习了基本的 C 语言编程,然后到了高三,我开始做更高级的 C 语言编程,开始应用库、指针和图形界面。

我从编程学生成为老师的旅程

在我的大学时代,我学习了 Java,所以 Java 成为了我的主要语言。我还为一种叫做个人数据助理(PDA)的设备编写了一些 C# 语言的程序,这是现代智能手机的前身。因为 Java 语言是面向对象的、跨平台的,并且使得 GUI 编程变得容易,我想以后我的大部分编程工作都会用 Java 来完成。

在大学里,我也发现自己有教学的天赋,所以我帮助别人编程,而当我选修计算机科学时,他们也帮助我学习数学。在大学后期,我选修了一些 C 语言编程的课程,目的是学习基本的嵌入式编程和测量仪器的控制。

30 岁之后,我用 C 语言作为教学工具,教高中生学习用 C 语言编程。我还用 Fritzing 教高中生如何编写 Arduino 程序。我对 C 语言编程的兴趣在去年再次被唤醒,当时我找到了一份工作,帮助大学生学习计算机科目中的差异。

我如何接触 C 语言和其他语言进行编程

每个人学习的方式都不一样。作为一个患有 阿斯伯格综合症 Asperger's 和多动症(ADHD)的 神经多样性 neurodiverse 人士,我的学习过程有时与其他人很不一样。当然,每个人都有不同的学习风格,尽管神经多样性人士可能比其他人更喜欢某种学习风格。

我倾向于用图片和文字来思考。就我个人而言,我需要一步一步地解码事物,一步一步地理解它们。这使得 C 语言适合我的学习风格。当我学习代码的时候,我通过学习观察一行行的代码,比如我面前的 # include <stdio.h> ,逐渐将代码合并到我的大脑中。根据我在互联网上获取的对其他神经多样性人群的描述,他们中的一些人似乎也有这种学习风格。我们“内化代码”。

有些自闭症人士在记忆大段代码方面比我强得多,但过程似乎是一样的。在理解诸如结构、指针、指针的指针、矩阵和向量之类的概念时,用图片来思考是很有帮助的,比如在编程教程和书籍中可以找到的那些。

我喜欢使用 C 语言来理解工作是如何在较低的级别上完成的,例如 文件输入和输出(I/O)、网络编程等等。这并不意味着我不喜欢处理字符串操作或创建数组等任务的库。我也喜欢用 Java 语言创建数组和向量的简单性。然而,对于创建用户界面,尽管我已经在 C 语言中看过这样的代码,但是我更喜欢使用图形化编辑器,比如 Netbeans 和类似的编辑器。

我理想中用于创建应用程序的 C 语言 GUI 开源工具

如果我想象一个理想的用 C 语言创建 GUI 的开源工具,它将类似于 Netbeans,例如,通过拖放来创建 GTK 接口。还可以在按钮上绑定 C 语言函数,等等,来使它们执行操作。也许有这样一个工具。我承认我没怎么仔细查找过。

为什么我鼓励年轻的神经多样性的人学习 C语言

游戏行业 是一个很大的产业。一些研究表明,神经多样性的孩子可能比其他孩子更专注于游戏。我会告诉一个神经多样性的高中生或大学生,如果你学习 C 语言,你可能会学到一些基础知识,例如,为显卡编写高效的驱动程序,或者编写高效的文件 I/O 例程来优化他们最喜欢的游戏。我还要诚实地说,学习需要时间和精力,但是值得付出努力。一旦你学会了它,你就可以更好地控制硬件一类的东西。

对于学习 C 语言,我建议一个神经多样性的孩子安装一个初学者友好的 Linux 发行版,然后在网上找到一些教程。我还建议一步一步地分解事物,并给它们绘制图表,例如,指针。我这样做是为了更好地理解这个概念,这对我很有效。

最后,这就是它的意义所在: 不管老师和其他学生怎么说,找到一种适合你的学习方法,用它来学习你感兴趣的开源技能。这是可以做到的,任何人都可以做到。

(题图:DA/f0d98968-4c13-4395-8414-3690bc20b0ae)


via: https://opensource.com/article/22/5/my-journey-c-neurodiverse-perspective

作者:Rikard Grossman-Nielsen 选题:lkxed 译者:CanYellow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

现在,蓝屏死机的恐怖也将笼罩在 Linux 用户头上。

多年来,“ 蓝屏死机 Blue-Screen-Of-Death ”(BSOD)已经成了 Windows 操作系统的代名词,一旦系统出现重大错误,Windows 就会展示蓝色的错误页面。

我自己也常常遇到一些看似随机的问题,这些问题会导致 Windows 蓝屏死机。有时候,显示的错误代码能提供一些帮助,但更多的时候,它们只是让我更加感到困惑。

而现在,随着 systemd v255 的发布,我们也将在 Linux 上见到这个熟悉的“朋友”。让我带你了解一下:

一个模拟的蓝屏死机页面(并非 Linux 上可能出现的样子)

发生的事情:systemd 开始加入一个称为 systemd-bsod新实验性组件。依据 提交记录,它用于显示与引发系统启动失败相关的蓝屏错误消息

类似于 Windows,这个功能还会展示一个二维码,用户可以扫描获取到故障相关的信息。

? 只有在错误级别达到 LOG_EMERG 时,才会显示错误信息。

这很重要吗?

当然重要。因为,对于装备了 systemd 的 Linux 发行版在发生崩溃或拒绝启动的情况下,它展示错误代码的方式过于令人费解,尤其对于新手来说

有了蓝屏死机系统后,用户用不着还要在各大论坛和文章里寻求解答。他们现在的问题解决方式将更加直观,更贴近他们的习惯。

考虑到大部分 热门的 Linux 发行版 都基于 systemd,这个改变应该会受到许多用户的欢迎。

关于 systemd 255 版本的其它改变,这里有一些主要的亮点:

  • 针对启动服务的方法进行了全面的重构
  • seccomp 已开始支持 64 位龙架构 微处理器架构。
  • System V 服务脚本 的支持已被取消,未来版本将完全移除此项支持。
  • 如果在执行重启操作时发现 /run/nextroot/ 目录下存在新的根文件系统,systemctl 将会自动执行 soft-reboot 操作。
  • 改善了在 systemd 上对 TPM2 支持 的众多方面。

我强烈建议你查看 官方的更新日志,了解更多关于新的 systemd 版本的信息。这个新版本将于 2024 年上半年 出现在许多即将发布的 Linux 发行版中。

尽管我们中的许多人都熟知那个围绕 systemd 已经酝酿多时的 争议,我仍然很好奇,当蓝屏死机的功能未来不久推出时,会引起怎样的反响。

有一点可以肯定,我们一定会开怀大笑,因为将有一大堆 Linux 蓝屏死机的段子图片问世 ?

? 我迫不及待地想看 Linux 蓝屏死机的段子图片,你呢?

(题图:DA/18062133-604c-41e6-b234-67c58d0770a5)


via: https://news.itsfoss.com/bsod-linux/

作者:Sourav Rudra 选题:lujun9972 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

1 开机启动显示的徽标中可隐藏恶意代码

研究人员发现了大量与开机时 UEFI 显示的徽标图像处理有关的漏洞。恶意代码可以通过附加到镜像中的方式在不被察觉的情况下被安装,目前的安全启动机制都无法阻止这种攻击。这个名为 “LogoFAIL” 攻击是由二十几个新发现的漏洞组成的,这些漏洞已经在负责启动运行 Windows 或 Linux 的现代设备的 UEFI 中潜伏了数年甚至数十年,几乎涵盖了整个 x64 和 ARM CPU 生态系统。首先是 UEFI 供应商 AMI、Insyde 和 Phoenix;然后是联想、戴尔和惠普等设备制造商;以及英特尔和 AMD 等 CPU 制造商。LogoFAIL 攻击的是徽标,特别是硬件销售商的徽标,这些徽标会在 UEFI 仍在运行时,在启动时显示在设备屏幕上。这种新的固件攻击几乎影响所有 Windows 和 Linux 设备。

(插图:DA/19aebc9b-a8da-4d5f-a331-c2e8afa300a0)

消息来源:Ars Technica
老王点评:真是想象力丰富,没想到开机显示的徽标也可以隐藏恶意代码。

2 谷歌 Gemini 的早期印象并不好

谷歌本周发布了新的生成式人工智能模型 Gemini,该模型将为包括 Bard 在内的一系列产品和服务提供支持。谷歌对 Gemini 的卓越架构和能力大加吹捧,声称该模型的性能达到或超过了 GPT-4 等其他领先的生成式人工智能模型。但又传闻证据表明并非如此。比如,有人发现该模型未能正确理解基本事实,会弄错 2023 年奥斯卡奖得主。翻译似乎也不是 Gemini Pro 的强项。即便谷歌拥有搜索和新闻网站,但 Gemini Pro 似乎不愿意对可能引起争议的新闻话题发表评论,而是告诉用户……自己谷歌一下。此外,其广泛传播的演示视频被指造假、基准测试有选择性前提。

(插图:DA/ab59690d-fd51-452c-8bca-50c6b93955c4)

消息来源:Tech Crunch
老王点评:LLM 好不好,数据没有用,用户反馈才是真的。这句话不只是对 Gemini 说的。

3 Fedora 40 新增直接启动统一内核镜像的功能

Fedora 40 正在将其对统一内核镜像(UKI)支持推进到下一阶段,将支持直接从 EFI SHIM 启动 UKI 文件的能力,而无需通过 GRUB 等传统的引导加载器。UKI 将带来更好的 UEFI 安全启动支持,更好地支持 TPM 测量和保密计算,以及更强大的启动过程。

(插图:MJ/a99ba7c8-2e9d-43f8-b16e-fbb11f6ae4df)

消息来源:Phoronix
老王点评:可能是我过于守旧了,我既不喜欢 systemd,也不喜欢 UKI、TPM 和安全启动。

我正在一步步解释 Git 的方方面面。在使用 Git 近 15 年后,我已经非常习惯于 Git 的特性,很容易忘记它令人困惑的地方。

因此,我在 Mastodon 上进行了调查:

你有觉得哪些 Git 术语很让人困惑吗?我计划写篇博客,来解读 Git 中一些奇怪的术语,如:“分离的 HEAD 状态”,“快速前移”,“索引/暂存区/已暂存”,“比 origin/main 提前 1 个提交”等等。

我收到了许多有洞见的答案,我在这里试图概述其中的一部分。下面是这些术语的列表:

  • HEAD 和 “heads”
  • “分离的 HEAD 状态”
  • 在合并或变基时的 “ours” 和 “theirs”
  • “你的分支已经与 'origin/main' 同步”
  • HEAD^HEAD~HEAD^^HEAD~~HEAD^2HEAD~2
  • .....
  • “可以快速前移”
  • “引用”、“符号引用”
  • refspecs
  • “tree-ish”
  • “索引”、“暂存的”、“已缓存的”
  • “重置”、“还原”、“恢复”
  • “未跟踪的文件”、“追踪远程分支”、“跟踪远程分支”
  • 检出
  • reflog
  • 合并、变基和遴选
  • rebase –onto
  • 提交
  • 更多复杂的术语

我已经尽力讲解了这些术语,但它们几乎覆盖了 Git 的每一个主要特性,这对一篇博客而言显然过于繁重,所以在某些地方可能会有一些粗糙。

HEAD 和 “heads”

有些人表示他们对 HEADrefs/heads/main 这些术语感到困惑,因为听起来像是一些复杂的技术内部实现。

以下是一个快速概述:

  • “heads” 就是 “分支”。在 Git 内部,分支存储在一个名为 .git/refs/heads 的目录中。(从技术上讲,官方 Git 术语表 中明确表示分支是所有的提交,而 head 只是最近的提交,但这只是同一事物的两种不同思考方式)
  • HEAD 是当前的分支,它被存储在 .git/HEAD 中。

我认为,“head 是一个分支,HEAD 是当前的分支” 或许是 Git 中最奇怪的术语选择,但已经设定好了,想要更清晰的命名方案已经为时已晚,我们继续。

“HEAD 是当前的分支” 有一些重要的例外情况,我们将在下面讨论。

“分离的 HEAD 状态”

你可能已经看到过这条信息:

$ git checkout v0.1
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

[...]

(消息译文:你处于 “分离 HEAD” 的状态。你可以四处看看,进行试验性的更改并提交,你可以通过切换回一个分支来丢弃这个状态下做出的任何提交。)

这条信息的实质是:

  • 在 Git 中,通常你有一个已经检出的 “当前分支”,例如 main
  • 存放当前分支的地方被称为 HEAD
  • 你做出的任何新提交都会被添加到你的当前分支,如果你运行 git merge other_branch,这也会影响你的当前分支。
  • 但是,HEAD 不一定必须是一个分支!它也可以是一个提交 ID。
  • Git 会称这种状态(HEAD 是提交 ID 而不是分支)为 “分离的 HEAD 状态”
  • 例如,你可以通过检出一个标签来进入分离的 HEAD 状态,因为标签不是分支
  • 如果你没有当前分支,一系列事情就断链了:

    • git pull 根本就无法工作(因为它的全部目的就是更新你的当前分支)
    • 除非以特殊方式使用 git push,否则它也无法工作
    • git commitgit mergegit rebasegit cherry-pick 仍然可以工作,但它们会留下“孤儿”提交,这些提交没有连接到任何分支,因此找到这些提交会很困难
  • 你可以通过创建一个新的分支或切换到一个现有的分支来退出分离的 HEAD 状态

在合并或变基中的 “ours” 和 “theirs”

遇到合并冲突时,你可以运行 git checkout --ours file.txt 来选择 “ours” 版本中的 file.txt。但问题是,什么是 “ours”,什么是 “theirs” 呢?

我总感觉此类术语混淆不清,也因此从未用过 git checkout --ours,但我还是查找相关资料试图理清。

在合并的过程中,这是如何运作的:当前分支是 “ours”,你要合并进来的分支是 “theirs”,这样看来似乎很合理。

$ git checkout merge-into-ours # 当前分支是 “ours”
$ git merge from-theirs # 我们正要合并的分支是 “theirs”

而在变基的过程中就刚好相反 —— 当前分支是 “theirs”,我们正在变基到的目标分支是 “ours”,如下:

$ git checkout theirs # 当前分支是 “theirs”
$ git rebase ours # 我们正在变基到的目标分支是 “ours”

我以为之所以会如此,因为在操作过程中,git rebase main 其实是将当前分支合并到 main (它类似于 git checkout main; git merge current_branch),尽管如此我仍然觉得此类术语会造成混淆。

这个精巧的小网站 对 “ours” 和 “theirs” 的术语进行了解释。

人们也提到,VSCode 将 “ours”/“theirs” 称作 “当前的更改”/“收到的更改”,同样会引起混淆。

“你的分支已经与 origin/main 同步”

此信息貌似很直白 —— 你的 main 分支已经与源端同步!

但它实际上有些误导。可能会让你以为这意味着你的 main 分支已经是最新的,其实不然。它真正的含义是 —— 如果你最后一次运行 git fetchgit pull 是五天前,那么你的 main 分支就是与五天前的所有更改同步。

因此,如果你没有意识到这一点,它对你的安全感其实是一种误导。

我认为 Git 理论上可以给出一个更有用的信息,像是“与五天前上一次获取的源端 main 是同步的”,因为最新一次获取的时间是在 reflog 中记录的,但它没有这么做。

HEAD^HEAD~HEAD^^HEAD~~HEAD^2HEAD~2

我早就清楚 HEAD^ 代表前一次提交,但我很长一段时间都困惑于 HEAD~HEAD^ 之间的区别。

我查询资料,得到了如下的对应关系:

  • HEAD^HEAD~ 是同一件事情(指向前 1 个提交)
  • HEAD^^^HEAD~~~HEAD~3 是同一件事情(指向前 3 个提交)
  • HEAD^3 指向提交的第三个父提交,它与 HEAD~3 是不同的

这看起来有些奇怪,为什么 HEAD~HEAD^ 是同一个概念?以及,“第三个父提交”是什么?难道就是父提交的父提交的父提交?(剧透:并非如此)让我们一起深入探讨一下!

大部分提交只有一个父提交。但是合并提交有多个父提交 - 因为它们合并了两个或更多的提交。在 Git 中,HEAD^ 意味着 “HEAD 提交的父提交”。但是如果 HEAD 是一个合并提交,那 HEAD^ 又代表怎么回事呢?

答案是,HEAD^ 指向的是合并提交的第一个父提交,HEAD^2 是第二个父提交,HEAD^3 是第三个父提交,等等。

但我猜他们也需要一个方式来表示“前三个提交”,所以 HEAD^3 是当前提交的第三个父提交(如果当前提交是一个合并提交,可能会有很多父提交),而 HEAD~3 是父提交的父提交的父提交。

我想,从我们之前对合并提交 “ours”/“theirs” 的讨论来看,HEAD^ 是 “ours”,HEAD^2 是 “theirs”。

.....

这是两个命令:

  • git log main..test
  • git log main...test

我从没用过 ..... 这两个命令,所以我得查一下 man git-range-diff。我的理解是比如这样一个情况:

A - B main
  \
    C - D test
  • main..test 对应的是提交 C 和 D
  • test..main 对应的是提交 B
  • main...test 对应的是提交 B,C,和 D

更有挑战的是,git diff 显然也支持 .....,但它们在 git log 中的意思完全不同?我的理解如下:

  • git log test..main 显示在 main 而不在 test 的更改,但是 git log test...main 则会显示 两边 的改动。
  • git diff test..main 显示 test 变动 main 变动(它比较 BD),而 git diff test...main 会比较 AD(它只会给你显示一边的差异)。

有关这个的更多讨论可以参考 这篇博客文章

“可以快速前移”

git status 中,我们会经常遇到如下的信息:

$ git status
On branch main
Your branch is behind 'origin/main' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

(消息译文:你现在处于 main 分支上。你的分支比 origin/main 分支落后了 2 个提交,可以进行快速前进。 (使用 git pull 命令可以更新你的本地分支))

但“快速前移” 到底是何意?本质上,它在告诉我们这两个分支基本如下图所示(最新的提交在右侧):

main:        A - B - C
origin/main: A - B - C - D - E

或者,从另一个角度理解就是:

A - B - C - D - E (origin/main)
        |
        main

这里,origin/main 仅仅多出了 2 个 main 不存在的提交,因此我们可以轻松地让 main 更新至最新 —— 我们所需要做的就是添加上那 2 个提交。事实上,这几乎不可能出错 —— 不存在合并冲突。快速前进式合并是个非常棒的事情!这是合并两个分支最简单的方式。

运行完 git pull 之后,你会得到如下状态:

main:        A - B - C - D - E
origin/main: A - B - C - D - E

下面这个例子展示了一种不能快速前进的状态。

A - B - C - X  (main)
        |
        - - D - E  (origin/main)

此时,main 分支上有一个 origin/main 分支上无的提交(X),所以无法执行快速前移。在此种情况,git status 就会如此显示:

$ git status
Your branch and 'origin/main' have diverged,
and have 1 and 2 different commits each, respectively.

(你的分支和 origin/main 分支已经产生了分歧,其中各有 1 个和 2 个不同的提交。)

“引用”、“符号引用”

在使用 Git 时,“引用” 一词可能会使人混淆。实际上,Git 中被称为 “引用” 的实例至少有三种:

  • 分支和标签,例如 mainv0.2
  • HEAD,代表当前活跃的分支
  • 诸如 HEAD^^^ 这样的表达式,Git 会将其解析成一个提交 ID。确切说,这可能并非 “引用”,我想 Git 将其称作 “版本参数”,但我个人并未使用过这个术语。

个人而言,“符号引用” 这个术语颇为奇特,因为我觉得我只使用过 HEAD(即当前分支)作为符号引用。而 HEAD 在 Git 中占据核心位置,多数 Git 核心命令的行为都基于 HEAD 的值,因此我不太确定将其泛化成一个概念的实际意义。

refspecs

.git/config 配置 Git 远程仓库时,你可能会看到这样的代码 +refs/heads/main:refs/remotes/origin/main

[remote "origin"]
    url = [email protected]:jvns/pandas-cookbook
    fetch = +refs/heads/main:refs/remotes/origin/main

我对这段代码的含义并不十分清楚,我通常只是在使用 git clonegit remote add 配置远程仓库时采用默认配置,并没有动机去深究或改变。

“tree-ish”

git checkout 的手册页中,我们可以看到:

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <pathspec>...

那么这里的 tree-ish 是什么意思呢?其实当你执行 git checkout THING . 时,THING 可以是以下的任一种:

  • 一个提交 ID(如 182cd3f
  • 对一个提交 ID 的引用(如 mainHEAD^^v0.3.2
  • 一个位于提交内的子目录(如 main:./docs
  • 可能就这些?

对我个人来说,“提交内的目录”这个功能我从未使用过,从我的视角看,tree-ish 可以解读为“提交或对提交的引用”。

“索引”、“暂存”、“缓存”

这些术语都指向的是同一样东西(文件 .git/index,当你执行 git add 时,你的变动会在这里被暂存):

  • git diff --cached
  • git rm --cached
  • git diff --staged
  • 文件 .git/index

尽管它们都是指向同一个文件,但在实际使用中,这些术语的应用方式有所不同:

  • 很显然,--index--cached 并不总是表示同一种意思。我自己从未使用 --index,所以具体细节我就不展开讨论了,但是你可以在 Junio Hamano(Git 的主管维护者)的博客文章 中找到详细解释。
  • “索引” 会包含未跟踪的文件(我猜可能是对性能的考虑),但你通常不会把未跟踪的文件考虑在“暂存区”内。

“重置”、“还原”、“恢复”

许多人提到,“ 重置 reset ”、“ 还原 revert ” 和 “ 恢复 restore ” 这三个词非常相似,易使人混淆。

我认为这部分的困惑来自以下原因:

  • git reset --hardgit restore . 单独使用时,基本上达到的效果是一样的。然而,git reset --hard COMMITgit restore --source COMMIT . 相互之间是完全不同的。
  • 相应的手册页没有给出特别有帮助的描述:

    • git reset: “重置当前 HEAD 到指定的状态”
    • git revert: “还原某些现有的提交”
    • git restore: “恢复工作树文件”

虽然这些简短的描述为你详细说明了哪个名词受到了影响(“当前 HEAD”,“某些提交”,“工作树文件”),但它们都预设了你已经知道在这种语境中,“重置”、“还原”和“恢复”的准确含义。

以下是对它们各自功能的简要说明:

  • 重置 —— git revert COMMIT: 在你当前的分支上,创建一个新的提交,该提交是 COMMIT 的“反向”操作(如果 COMMIT 添加了 3 行,那么新的提交就会删除这 3 行)。
  • 还原 —— git reset --hard COMMIT: 强行将当前分支回退到 COMMIT 所在的状态,抹去自 COMMIT 以来的所有更改。这是一个高风险的操作。
  • 恢复 —— git restore --source=COMMIT PATH: 将 PATH 中的所有文件回退到 COMMIT 当时的状态,而不扰乱其他文件或提交历史。

“未跟踪的文件”、“远程跟踪分支”、“跟踪远程分支”

在 Git 中,“跟踪” 这个词以三种相关但不同的方式使用:

  • 未跟踪的文件 Untracked files ”:在 git status 命令的输出中可以看到。这里,“未跟踪” 意味着这些文件不受 Git 管理,不会被计入提交。
  • 远程跟踪分支 remote tracking branch ” 例如 origin/main。此处的“远程跟踪分支”是一个本地引用,旨在记住上次执行 git pullgit fetch 时,远程 originmain 分支的状态。
  • 我们经常看到类似 “分支 foo 被设置为跟踪 origin 上的远程分支 bar ”这样的提示。

即使“未跟踪的文件”和“远程跟踪分支”都用到了“跟踪”这个词,但是它们所在的上下文完全不同,所以没有太多混淆。但是,对于以下两种方式的“跟踪”使用,我觉得可能会产生些许困扰:

  • main 是一个跟踪远程的分支
  • origin/main 是一个远程跟踪分支

然而,在 Git 中,“跟踪远程的分支” 和 “远程跟踪分支” 是不同的事物,理解它们之间的区别非常关键!下面是对这两者区别的一个简单概述:

  • main 是一个分支。你可以在它上面做提交,进行合并等操作。在 .git/config 中,它通常被配置为 “追踪” 远程的 main 分支,这样你就可以用 git pullgit push 来同步和上传更改。
  • origin/main 则并不是一个分支,而是一个“远程跟踪分支”,这并不是一种真正的分支(这有些抱歉)。你不能在此基础上做提交。只有通过运行 git pullgit fetch 获取远程 main 的最新状态,才能更新它。

我以前没有深入思考过这种模糊的地方,但我认为很容易看出为什么它会让人感到困惑。

签出

签出做了两个完全无关的事情:

  • git checkout BRANCH 用于切换分支
  • git checkout file.txt 用于撤销对 file.txt 的未暂存修改

这是众所周知的混淆点,因此 Git 实际上已经将这两个功能分离到了 git switchgit restore(尽管你还是可以使用 checkout,就像我一样,在不愿丢弃 15 年对 git checkout 肌肉记忆的情况下)。

再者,即使用了 15 年,我仍然记不住 git checkout main file.txt 用于从 main 分支恢复 file.txt 版本的命令参数。

我觉得有时你可能需要在 checkout 命令后面加上--,帮助区分哪个参数是分支名,哪个是路径,但我并未这么使用过,也不确定何时需要这样做。

参考日志(reflog)

有很多人把 reflog 读作 re-flog,而不是 ref-log。由于本文已经足够长,我这里不会深入讨论参考日志,但值得注意的是:

  • 在 Git 中,“参考” 是一个泛指分支、标签和 HEAD 的术语
  • 参考日志(“reflog”)则为你提供了一个参考历次记录的历史追踪
  • 它是从一些极端困境中拯救出来的利器,比如说你不小心删除了重要的分支
  • 我觉得参考日志是 Git 用户界面中最难懂的部分,我总是试图避免使用它。

合并 vs 变基 vs 遴选

有许多人提及他们常常对于合并和变基的区别感到迷惑,并且不理解变基中的“ base ”指的是什么。

我会在这里尽量简要的进行描述,但是这些一句话的解释最终可能并不那么明了,因为每个人使用合并和变基创建工作流程时的方式差别挺大,要真正理解合并和变基,你必须理解工作流程。此外,有图示会更好理解。不过这个话题可能需要一篇独立的博客文章来完整讨论,所以我不打算深入这个问题。

  • 合并会创建一个新的提交,用来融合两个分支
  • 变基则会逐个地把当前分支上的提交复制到目标分支
  • 遴选跟变基类似,但是语法完全不同(一个显著的差异是变基是从当前分支复制提交,而遴选则会把提交复制到当前分支)

rebase --onto

git rebase 中,存在一个被称为 --onto 的选项。这一直让我感到困惑,因为 git rebase main 的核心功能就是将当前分支变基 main 运行上。那么,额外的 --onto 参数又是怎么回事呢?

我进行了一番查找,--onto 显然解决了一个我几乎没有或者说从未遇到过的问题,但我还是会记录下我对它的理解。

A - B - C (main)
      \
      D - E - F - G (mybranch)
          |
          otherbranch

设想一下,出于某种原因,我只想把提交 FG 变基到 main 上。我相信这应该是某些 Git 工作流中会经常遇到的场景。

显然,你可以运行 git rebase --onto main otherbranch mybranch 来完成这个操作。对我来说,在这个语法中记住 3 个不同的分支名顺序似乎是不可能的(三个分支名,对我来说实在太多了),但由于我从很多人那里听说过,我想它一定有它的用途。

提交

有人提到他们对 Git 中的提交作为一词双义(既作为动词也作为名词)的用法感到困惑。

例如:

  • 动词:“别忘了经常提交”
  • 名词:“main 分支上最新的提交”

我觉得大多数人应该能很快适应这个双关的用法,但是在 SQL 数据库中的“提交”用法与 Git 是有所不同,我认为在 SQL 数据库中,“提交”只是作为一个动词(你使用 COMMIT 来结束一个事务),并不作为名词。

此外,在 Git 中,你可以从以下三个不同的角度去考虑一个 Git 提交:

  1. 表示当前每个文件状态的快照
  2. 与父提交的差异
  3. 记录所有先前提交的历史

这些理解都是不错的:不同的命令在所有的这些情况下都会使用提交。例如,git show 将提交视为一个差异,git log 把提交看作是历史,git restore 则将提交理解为一个快照。

然而,Git 的术语并无太多助于你理解一个给定的命令正在如何使用提交。

更多令人困惑的术语

以下是更多让人觉得混淆的术语。我对许多这些术语的意思并不十分清楚。

我自己也不是很理解的东西:

  • git pickaxe (也许这是 git log -Sgit log -G,它们用于搜索以前提交的差异?)
  • 子模块(我知道的全部就是它们并不以我想要的方向工作)
  • Git 稀疏检出中的 “cone mode” (没有任何关于这个的概念,但有人提到过)

人们提及觉得混淆,但我在这篇已经 3000 字的文章中略过的东西:

  • blob、tree
  • “合并” 的方向
  • “origin”、“upstream”,“downstream”
  • pushpull 并不是对立面
  • fetchpull 的关系(pull = fetch + merge)
  • git porcelain
  • 子树
  • 工作树
  • 暂存
  • “master” 或者 “main” (听起来它在 Git 内部有特殊含义,但其实并没有)
  • 何时需要使用 origin main(如 git push origin main)vs origin/main

人们提及感到困惑的 Github 术语:

  • 拉取请求 pull request ” (与 Gitlab 中的 “ 合并请求 merge request ” 相比,人们似乎认为后者更清晰)
  • “压扁并合并” 和 “变基并合并” 的作用 (在昨天我从未听说过 git merge --squash,我一直以为 “压扁并合并” 是 Github 的特殊功能)

确实是 “每个 Git 术语”

我惊讶地发现,几乎 Git 的每个其他核心特性都被至少一人提及为某种方式中的困惑。我对听到更多我错过的混淆的 Git 术语的例子也有兴趣。

关于这个,有另一篇很棒的 2012 年的文章叫做《最困惑的 Git 术语》。它更多的讨论的是 Git 术语与 CVS 和 Subversion 术语的关联。

如果我要选出我觉得最令人困惑的 3 个 Git 术语,我现在会选:

  • head 是一个分支,HEAD 是当前分支
  • “远程跟踪分支” 和 “跟踪远程的分支” 是不同的事物
  • “索引”、“暂存的”、“已缓存的” 全部指的同一件事

就这样了!

在写这些的过程中,我学到了不少东西。我了解到了一些新的关于Git的事实,但更重要的是,现在我对于别人说Git的所有功能和特性都引起困惑有了更深的理解。

许多问题我之前根本没考虑过,比如我从来没有意识到,在讨论分支时,“跟踪”这个词的用法是多么地特别。

另外,尽管我已经尽力做到准确无误,但由于我涉猎到了一些我从未深入探讨过的Git的角落,所以可能还是出现了一些错误。

(题图:DALL-E/A/e1e5b964-5f32-41bb-811e-8978fb8556d4)


via: https://jvns.ca/blog/2023/11/01/confusing-git-terminology/

作者:Julia Evans 选题:lujun9972 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出