Let’s start with the difference between global and $GLOBALS to understand the difference between $wp_query & $wp_the_query.
Global is a keyword which is used to creates global variable. Global variables can be imported into local scope for local scope.
$GLOBALS is a superglobal array that is accessible everywhere without the global keyword, but the significant difference is that it only grants access to that variable we can’t modify it.
In the context of WordPress(reference – wp-settings.php):
$GLOBALS[‘wp_the_query’] = new WP_Query();
$GLOBALS[‘wp_query’] = $GLOBALS[‘wp_the_query’];
$wp_query is the variable that contains the copy of GLOBALS[‘wp_the_query’]. Plugins and themes could modify $wp_query.
$wp_the_query is the variable that contains an original copy of GLOBALS[‘wp_the_query’]. This is used to reset the $wp_query object when we call wp_reset_query() function.
To be conclusive, If you would like to write competent & reliable code, which rarely fails, you should be using $GLOBALS[‘wp_the_query’]. On the other hand, if you believe other plugins and themes are always practicing the correct methodology of programming, you could use $GLOBALS[‘wp_query’].