400

I usually use apt-get update && apt-get upgrade to run my updates and upgrades instead of the GUI because it seems to run more quickly.

However, I've noticed lately that I often get a message that one of my upgrades was held back. I then usually run dist-upgrade to run it through and it works fine. As far as I can tell after reading this question and its answers, dist-upgrade does all the same things and then some.

So, my question is: Why use apt-get upgrade at all? Why not use apt-get dist-upgrade all the time? Why does apt-get upgrade even exist?

jimchristie
  • 4,867
  • 5
  • 24
  • 35

4 Answers4

534

I typically upgrade my machines with:

sudo apt-get update && time sudo apt-get dist-upgrade

Below is an excerpt from man apt-get. Using upgrade keeps to the rule: under no circumstances are currently installed packages removed, or packages not already installed retrieved and installed. If that's important to you, use apt-get upgrade. If you want things to "just work", you probably want apt-get dist-upgrade to ensure dependencies are resolved.

To expand on why you'd want upgrade instead of dist-upgrade, if you are a systems administrator, you need predictability. You might be using advanced features like apt pinning or pulling from a collection of PPAs (perhaps you have an in-house PPA), with various automations in place to inspect your system and available upgrades instead of always eagerly upgrading all available packages. You would get very frustrated when apt performs unscripted behavior, particularly if this leads to downtime of a production service.

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.
rduplain
  • 5,668
  • 60
    Thank you for not only summing up the differences between the two, but also explaining the situations where one might be better than the other. This was exactly what I was looking for. – jimchristie Dec 20 '12 at 06:38
  • 13
    dist-upgrade is more likely to break stuff badly than upgrade. upgrade ensures that your system remains complete. – Braiam Mar 18 '14 at 01:18
  • 6
    dist-upgrade is more likely to fix issues with conflicting package versions, if you are comfortable with taking the road roller approach (i.e. you don't have a mission critical production software running on the box) – Henno Apr 04 '14 at 07:06
  • 1
    A small question about 'apt-get upgrade' refering to the fact that "no currently installed packages removed or new one added" : do existing packages get upgraded accordingly as well. For example oldA depends on oldB. Will oldA and oldB both be upgraded ? How about if newA depends on oldB and not newB, what happens to these two during the upgrade ? both not upgraded or both upgraded, which may leaves newA not functioning because oldB is lost ? – Kenny Nov 19 '15 at 13:54
  • 7
    What is the reason for using time here? – ItalyPaleAle Jun 11 '18 at 00:36
  • 1
    Informational. I opened the answer providing the command I typically use, to illustrate. – rduplain Jun 12 '18 at 01:38
  • 1
    I'm a bit lost on the don't upgrade "if new package needs to be installed or one needs to be removed". I manage a deb package and as a test added a new package to the dependency list and removed another package from the dependeny list. I then copied the deb and ran "apt upgrade" and it will let me upgrade. Specifically it says "The following NEW packages will be installed" and "The following package was automatically installed and is no longer required". Can someone explain to me what I'm missing here? @rduplain – shreddish May 03 '19 at 17:58
  • I too am seeking a reply to @shreddish's above question (from over 3 years ago). Thoughts? – Johnny Utahh Nov 21 '22 at 17:53
  • 1
    apt != apt-get. Unfortunately, there's more than one way to do things, and it is indeed confusing. Especially because apt-get was the common way to do things in Debian systems for so long, before apt was available. Here, apt upgrade is not apt-get upgrade and does indeed install new packages (man 8 apt: "New packages will be installed if required to satisfy dependencies..."). As to the other question around "no longer required", APT (either command) will install packages to satisfy dependencies but won't remove them until running the autoremove subcommand. – rduplain Nov 22 '22 at 19:12
  • 1
    @rduplain Indeed apt is not apt-get. You might want to extend your answer with apt. – Melroy van den Berg Apr 18 '23 at 00:39
175

I know this question has been answered and is a year old, but I feel this needs to be said. Ubuntu 14.04 and later (and Debian Jessie and later, for those finding this from Google) uses APT 1.0, which allows the command apt instead of apt-get and apt-cache for some operations.

  • apt-get upgrade will not change what is installed (only versions),
  • apt-get dist-upgrade will install or remove packages as necessary to complete the upgrade,
  • apt upgrade will automatically install but not remove packages.
  • apt full-upgrade performs the same function as apt-get dist-upgrade.
muru
  • 197,895
  • 55
  • 485
  • 740
  • @muru Thanks for the edit and the note about full-upgrade. I primarily use Debian 7 (which is pre-APT 1.0), and I've only played with Debian Jessie and Ubuntu 14.04. – Stephen Angelico Jul 27 '14 at 14:00
  • 1
    you're welcome. As someone who does used jessie and 14.04 regularly, I first learned of this new utility from your answer! – muru Jul 27 '14 at 14:22
  • Do you have a source for your description of apt upgrade? Everything I can come up with suggests that apt upgrade is the same as apt-get upgrade. For example, apt help upgrade on my system outputs: "apt upgrade" is equivalent to "sudo apt-get upgrade" – Jon Bentley Aug 19 '15 at 22:44
  • 1
    The respective manpages for apt and apt-get specify what I originally said. – Stephen Angelico Aug 20 '15 at 04:27
  • So is apt safe-upgrade equivalent to apt-get upgrade? – Fadi Feb 17 '17 at 20:02
  • 1
    apt safe-upgrade is not a valid operation on my system. If you mean aptitude safe-upgrade, not quite. apt-get upgrade will never install packages, whereas apt upgrade and aptitude safe-upgrade will install new packages as dependencies demand it. So aptitude safe-upgrade is equivalent to apt upgrade, not apt-get upgrade. – Stephen Angelico Feb 17 '17 at 22:33
  • @JonBentley, In Ubuntu 18.04, apt help upgrade now says upgrade - upgrade the system by installing/upgrading packages – wisbucky Sep 11 '19 at 20:35
  • It seems that apt upgrade is enough. – Timo Sep 01 '20 at 07:33
  • 1
    @Timo If apt upgrade were "enough", we wouldn't have anything else. apt-get upgrade and apt-get dist-upgrade / apt full-upgrade have different purposes again. Now if apt upgrade is enough for you most of the time, fine, but every distinct command has its use. – Stephen Angelico Sep 01 '20 at 11:31
  • @StephenAngelico I hope there is only one apt update.. – Timo Sep 01 '20 at 11:40
10

The upgrade option only installs new version of the packages that are already installed on the system (and yes, kernel updates belong to them).

However, sometimes the updates change dependencies: for example, a new version of a package will no longer depend on a library that you have installed, or will require installation of additional libraries. The upgrade option will never remove installed packages that you no longer actually need.

However, the dist-upgrade option can "intelligently" handle changes in the dependencies system. This includes removing packages that are no longer necessary or resolve conflicts between packages that arose because of changes in the dependencies.

January
  • 35,952
  • 6
    While this is accurate, I don't think it answers the question. If we have an "intelligent" option that can handle dependency changes and remove clutter, why not always use it? – ændrük Nov 08 '12 at 19:51
  • 2
    upgrade will also never add new packages that become needed as dependencies. From man apt-get: "under no circumstances are currently installed packages removed, or packages not already installed retrieved and installed" @ændrük Just because something is "intelligent" doesn't mean it will always do what the user wants (or even something at all reasonable). Anytime a system update removes a package, it's good to look over what it's doing before pressing Y. – Eliah Kagan Mar 18 '14 at 01:06
  • Are you talking about apt-get or apt? Since your answer is now getting ambiguous..? – Melroy van den Berg Apr 18 '23 at 00:40
3

Users might have come to rely on packages that were installed implicitly because of other (explicitly installed) packages' dependency on them. Thus the packaging system cannot be aware of a user/administrator desire to retain certain functionality that might otherwise be removed via dist-upgrade.

user244474
  • 31
  • 1