If I can remember my theory correctly the difference between languages revolves around the machinery required to recognize the language.
Regular expressions can be recognized with just finite state machines (NFA or DFA have the same power).
Context free languages require a Push down automata. And context sensitive languages need a Turing Machine.
When looking at regular expressions as NFAs you can see the operations you mentioned.
Concat a b: is just state transition
Union a b: have an epsilon transition from the start state to an NFA for a and one into the NFA for b
Repeat a: add an epsilon transition from the accept state of a to it’s own start state
With the more powerful grammars you might be able to do similar analysis on the ability to join machines together but it’s been too many years since I did any formal work like that.
My company still uses SVN, but we have almost 20 years of history in the repository, not including the autogenerated commits from when we migrated from CVS.
My department would like for us to move to git (some sub projects have) but it’s important for our process to retain the history and nobody has had the time to figure out if the migration would be clean then update all of our auto-testing infrastructure (which itself is over a decade old) to use git, all while not stopping active development.