How to properly setup a multi-environment release pipeline in Azure YAML pipelines?
Assuming that deploy to DEV and QA steps look a lot like your deploy to production-staging environments, put the code that does that work into a yaml template and take advantage of parameters to allow you to pass in differing environment settings for DEV, QA, and Staging-Production. 

Then in one pipeline create a stage for each environment.  The stage should have a job which references your template.  You should use conditions on each stage to ensure your code goes to the environment when you want it.  Here's a pseudocode example:

stages:
- stage: MyDevStage #No condition so this stage always runs
  jobs:
    - template: '../MyTemplate.Yaml
      parameters:
        ServerName: MyDevServer
- stage: MyProdStage
  condition: and(
    succeeded() # if my dev deploy doesn't go well don't deploy to PRD
    , eq(variables['Build.SourceBranch'], 'refs/heads/master') # confirm this is a commit to master
    )
  jobs:
    - template: '../MyTemplate.yaml'
      parameters:
        ServerName: MyProdServer


At the top of your pipeline yaml file you'll need to specify a trigger which may look something like this:

trigger:
  batch: true
  branches:
    include:
    - master