@c @c Instructions on how to set up a group environment, permissions, @c Git repository, dealing with issues etc. @c @c While some of the discussion may apply to more than one environment, @c no attempt was made to untangle and split the discussion. @c @menu * Setting Up Git:: * Using Git:: @end menu @node Setting Up Git @subsection Setting Up Git To make your Git logs easier to read, you should set the user.name and user.email variables in your .gitconfig file: @verbatim [user] name = Firstname Surname email = example@doc.ic.ac.uk @end verbatim Note that we will be checking your Git logs as part of your submission. You should ensure that you use meaningful commit messages and make it clear who was responsible for each commit (especially if you are using pair-programming). To work on the source code, you must create a clone of your group's provided @file{GitLab} repository. This can be done by running the following command: @example git clone @value{localgitpath} @end example replacing @code{} with your group number, which can be found on the @code{Gitlab} website. @node Using Git @subsection Using Git Once you've cloned the repository, you can start working in your clone straight away. At any point you can see what files you've modified with @samp{git status}, and check a file in greater detail with @samp{git diff @var{filename}}. You view more detailed information using tools such as @samp{tig} Git uses an intermediary area between the working filesystem and the actual repository, known as the staging area (or index). This allows you to perform tasks such as committing only a subset of your changes, without modifying your copy of the filesystem. Whilst the uses of the staging area are outside the scope of this guide, it is important that you are aware of its existence. When you want to place your modifications into the repository, you must first update the staging area with your changes (@samp{git add @var{filename}}, and then use this to update the repository, using @samp{git commit}. Git will open a text editor when committing, allowing you to provide a description of your changes. This can be useful later for reviewing the repository, so be sensible with your commit messages. When you want to share your changes with the rest of your group you will need to run @samp{git push} to send your commits back to the shared @file{labranch} repository. Note that the very first time you push you will need to run the command: @example git push origin master @end example to tell Git which branch of your local repository to push to which remote repository (in this case from branch @code{master} to the @code{origin} repository). Sometimes your group members may make confliting changes to your repository, which Git is unable to solve. These problems can be solved using @samp{git mergetool}, but its use is outside the scope of this dicussion. You can view the history of a file @var{foo} in your working directory, including the log messages, with @samp{git log @var{foo}}. You can give a particular set of file versions a name called a @dfn{tag}. Simply execute @samp{git tag @var{name}}. It's best to have no local changes in the working copy when you do this, because the tag will not include uncommitted changes. To recover the tagged commit later, simply execute @samp{git checkout @var{tag}}. If you add a new file to the source tree, you'll need to add it to the repository with @samp{git add @var{file}}. This command does not have lasting effect until the file is committed later with @samp{git commit}. To remove a file from the source tree, first remove it from the file system with @samp{git rm @var{file}}. Again, only @samp{git commit} will make the change permanent. To discard your local changes for a given file, without committing them, use @samp{git checkout @var{file} -f}. For more information, visit the @uref{https://www.git-scm.com/, , Git home page}.