为什么要使用apt-get upgrade而不是apt-get dist-upgrade?

通常我使用 apt-get update && apt-get upgrade 来运行我的更新和升级,而不是使用图形界面,因为它似乎运行得更快。

然而,最近我注意到我经常收到一个消息,说我的某个升级被暂停了。然后我通常运行dist-upgrade来完成它,并且一切都正常。根据我阅读的关于 this question 和其答案后的理解,dist-upgrade 做了所有相同的事情,甚至更多。

所以,我的问题是:为什么还要使用 apt-get upgrade?为什么不始终使用 apt-get dist-upgrade?为什么 apt-get upgrade 会存在呢?


4在较新的Ubuntu版本中,sudo apt full-upgrade执行类似的操作。 - Aaron Franke
4个回答

我通常会对我的机器进行升级,包括:
sudo apt-get update && time sudo apt-get dist-upgrade

以下是来自man apt-get的摘录。使用升级命令遵循一个规则:绝不会删除当前已安装的软件包,也不会获取和安装尚未安装的软件包。如果这对你很重要,使用apt-get upgrade。如果你希望一切“顺利进行”,你可能需要apt-get dist-upgrade来确保解决依赖关系。
进一步解释为什么你应该选择upgrade而不是dist-upgrade,如果你是系统管理员,你需要可预测性。你可能正在使用高级功能,比如apt pinning或从一组PPAs中提取(也许你有一个内部PPA),并且有各种自动化机制来检查你的系统和可用的升级,而不总是急于升级所有可用的软件包。当apt执行非脚本行为时,特别是如果这导致生产服务停机,你会感到非常沮丧。
upgrade
    upgrade is used to install the newest versions of all packages
    currently installed on the system from the sources enumerated in
    /etc/apt/sources.list. Packages currently installed with new
    versions available are retrieved and upgraded; under no
    circumstances are currently installed packages removed, or packages
    not already installed retrieved and installed. New versions of
    currently installed packages that cannot be upgraded without
    changing the install status of another package will be left at
    their current version. An update must be performed first so that
    apt-get knows that new versions of packages are available.

dist-upgrade
    dist-upgrade in addition to performing the function of upgrade,
    also intelligently handles changing dependencies with new versions
    of packages; apt-get has a "smart" conflict resolution system, and
    it will attempt to upgrade the most important packages at the
    expense of less important ones if necessary. So, dist-upgrade
    command may remove some packages. The /etc/apt/sources.list file
    contains a list of locations from which to retrieve desired package
    files. See also apt_preferences(5) for a mechanism for overriding
    the general settings for individual packages.

60谢谢您不仅总结了这两者之间的差异,还解释了其中一个可能比另一个更好的情况。这正是我所寻找的。 - jimchristie
13dist-upgradeupgrade更有可能严重破坏系统。upgrade确保您的系统保持完整。 - Braiam
6如果您对采取“压路机”方法(即在该系统上没有关键的生产软件运行)感到满意,那么dist-upgrade更有可能解决与软件包版本冲突相关的问题。 - Henno
1关于'apt-get upgrade'的一个小问题,指的是"没有当前安装的软件包被删除或添加新的软件包":现有的软件包是否也会相应地升级?例如,oldA依赖于oldB。oldA和oldB会同时升级吗?如果newA依赖于oldB而不是newB,那么在升级过程中这两个软件包会发生什么?它们都不会升级还是都会升级,这可能导致newA无法正常运行,因为oldB丢失了? - Kenny
7在这里使用time的原因是什么? - ItalyPaleAle
1信息性的。我打开了答案,提供了我通常使用的命令,以作说明。 - rduplain
1我对于“如果需要安装新的软件包或者需要移除一个软件包,则不要升级”这一点有些困惑。我管理一个deb软件包,并且作为测试,我在依赖列表中添加了一个新的软件包,并从依赖列表中移除了另一个软件包。然后我复制了deb文件并运行了“apt upgrade”命令,它允许我进行升级。具体来说,它显示了“将安装以下新软件包”和“以下软件包是自动安装的,不再需要”。有人能解释一下我在这里漏掉了什么吗?@rduplain - shreddish
我也在寻求对@shreddish上面的问题(三年前的问题)的回答。你有什么想法? - Johnny Utahh
1apt 不等于 apt-get。不幸的是,有多种方法可以完成同样的事情,这确实令人困惑。特别是因为在 Debian 系统中,apt-get 是很长一段时间内常用的方式,直到 apt 出现之前。在这里,apt upgrade 并不等同于 apt-get upgrade,它确实会安装新的软件包(参见 man 8 apt:“如果需要满足依赖关系,将安装新的软件包…”)。至于关于“不再需要”的其他问题,APT(无论是哪个命令)会安装软件包以满足依赖关系,但在运行 autoremove 子命令之前不会删除它们。 - rduplain
1@rduplain 确实,apt不是apt-get。你可能想在你的回答中加上apt - Melroy van den Berg

