Assume a transaction is composed of two parts:
[proof of ownership] [new owner public key]
Bitcoins are born in coinbase transactions, which are special because they don’t have proof of ownership, and they belong to the miner:
[ ] [miner public key]
When the miner wants to spend this coins (send to Alice), he generates a new transaction, where he needs to prove he owns them, so he signs it with his private key:
[ ] [miner public key] => [signed with miner private key] [Alice public key]
Everyone can check if the signature is valid, without knowing the miner’s private key, thus verifying the proof of ownership. If it is valid, the transaction is accepted and soon will be confirmed in the blockchain.
Alice is now the owner of some coins. When she decides to spend them, she will repeat the process:
… => [signed with Alice private key] [Bob public key]
And so on.
Note: for simplicity reasons, I only used public keys to identify the new owner, but there are more types of transactions.