I found a good elaboration on blockchain forks from Coindesk, that passage illustrates how Blockchain hard/soft forks were created, and what the potential consequnences these forks may bring.
Hard forks are created by the changes of the protocol such as block size, difficulty.
In hard forks, the new version blocks will not accepted by the old version nodes.
Hard forks can lead to double-spending transaction in the sense that an UTXO that has been spent on the new-chain can be spent again in the old-chain.
Soft forks are created by the changes of protocol in a way that does not affect the structure. (e.g., tighten the rules, add cosmetic functions)
In soft forks, the new version blocks will be accepted by the old version nodes.
New version blocks will be seen and accepted by both new version nodes and old version nodes, so the new version blocks will eventually dominate the the longest chain.
Check out [Hard Fork vs Soft Fork] for the details.