Render computes the change list, commit applies it
The common read: Commit is the diffing step, so React walks its tree against the live DOM while committing, finds what differs, and patches it.
An update runs three steps: trigger, render and commit.
By the time commit begins, the list of DOM operations
Commit compares nothing. Each step has exactly one job:
Trigger: the state update that starts it. Render: React calls your components and calculates what changed since the previous pass. Commit: React applies that result, changing a DOM node only where the two passes differ.
If you confuse render and commit, you cannot answer some bug reports correctly. For example, a label still shows an old value after an update. The engineer blames commit or the browser for not writing it, but the render pass never produced a write for that node, so the fix is in what the component returned.
Paint is not a fourth step. The browser paints after React has returned, and react.dev reserves the word "rendering" for React's own phase so that readers do not confuse the two.
Takeaway: Say which half you mean in the review comment. "It renders too much" means React calls too many components. "It writes too much" means your output changed where it did not need to, for example a key that changes on every update. The two problems have different fixes.

