I've already looked at at least ten different q&as explaining the differences of a subset of the commands listed above. While experimenting with them and trying to understand the subtle differences between them, I came up with a simple formula for each command. Here is my take on them. If they are incorrect or there is more detail that one should know, please correct me.
Code: Behavior at definition
\let\a\b: \a points to (\b expanded once)
\def\a{\b}: \a points to \b, no expansions at all
\edef\a{\b}: \a points to (\b expanded recursively until no expansions are possible)
\gdef\a{\b}: same as \def\a{\b} but global
\xdef\a{\b}: same as \edef\a{\b} but global
\newcommand\a{\b}: same as \long\def\a{\b} but raises error if \a already exists, \newcommand* to remove \long
\renewcommand\a{\b}: same as \long\def\a{\b} but raises error if \a does not exist
\providecommand\a{\b}: same as \long\def\a{\b} but does not overwrite if \a already exists
\let\a\b, the control sequence\agets the current meaning of\b. If\bis a macro, then also\abecomes a macro, but\bneedn't be a macro. Later redefinitions of\bwon't change the meaning of\a. To the contrary, with\def\a{\b},\ais a macro that expands to\b(and the current meaning of\bwill be used). When\bis a macro, the effect of\let\a\bcould be described as “define\ato be a macro whose expansion is the same as the current expansion of\b”, but\letis much more general. – egreg Oct 25 '22 at 08:46\let\test=C \meaning\testto see what egreg means. ;) – Weißer Kater Oct 25 '22 at 09:45\setlength? – Rosie F Oct 26 '22 at 07:01