Digamos que antes da atualização você tenha uma situação como essa, onde os pacotes php e e python têm dependência do libxml-dev-1.2
+--------------------+
| python_3.1 |
+--------------+ | |
| php7.0 | | depends on libxml-dev_1.2
| | +-----+--------------+
| depends on libxml-dev_1.2 |
| | v
+------------+-+
| +---------------------+
| | libxml-dev-1.2 |
+------------> | |
| |
| |
+---------------------+
você atualiza o índice local de apt , com apt-get update ,
agora o apt-cache policy mostra que há uma nova versão do pacote disponível para o php - versão 7.3 .
Mas correr apt-cache show php mostra que o novo pacote php precisa de uma versão mais nova de sua dependência libxml-dev, o novo pacote php precisa dizer, libxml-dev-1.3 .
Normalmente o apt instalaria todas as dependências necessárias para satisfazer a instalação ou atualização do php 7.3, no entanto se apt substituiu libxml-dev-1.2 pelo mais recente libxml-dev-1.3 (lembrando que ter libxml-dev-1.2 e libxml-dev-1.3 rodando lado a lado não é realmente uma opção) para satisfazer os requisitos de dependência de php7.3 , ele "quebraria" o requisito de dependência do python.
Nesse cenário, apt-get upgrade não faria nada, no entanto, se você observar a entrada man apt-get de dist-upgrade
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. The dist-upgrade command may therefore remove some packages. [...]
Então, apt-get dist-upgrade irá empurrar / quebrar as regras sobre dependências especificadas pelo pacote para obter pacotes atualizados.
Portanto, dos dois comandos, apt-get dist-upgrade irá atualizar mais pacotes do que seria melhorado com apt-get upgrade