@Jin Zhang I reached out to our instructor Dave Withoff for further help on this. Below I have posted Dave's suggestion:
This particular rule for x can be cleared using Clear[x,x] or
Clear["x"].
For example:
In[1]:= x /: _[x] = 0
Out[1]= 0
In[2]:= Clear[x]
Out[2]= 0
In[3]:= Clear["x"]
In[4]:= Sin[x]
Out[4]= Sin[x]
Clear[x,x] would also work because that upvalue for x only applies to expressions with one argument x, and so that rule doesn't apply to Clear[x,x].
Clear["x"] clears any symbols with names that match the string pattern "x".
The basic problem, as you presumably noticed, is that the upvalue for x gets applied to anything of the form _[x], including Clear[x], and since upvalues get applied before downvalues, and since Clear[x] works using a downvalue for Clear, this makes it difficult to clear the rule for x.
Clear["x"] works because, although the string "x" gets converted to the symbol x within the Clear function, that conversion doesn't happen until after the downvalue for Clear is already being applied, and the Clear function clears the rule for x in a way that does not involve evaluating Clear[x].
More generally, this is an example of one of a small handful of inputs in the Wolfram Language that can be difficult to undo. These things almost never come up in practical applications, but they do sometimes come up by accident, or sometimes they come up when just trying things out to see what will happen.
For example, I do not recommend evaluating:
$Pre = Function[x, Pause[600]; x, HoldAll]
which will introduce a ten minute pause before every evaluation. The pause can be aborted, but it is difficult to remove that pause without waiting ten minutes for a subsequent evaluation to remove it.
It is unlikely that such a thing would be entered by accident, of course, but if a predicament arises where something that is difficult to undo has happened, a general solution is to quit the Wolfram Language session and start over.