#######################################
Getting started with git gui on Windows
#######################################

***********************
Install git for Windows
***********************

* Get a copy of the msysgit_ ``.exe`` installer
* Double click to install git_ on your machine
* Accept all the defaults

*****************
A pretend project
*****************

For simplicity, let us make a folder for our project in the ``c:\`` drive.

* Right click on the ``C:\`` drive in Windows Explorer, select "New folder",
  name ``my_idea``
* Right click in ``my_idea``, folder, select New file, of type "Text document".
  Name it ``good_idea.txt``.
* Open ``good_idea.txt`` and add some text like "This is my good idea", and
  save.

****************************************
Putting the project into version control
****************************************

Now we have a very small project, just a folder with a single file in it.  We'll
now put this folder into version control.

Initializing the repository
===========================

* Right click in the ``my_idea`` folder, choose "Git Init Here" to initialize
  the git database:

  .. image:: images/git_init_rc.png

* You may notice that there is now a hidden folder called ``.git`` in the ``my_idea`` folder.

  .. image:: images/dot_git_folder.png

  If you can't see this hidden folder, you may need to change the folder viewing
  options.  From Windows XP explorer this is the "Tools" menu, then "Options".
  You should enable viewing hidden folders in the "View" tab:

  .. image:: images/folder_options.png

Adding stuff to the repository
==============================

Now we have a git database in our folder, we need to add our file.

* Right click in the ``my_idea`` again, choose "Git Commit Tool"

  .. image:: images/git_gui_rc.png

* You will get a dialog like this:

  .. image:: images/first_commit_unstaged.png

  Notice that our file is at the top left, and is "Unstaged".  That means that,
  at the moment, it is not going to be part of any "Commit" we do.  A commit is
  where we record changes into the database.  We do want to record our file, so
* Either click on the little icon to the left of the ``good_idea.txt`` filename
  in the dialog, or go to the "Commit" menu, "Stage to commit" option.  Notice
  the ``good_idea.txt`` file then goes to the "Staged changes (Will Commit)"
  section of the dialog.

  .. image:: images/first_commit_staged.png

* Add a message in the lower right box, like ``The first signs of my idea``. The
  commit message is a reminder what set of changes the commit has.  It's very
  useful to put meaningful messages here for quick reminders of what you
  intended with the changes.  Now click "Commit".  Congratulations!

Speak with your own voice
=========================

Each commit has someone who wrote the contents of the commit - the "author".  So
you can get all the blame, and all the credit, you can identify yourself to git.
That way git can see who's doing the work (or doing the damage).

* Right click in "my idea", choose "Git Gui".
* Click on the "Repository" menu and select "Visualize master's history":

  .. image:: images/gg_repository_menu.png

* Notice that you are 'Author: unknown':

  .. image:: images/first_history.png

* Close the history window, right click and open 'Git Gui' again
* Go to menu Edit - Options.  Set your username and and email address in the *Right hand* panel (global options).

  .. image:: images/setting_self.png

  Save.  Close.
* Let's show ourselves that I have become myself.  Make a new file
  ``another_idea.txt``. Start "Git Commit Tool" with a right click, stage the
  file by clicking on the icon next to the filename, add a message and the click
  commit.
* Open Git history from the Git Gui, choose the "Repository" menu, "Visualize master's history".
  Notice that you have two commits now, and the second one has your name on it.

***************
Making a backup
***************

Now you have your changes backed up into your repository, but you will probably
want to back up the repository somewhere.

Let's pretend to back the repository up to a shared drive (but in fact we'll
back up to the ``C:\`` drive).

* Right click in the ``my_idea`` folder, chose "Git Gui"
* Choose menu "Remote", "Add":

  .. image:: images/initial_remote_add.png

* Give a name for your backup (no spaces) and a path to write the backup to.
  I like to add ``.git`` to the folder name for the backup, because this will be
  a backup with only the repository (the ``.git`` subfolder, but not the
  ``.txt`` files):
* Select "Initialize repository and push", then click "Add".

  .. image:: images/remote_add_dialog.png

* If you get "Success" then your files have been backed up to this other folder.

****************************
Working from another machine
****************************

Now you can work from any computer and send changes back to the backup copy.

We can pretend to do this by making a new copy as if it was on (say) your
laptop.  But in fact we'll create the folder in the ``C:\`` drive again.

* Right click on the ``C:\`` drive, choose 'Git Gui':

  .. image:: images/git_gui_main.png

* Select "Clone existing repository".  For the 'Source location', browse to the
  backup that you just made. Type ``C:\laptop_working`` for the target directory.  Choose
  "full copy" from the options (for safety).  Click on "Clone".

  .. image:: images/clone_dialog.png

* You now have a ``c:\laptop_working`` folder that is a clone of the "my_backup"
  repository, and that also has the same data as the ``c:\my_idea`` folder.
* Let's make some changes on the laptop.  Go to the ``c:\laptop_working``
  folder.  Make a new file ``idea_on_laptop.txt`` and type some text in it.
  Save.
* Right click, "Git Commit Tool", stage the ``idea_on_laptop.txt`` file, add a
  commit message and click "Commit".

  .. image: images/adding_laptop_idea.png

  Now you have this contents in your ``laptop_working`` folder.

  .. image:: images/laptop_directory.png

You put the changes back into the backup by doing a "Push"

* Right click in ``laptop_working``. "Git Gui", "Remote" menu, "Push ..."

  .. image:: images/laptop_remote_menu.png

  On the next dialog, click "Push".

  .. image:: images/laptop_push.png

  The changes go back to the ``my_backup.git`` repository.

************************************
Getting changes from a common backup
************************************

Let's pretend that we've gone back to our original computer and we want the
changes that we pushed from the laptop.

* Go back to the ``my_idea`` folder.  Notice you don't have the
  ``idea_on_laptop`` file yet.
* Right click, "Git Gui", "Remote" menu, "Fetch from" from the ``my_backup``
  remote.

  .. image:: images/gg_fetch_my_idea.png

  Now you have the changes *in the repository* (the ``.git`` subdirectory)
  - but not *in the working tree*.  Specifically, we don't have the
  ``idea_on_laptop.txt`` file in the folder yet:

  .. image:: images/my_idea_before_merge.png

  To get the file, we need to do a *merge*.  This brings the changes from the
  *repository* into the working tree.  Open the "Git Gui" if it is not open.
  Choose the "Merge" menu, "Local Merge" option.

  .. image:: images/local_merge.png

  In the dialog, accept the
  defaults and click "Merge":

  .. image:: images/merge_dialog.png

  Now you have your file - and you are synchronized with the laptop.

  .. image:: images/my_idea_after_merge.png

******
Review
******

* Code states stored so you can

  * See what you've done
  * Go back to an earlier state if you make a mistake
  * Send files to and from different computers

* If you are working with someone else they can add their changes

  * You can see what they did, they can see what you did
  * It's easy to undo if one of you makes a mistake

This system is powerful, very useful and sometimes confusing.  Consult an
expert if you get confused.  It is fairly difficult to lose data if you ask an
expert after you have made a mistake or got confused.

.. include:: links_names.inc
