I understand that some branches match channels e.g.:
nixos-unstable channel = master branch
nixos-19.03 channel = release-19.03 branch
What’s the point of the staging.* branches? From what I see, staging-next is merged into staging and then into master.
But PRs have different targets. What would make a specific change go into staging and not directly into master?
It’s actually the other way around. PRs that require many rebuilds get merged into staging. Every once in a while, the current staging gets forked off into staging-next. The purpose of staging-next is to let the current rebuild finish, detect regressions, stabilize. staging-next is then merged into master. See https://github.com/NixOS/rfcs/pull/26 for details.