.. _git:
#############################
Git Version Control
#############################
**Git** [#]_ is a distributed text code repository which operates as follows:
+ Local workstation project folders include a copy of the repository archive
+ :command:`Commit` adds changes to the local repository copy
+ A remote master or upstream repository maintains the canonical archive
+ :command:`Pull` retrieves remote master archive changes and merges them into
the local copy
+ :command:`Push` merges local commits with the remote master archive
+ Collision detection rather than exclusive locking manages conflicts between
local and remote archives
Git was written by Linus Torvalds to manage version control for the Linux
kernel. It has become a *de facto* standard for open-source version control.
Git is simple in use, and the distributed code approach is well-suited to
open-source development, where contributors do not share continents, much less
office space.
Set Up Git
=============================
Installation
-----------------------------
Git installation packages are available for practically every computer system.
Here are Linux installation commands:
+------------------------+----------------------------------------------------+
| System | Git Installation Command |
+========================+====================================================+
| Debian/Ubuntu Linux | ``sudo apt-get install git-core`` |
+------------------------+----------------------------------------------------+
| Redhat/Fedora Linux | ``sudo yum install git-core`` |
+------------------------+----------------------------------------------------+
| Mac OS-X w/ Mac Ports | ``sudo port install git-core`` |
+------------------------+----------------------------------------------------+
| OS-X graphical install | http://code.google.com/p/git-osx-installer |
+------------------------+----------------------------------------------------+
Use `this guide `_ for a more
detailed explanation of Git packages, versions, and system requirements.
Configuration
-----------------------------
Git stores global settings for each user in home directory file
:file:`~/.gitconfig`. :command:`Git config` console commands change settings in
this file. The following global configuration settings are recommended::
git config --global user.name "{firstname lastname}"
git config --global user.email "{email@domain}"
git config --global branch.master.remote origin
git config --global branch.master.merge refs/heads/master
git config --global --add color.ui true
For git 2.0, push.default changes from matching to simple. If this is a problem,
add the following configuration command::
git config --global push.default matching
The following configuration is necessary when encased in the Microsoft Windows
coccoon::
git config --global core.autocrlf true
If the :command:`--global` option is omitted, then settings will apply to
whichever project repository is open at the time. Most git information specific
to a project is stored in directory :file:`.git` at a project's root folder.
Remote Repository Hosting
=============================
Remote Git repository hosting services are readily available, and so there is
little reason to install a private Git repository server. Some sites which
provide free repository services for public and some private repositories are
listed following:
+--------------------+-------------------------------------------+
| Site name | URL to site |
+====================+===========================================+
| Gitorious | https://gitorious.org |
+--------------------+-------------------------------------------+
| GitHub | https://github.com |
+--------------------+-------------------------------------------+
| Bitbucket | https://bitbucket.org |
+--------------------+-------------------------------------------+
Many website hosting services provide direct integration with repository
services. Github provides hosting for static sites through **gh-pages** and
blogs with **octopress**. **Heroku** hosts a variety of code sites with
deployment occurring through git repository commands:
| ``heroku create`` adds a git repository remote ``heroku`` to a project
| ``git push heroku`` deploys project web application code at Heroku
Creating a Project
=============================
Project Folder
-----------------------------
Typically developers manage projects as folders in a :file:`Projects` directory
within their user :file:`home`. Git commands will create or install a project
folder in one of two ways:
#. A git server or hosting service, such as Github, will generate a project
resource URL. The project can be cloned to a local client with the command::
git clone {project_resource_URL} {folder_path}
for example, clone this project from github into folder :file:`doc-develop`
with the command::
git clone git@github.com:aaltsys/doc-develop.git ~/Projects/doc-develop
#. A project is started on a local client and later pushed to a remote server.
In this case, the local project is initialized with the command::
git init {folder_path}
for example, ::
git init ~/Projects/doc-develop
.. _gitignore:
.gitignore
-----------------------------
Your project will contain files with content that you create, and other files
which are generated by the system, such as compiled code. A git repository
should track user-created text content and not system files. Using ``nano`` or
``kate``, create a :file:`.gitignore` file to identify untracked files to git.
[#]_ Here are suggested entries for :file:`.gitignore` with a documentation
project using the Linux Kate editor::
# ignore editor backup files
*~
*/*~
# ignore make compilation
*build/*
*/*build/*
# ignore deployment content
*deploy/*
*/*deploy/*
# keep hidden placeholder files which preserve directories
!.gitkeep
!*/.gitkeep
When creating a repository, most hosting services will include a
:file:`.gitignore` file appropriate to the specified repository type.
Using Git
=============================
Basic git commands [#]_
-----------------------------
+-------------------------------+------------------------------------------------+
| Git Command | Command Purpose |
+===============================+================================================+
| ``git pull`` | retrieve and merge remote changes with local |
+-------------------------------+------------------------------------------------+
| ``git status`` | display tracked and untracked changes |
+-------------------------------+------------------------------------------------+
| ``git add {filename}`` | stage and track changes ({filename}=. for all) |
+-------------------------------+------------------------------------------------+
| ``git reset`` | clear changes staged for commit (undo add) |
+-------------------------------+------------------------------------------------+
| ``git mv {old} {new}`` | rename files under git version control |
+-------------------------------+------------------------------------------------+
| ``git rm {-rf} {filepath}`` | delete files under git version control |
+-------------------------------+------------------------------------------------+
| ``git commit -m "{message}"`` | commit changes to local repository copy |
+-------------------------------+------------------------------------------------+
| ``git push`` | add and merge local changes with remote |
+-------------------------------+------------------------------------------------+
Command Notes:
+ ``git pull`` -- synchronize your local repository copy to the remote master
repository before starting a day's work.
+ ``git add`` -- use the period ("dot") to stage all tracked changes, otherwise
name specific files to add. Exclude categories of files using entries in
:file:`.gitignore`.
+ ``git mv`` -- syntax for :command:`git-mv` is the same as the Linux
:command:`mv` command, but proceded with :command:`git`.
+ ``git rm`` -- syntax for :command:`git-rm` is the same as the Linux
:command:`rm` command, but proceded with :command:`git`.
+ ``git commit`` -- Provide a terse but descriptive message for your changes.
+ ``git push`` -- push local content once it is synchronized with master
changes, tested, and committed locally.
.. warning:: Always use the :command:`git` command versions for :command:`mv`
and :command:`rm` when working with files under version control. The penalty
for ignoring this convention is much repeated typing.
.. Note:: If git requires a user password in the :command:`git push` command,
then an ssh key is missing at the remote host. Follow directions from the
hosting site to add the missing key.
Git in daily workflow
-----------------------------
Start your day's work with::
git pull
Add your local changes and view the results with the command sequence::
git add .
git status
git commit -m "{a brief description of the changes for this commit}"
.. hint:: Git adds and commits your saved work. Therefore, make sure you save
changes to documents in the editor before using git commands.
Rename files or delete them with git-specific commands::
git mv {old_filename} {new_filename}
git rm {-rf} {path/filename}
Update the remote master repository with the command::
git push
------
.. rubric:: Footnotes
.. [#] For information on git, see http://en.wikipedia.org/wiki/Git_(software).
A git online reference manual is at http://gitref.org/.
.. [#] `GitHub Help `_ has an excellent
explanation of :file:`.gitignore`.
.. [#] `Try GitHub `_ offers a quick tutorial on Git
and GitHub to bring you up to speed.
.. [#] Scott Chacon, Pro Git (August 27, 2009, ISBN-10: 1430218339), available
at Amazon, or for free on-line at http://git-scm.com/book.
.. [#] Scott Chacon, Pro Git book source (written in MarkDown, not reST)
repository on GitHub: https://github.com/progit/progit.