The right way to think about this is: use ref/out when you want to create an alias to a variable. That is, when you say:
void M(ref int x) { x = 10; }
...
int q = 123;
M(ref q);
what you are saying is "x is another name for the variable q". Any changes to the contents of x change q, and any changes to the contents of q change x, because x and q are just two names for the exact same storage location.
Notice that this is completely different from two variables referring to the same object:
object y = "hello";
object z = y;
Here we have two variables, each variable has one name, each variable refers to one object, and the two variables both refer to the same object. With the previous example, we have only one variable with two names.
Is that clear?