There is a guarantee that you have when rebinding is the only option.
with rebinding:
def thing() do
x = 10
do_something(x)
# x is 10, non negotiably, it is never not 10
end
with mutability
def thing() do
x = 10
do_something(x)
# who knows what x is? Could be anything.
end
Additionally, because rebinding is a syntactic construct, you can use a linter to detect it:
https://hexdocs.pm/credo/Credo.Check.Refactor.VariableRebind...