When working with your game in a source controlled setup, it is important that you follow the same steps all the time when creating, committing or reverting files in your game. To make things easier,
below you can find a brief overview for the three main procedures that you will need to work with.
When creating a new resource for your game (whether it be a room, a sprite or a time line), there are a couple of steps that you should always take to ensure that it is correctly versioned in your source control repository:
- Create the resources by adding the scripts, objects, sprites etc...
- Save the project as the resources do not exist outside of the IDE and this will add them to the SCM repository for committing.
- OR run/test the project which will also add the resources to the SCM project repository for committing.
Now that you have added your resources to the repository, you can continue working on them as before, with each save or test run of the game updating the files to be added to the repository. however, just adding
them does not actually commit the changes. This is explained in the following section.
Adding files (as explained above) only marks the files as "to be added" to your source control repository but doesn't actually save them there. So we must now commit the files in order for the repository
to hold these files. This step is very important as without it, your repository will not be up to date and you cannot use any of the source control features.
To commit files to the repository, follow these simple steps:
- Right click on the resource in the resource tree and select Source Control -> Commit All (you can also select Commit directly from the menu but that is for individual files and also we have a lot more than just your new files to commit, as you will see).
- You will now get a commit dialog.
At the top you can add a message which will be logged along with your commit so that others can get a general idea of what you committed, and below this you will see all files that you are going to commit.
- You will see that there are a lot of files in there, with most of them being the config files and images. You can choose just what to commit here by deselecting items in this dialog. The left panel shows file names and the check-boxes for deselecting and selecting them, while the right panel shows you the status of the file (A=added, M=modified, D=deleted, ?=un-versioned, C=Conflicted and !=Missing).
- For this first commit, it is recommended that you do not deselect anything and commit everything, adding in as a message log something like "initial commit". Now press "Ok".
- You will now see in the compile messages it is adding and committing to the repository. This can take a while depending on your connection and the amount of files. The first commit can be quite lengthy but you are looking for the message "Refreshing SVN Status...finished" which tells you that everything has been done and you can continue to work on the game.
Now that you have done your initial commit, the process should be more or less the same from now onwards, with you editing something, saving the project and then committing the change(s) to the repository, either
using the commit all or simple commit commands from the right click menu of the resource tree. Note that you can right click on files in the list and revert, if need be. This is useful when files become
missing because of conflicts, or even just accidental modifications. Also note that the actual status information is dependent on the SCM system being used. The ones mentioned above are specific to SVN but may not
match up with Git or Mercurial.
One of the principal uses for source control is the ability to "roll back" your game to a previous state and undo any changes that have been made. This can be of particular importance when you have added something
that breaks the game or have made some design changes that you want to go back and add in. in situations like this you will need to use the Revert option.
The following steps outline how to revert to the last committed version of a file stored in the repository:
- Right click on a resource you wish to revert and click "Source Control -> Revert".
- You will see a message appear in the compiler form at the bottom of the IDE saying "Reverted 'xxxxx.gmx'".
- Your resource is now back to the previously committed version.
Please note that this is not reversible, unless you are reverting from an already committed change. If you make some changes without doing a commit and then revert, once you have reverted there is no going back to your non-committed version.
Once your game file has been added to your source control repository you will see that a new set of icons have been added to each resource on your resource tree. These are the GameMaker: Studio source
control indicators and are used to give you a graphic representation of the versions of each of your resources and while working on your project will look a bit like this:
Obviously the exact icons you see will depend on your project and what you have been working on, but you still need to know what they all mean! The list below shows each one and explains their significance:
Updated: This shows that the resource is updated to the current version as stored in the repository.
Added: This icon means that you have created a new resource and it has to be added into the repository. This will happen
automatically when you save your progress.
Modified: When you change a resource in any way this icon will appear beside it to let you know that it is now different to
the last version in the repository.
Not Versioned: If you see this icon it means that the resource is not recognised by the SCM solution and should therefore
be added to the repository. There is an "add" command provided for this in the right-click menu from the resource tree.
Conflict: If you get this icon it means there is a conflict between two resources. This can only usually happen when two or
more people work on the same source and cannot be resolved through GameMaker: Studio. For that you will have to use your windows SVN Client to merge the two files or manually edit the *.gmx files.
You can work on your game as normal, creating, changing and adding resources as necessary knowing that these changes are only being done to your local copy of the game, not the versioned copy stored in
the repository. As mentioned in the sections above, a game with source control active also has an extra set of commands available from the right click menu of the resource tree. These new options deal with source
control and look like this:
As you can see there are two most common actions that need to be performed:
- Add To Source Control: This will add a resource to the repository. When you see the
"not versioned" icon showing you will need to use this action.
- Commit To Source Control: This will commit the selected resource to the source control repository. If you have a folder selected then everything in that folder will be committed, otherwise it will only commit the selected resource. When you commit something you will also be prompted to add a comment where you can briefly explain what you have added or changed, and this will then be stored along with the updated version of your project.
- Update from Source Control: This will update the selected resource (or resources if you have a folder selected) in your local copy of the project from the repository. Any changes, additions or conflicts will now show up in GameMaker: Studio
Below those actions, you also have a further sub-menu titled "Source Control". There are further actions that you can perform listed here:
- Edit Conflicts: Edit any conflicts that have been found using the SCM interface set in the SCM Preferences.
- Show Log: This will show the log file for your SCM solution so you can see recent activity.
- Show Status: Shows a status window for your SCM solution.
- Commit All: Commits everything into the repository. You will be prompted to save your work to the local copy before committing.
- Refresh: This simply refreshes the source control icons beside the resource (or resources if you have a folder selected) to reflect the current versioned status.
- Refresh All: This simply refreshes the status icons beside all the resources.
- Revert: With this action you revert the selected resource, or resources if you have a folder selected, to the last version you have updated to from the repository.
- Revert All: Use this to revert all changes that you have done back to the last version you have updated to from the repository.
- Update All: This will update all resources in your local copy of the project from the repository. Any changes, additions or conflicts will now show up in GameMaker: Studio.
- Add All: Adds all resources in the resource tree that have not yet be versioned to the repository.
- Cleanup: Cleans up your SCM files, refreshing status and icons and checking for conflicts etc...
It should be noted that there is no option to rename any resource as this is handled internally. So, when you have source control enabled and you rename (for example) a sprite, GameMaker: Studio will
automatically change and update your local copy of the project without any need for your intervention. these changes will then be added to the repository on the next commit.
Also note that you can add your own commands to this menu at any time through the Source Control Preferences.
If you have any conflicts when committing your added files, you can select the Edit Conflicts option from the context menu (see the section above). This will open up the Conflicts Editor, where
you can decide what to do.
This editor will list the conflicting files on the left and present you with a number of options for what to do, available from the buttons on the right:
- Edit Conflict: Edit any conflicts that have been found using the SCM interface set in the SCM Preferences.
- Resolved: Mark the conflict as resolved.
- Use Theirs: Update the conflicted file to use the other version.
- Use Mine: Update the conflicted file to use the version being committed.
- Refresh: This simply refreshes the current versioned status.
When finished you can close the Conflict Editor and then re-commit the conflicted files as normal.