In the projects we test we have several steps that are used across several types of tests.
Additionally many of these steps change as software gets updated, or we find more efficient ways to test things.
My current solution is to have a list of templates for each platform we test in our repository. These templates are constructed entirely from shared steps. When a new test is needed we simply clone the template and move it to the correct place. When a step changes, we just update the shared step.
What would be more efficient is to flag certain test cases as templates and then have the option to create a test case from a template.