A changelog is the root file that contains or references all database changes for your project. It acts as a ledger of all modifications that should be applied to bring a database to a particular state.
A changeset is an individual unit of change within a changelog. Each changeset represents a single logical database change and has a unique identifier.
<!-- This is a changelog file -->
<databaseChangeLog>
<!-- This is a changeset -->
<changeSet id="1" author="john.doe">
<createTable tableName="users">
<column name="id" type="int" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
<column name="username" type="varchar(50)"/>
</createTable>
</changeSet>
<!-- Another changeset -->
<changeSet id="2" author="jane.smith">
<addColumn tableName="users">
<column name="email" type="varchar(100)"/>
</addColumn>
</changeSet>
</databaseChangeLog>
Key characteristics of changesets:
Must have unique ID and author combination
Are atomic (all-or-nothing execution)
Can only be run once per database (unless marked as runAlways)
Rewriting in plainer words…
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.