Why the diff is not the message
A diff already shows what lines changed. A commit message or a pull request description that just restates the diff in prose is wasted words. What a reviewer or a future you actually needs is the reasoning: why the change happened, what problem it solved, and what was considered along the way. Write for that gap, not for the parts a tool can already show.
A commit message is two things, not one
The first line is a short, imperative summary, under about 72 characters, written as an instruction: “Fix session expiry retry logic”, not “Fixed” or “This commit fixes”. That line alone is often enough. Only add a body paragraph when the change genuinely needs explaining: a non-obvious bug, a tradeoff you made, or something a reviewer scanning history later would want to know. A small, self-explanatory change does not need a body at all. Padding every commit with a body is as bad as never writing one.
What a good PR description actually contains
Open with two or three sentences on what changed and why, leading with the motivation rather than the mechanics. Follow with a “What changed” section as bullet points, one change per bullet, specific rather than vague. Add a “Testing” section only if you actually tested the change and can describe how. Never invent test steps just to fill the section; an honest description with no testing section beats a fabricated one.
Common mistakes
- Writing the summary line in the past tense (“Fixed the bug”) instead of the imperative (“Fix the bug”).
- Restating the diff line by line instead of explaining the reasoning behind it.
- Adding a “Testing” section with steps you did not actually run.
- Padding the description with release notes language like “this update brings” when it is one developer writing to another.