apt upgrade vs full-upgrade vs dist-upgrade
Which upgrades may install, and which may remove
The three differ on one axis: how much apt is allowed to disturb to get you the newer versions.
Two packages here have upgrades waiting. tips-tool 2.0 needs a package that is not installed;
tips-app 2.0 needs one that cannot be installed while tips-legacy is present.
apt-get upgrade will not install a new package under any circumstances, so both stay where they
are:
apt-get upgrade -s
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following packages have been kept back:
tips-app tips-tool
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
"Kept back" is that refusal, and the troubleshooting page covers what to do about it when it happens on a real machine.
apt upgrade is not apt-get upgrade
The apt front end changed the rule. It installs new packages when an upgrade needs them, and
still refuses to remove anything:
apt upgrade -s
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
Upgrading:
tips-tool
Installing dependencies:
tips-helper
Not upgrading:
tips-app
Summary:
Upgrading: 1, Installing: 1, Removing: 0, Not Upgrading: 1
Inst tips-helper (1.0-1 stable [all])
Inst tips-tool [1.0-1] (2.0-1 stable [all])
Conf tips-helper (1.0-1 stable [all])
Conf tips-tool (2.0-1 stable [all])
tips-tool upgraded and pulled tips-helper in with it. tips-app is still held, because
reaching its new version means removing tips-legacy, and no upgrade of either kind removes a
package.
So advice written for apt-get does not transfer. A guide from 2015 saying "upgrade never
installs anything new" describes a command that is still on your system under a different name.
full-upgrade is allowed to remove
apt full-upgrade -s
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
Upgrading:
tips-app tips-tool
Installing dependencies:
tips-helper tips-lib
REMOVING:
tips-legacy
Summary:
Upgrading: 2, Installing: 2, Removing: 1, Not Upgrading: 0
Remv tips-legacy [1.0-1]
Inst tips-lib (1.0-1 stable [all])
Inst tips-app [1.0-1] (2.0-1 stable [all])
Inst tips-helper (1.0-1 stable [all])
Inst tips-tool [1.0-1] (2.0-1 stable [all])
Conf tips-lib (1.0-1 stable [all])
Conf tips-app (2.0-1 stable [all])
Conf tips-helper (1.0-1 stable [all])
Conf tips-tool (2.0-1 stable [all])
Nothing is held now. REMOVING is capitalised by apt because it is the part you are being asked
to read. It is also why full-upgrade is not the default: a dependency change upstream can propose
removing something you rely on, so the REMOVING list is the part to check before answering yes.
dist-upgrade is the same command
dist-upgrade is full-upgrade under the name it had before apt got a friendlier front end. Both
front ends accept both spellings, and the plan they produce is byte for byte the same:
diff <(apt-get dist-upgrade -s) <(apt-get full-upgrade -s) && echo "dist-upgrade and full-upgrade: identical"
dist-upgrade and full-upgrade: identical
The name misleads, which is why it was replaced. dist-upgrade does not move you between Debian
releases. Editing your sources to name the new suite does that; dist-upgrade is then what you run
afterwards, because it is the one allowed to remove things.
Release channels covers that procedure.
Which to use
apt upgrade for routine updates on a stable machine, after apt update. It takes everything
that can be had without removing anything, and a package it declines to upgrade is a package worth
a moment's attention rather than an error.
apt full-upgrade when something has been held back and you have read why, and always as part
of moving between releases. Read the REMOVING list before you answer.
apt-get upgrade in a script, and for that reason only: apt-get has a stable command line
across versions where apt does not promise one, which is what
apt vs apt-get covers. Its stricter rule comes from its age, so do not
read it as a safety feature somebody designed for you.
Never apt full-upgrade unattended on a machine you care about. Removal is the one thing it
can do that the others cannot, and an unattended run is where you would find out about it last.