我知道这个问题已经有人回答了,而且已经过去一年了,但我觉得还是需要说一下。Ubuntu 14.04及以后的版本(以及Debian Jessie及以后的版本,对于那些通过谷歌找到这篇文章的人来说)使用APT 1.0,它允许使用命令apt来代替apt-getapt-cache进行某些操作。
  • apt-get upgrade不会改变已安装的内容(只会升级版本),
  • apt-get dist-upgrade会根据需要安装或删除软件包以完成升级,
  • apt upgrade会自动安装软件包,但不会删除软件包。
  • apt full-upgrade的功能与apt-get dist-upgrade相同。

@muru 谢谢你的编辑和关于full-upgrade的说明。我主要使用Debian 7(它是预装APT 1.0之前的版本),而且我只是尝试过Debian Jessie和Ubuntu 14.04。 - Stephen Angelico
1不用谢。作为一个经常使用“jessie”和14.04的人,我是从你的回答中第一次了解到这个新工具的! - muru
你对apt upgrade的描述有来源吗?我查到的所有信息都表明apt upgradeapt-get upgrade是一样的。例如,我的系统上运行apt help upgrade会输出:"apt upgrade等同于sudo apt-get upgrade"。 - Jon Bentley
1aptapt-get的各自手册说明了我最初说的内容。 - Stephen Angelico
apt safe-upgradeapt-get upgrade是等价的吗? - Fadi
1在我的系统上,apt safe-upgrade 不是一个有效的操作。如果你的意思是 aptitude safe-upgrade,并不完全正确。apt-get upgrade 永远不会安装软件包,而 apt upgradeaptitude safe-upgrade 会根据依赖关系安装新的软件包。所以 aptitude safe-upgrade 等同于 apt upgrade,而不是 apt-get upgrade - Stephen Angelico
@JonBentley,在Ubuntu 18.04中,apt help upgrade现在显示为upgrade - 通过安装/升级软件包来升级系统 - wisbucky
似乎只需要运行apt upgrade命令就可以了。 - Timo
1@Timo 如果 apt upgrade“足够”的话,那我们就没有其他的命令了。apt-get upgradeapt-get dist-upgrade / apt full-upgrade又有不同的用途。现在如果大部分情况下apt upgrade对你来说足够了,那很好,但每个不同的命令都有其用途。 - Stephen Angelico
@StephenAngelico 希望只有一个 apt update.. - Timo

升级选项只安装已经在系统上安装的软件包的新版本(是的,内核更新也属于其中之一)。
然而,有时候更新会改变依赖关系:例如,一个软件包的新版本将不再依赖于您已安装的某个库,或者需要安装额外的库。升级选项永远不会删除您实际上不再需要的已安装软件包。
然而,升级发行版选项可以“智能地”处理依赖系统的变化。这包括删除不再必要的软件包或解决由于依赖关系变化而引起的软件包冲突。

6虽然这是准确的,但我认为它并没有回答问题。如果我们有一个可以处理依赖关系变化和清除杂乱的“智能”选项,为什么不总是使用它呢? - ændrük
2升级也绝不会添加作为依赖项所需的新软件包。根据man apt-get:"在任何情况下,当前已安装的软件包都不会被删除,也不会检索和安装尚未安装的软件包" @ændrük 仅仅因为某个东西是“智能”的,并不意味着它总是会按照用户的意愿行事(甚至是合理的)。每当系统更新删除一个软件包时,在按下Y之前最好先查看它正在做什么。 - Eliah Kagan
你是在讨论apt-get还是apt?因为你的回答现在变得含糊不清了..? - Melroy van den Berg

用户可能已经开始依赖于由其他(明确安装的)软件包对它们的依赖而隐式安装的软件包。因此,打包系统无法意识到用户/管理员希望保留某些功能,否则这些功能可能会在升级过程中被删除。