<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vpiddem</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vpiddem"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Vpiddem"/>
	<updated>2026-05-17T13:20:50Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92558</id>
		<title>CSC/ECE 517 Fall 2014/final S1455</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92558"/>
		<updated>2014-12-16T17:21:05Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Design Principles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please read the &amp;quot;README&amp;quot; file provided in expertiza. This wiki page contains design details for the project for Sahana Eden Humanitarian Platform, on their Central African Republic deployment.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:{{{align|right}}}&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |[[File:SahanaLogo.png|center|Sahana]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
== Background Information ==&lt;br /&gt;
====About Sahana Eden====&lt;br /&gt;
Sahana Eden is an Open Source Humanitarian Platform, which can be used to provide solutions for Disaster Management, Development, and Environmental Management sectors. It is supported by the  Sahana Software Foundation, Used in many Deployments, such as Ebola, Kashmir Floods, Hurricane Sandy, just to name a few. It is highly configurable so that it can be used in a wide variety of different contexts and is easy to modify to build custom solutions. Different levels of support are available from both the voluntary Sahana Eden community and professional companies. Sahana focuses on Community and Professional Support.&lt;br /&gt;
&lt;br /&gt;
====Getting to know the domain====&lt;br /&gt;
&lt;br /&gt;
Their [http://eden.sahanafoundation.org/wiki/Domain domain] page elaborately describes various major management projects and deployments that are done in the past or are ongoing. Spending some time to understand goals and purposes of Sahana before starting with actual development might help making the code better and more sensible from Sahana's perspective.&lt;br /&gt;
&lt;br /&gt;
====Installation &amp;amp; tutorials====&lt;br /&gt;
&lt;br /&gt;
Anyone who wishes to contribute their development skill to Sahana, can do so with the help of an elaborate guide they have provided, that covers everything from [http://eden.sahanafoundation.org/wiki/InstallationGuidelines installation] to [http://eden.sahanafoundation.org/wiki/Book tutorials] on Python. Once the installations are complete, you can simply identify a task you are interested in, and start working on it. You may also want to sign their [https://docs.google.com/a/ncsu.edu/spreadsheet/viewform?formkey=dEp5czdPYThPY2htX2pNM1JGaTBrRGc6MQ#gid=0 Contributor's License Agreement] before making any pull request.&lt;br /&gt;
&lt;br /&gt;
Below is a high level overview to begin contributing to Sahana-&lt;br /&gt;
&lt;br /&gt;
The code is in the folder: web2py/applications/eden&lt;br /&gt;
&lt;br /&gt;
Inside that folder are folders for Models (define the data structure), Controllers (provide URLs to enable access to the data) &amp;amp; Views (HTML templates).&lt;br /&gt;
&lt;br /&gt;
Each module within Sahana Eden will normally consist of one of each of these files:&lt;br /&gt;
&lt;br /&gt;
    Model: modules/s3db/modulename.py&lt;br /&gt;
    Controller: controllers/modulename.py&lt;br /&gt;
    View: views/modulename/index.html&lt;br /&gt;
&lt;br /&gt;
In order to know which file to edit in order to change a particular function, you need to look at the URL. The Web2Py web framework maps URLs as follows:&lt;br /&gt;
&lt;br /&gt;
    http://host/application/controller/function&lt;br /&gt;
&lt;br /&gt;
So, if you want to edit the Home page with the URL:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/default/index&lt;br /&gt;
&lt;br /&gt;
This implies that you should look at the file eden/controllers/default.py and the index function within it which can be found by searching for the function title &amp;quot;def index():&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Tip: Sahana Eden makes heavy use of integrated resource controllers so the typical mapping is:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/module/resource&lt;br /&gt;
&lt;br /&gt;
The resource refers to a table with the name module_resource in the file modules/s3db/&amp;lt;module&amp;gt;.py&lt;br /&gt;
&lt;br /&gt;
==Introduction to project==&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
In the Central African Republic page, some data needs new models, and some models need tweaking. The purpose of this project is to identify any such requirement and make necessary changes. The general steps to follow in Sahana development are mentioned below-&lt;br /&gt;
&lt;br /&gt;
1. Add/modify the core models in modules/s3db&lt;br /&gt;
&lt;br /&gt;
2. Add REST controllers for new models&lt;br /&gt;
&lt;br /&gt;
3. Check basic operations using automatic CRUD interface- tweak list_fields to the most-relevant fields perhaps &lt;br /&gt;
&lt;br /&gt;
4. Add menu entries (modules/s3menus.py)&lt;br /&gt;
&lt;br /&gt;
5. Develop XSLT &amp;amp; CSV templates (static/formats/s3csv) to bulk import the data&lt;br /&gt;
&lt;br /&gt;
6. Convert the data to these CSV templates- use ogr2ogr for this &lt;br /&gt;
&lt;br /&gt;
7. Add layers to the map (private/templates/&amp;lt;TEMPLATE&amp;gt;/gis_layer_feature.csv. Look at default for now) including Markers and tooltips (popup_format)&lt;br /&gt;
&lt;br /&gt;
8. Provide some report_options to make a meaningful report&lt;br /&gt;
&lt;br /&gt;
====Scope====&lt;br /&gt;
Four modules related to this deployment are-&lt;br /&gt;
&lt;br /&gt;
1. Health - modules/s3db/hms.py&lt;br /&gt;
&lt;br /&gt;
2. Transport - modules/s3db/transport.py&lt;br /&gt;
&lt;br /&gt;
3. Water - modules/s3db/water.py&lt;br /&gt;
&lt;br /&gt;
4. School - There is no separate module for education.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We took up the Health module and worked on the Magnu template of Sahana. The key point for the core module is to ensure that we can capture all of the data that is available. There was a need to hide some of this complexity from the Magnu template which is used by CAR.&lt;br /&gt;
&lt;br /&gt;
- Currently, Sahana is keen to show people how it could be used. &lt;br /&gt;
&lt;br /&gt;
- An approach to this is to add one or two deployment_setting to be able to easily switch on/off chunks of functionality like this without needing to resort to custom code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another thing on a to-do list is adding markers to hospital overlay, and making them vary by type of hospital.&lt;br /&gt;
&lt;br /&gt;
====Reference Material====&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-health Hospital Model]&lt;br /&gt;
&lt;br /&gt;
[http://geonode.wfp.org/layers/geonode:wld_poi_bcp_wfp Border Control Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-roads Roads], [http://geonode.wfp.org/layers/geonode:wld_trs_supplyroutes_wfp Routes], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-aerodromes-airports-airfields Airports]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies Water Bodies], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies-0 Water Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-courses Rivers]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education Education]&lt;br /&gt;
&lt;br /&gt;
==System Overview==&lt;br /&gt;
&lt;br /&gt;
Sahana Eden Framework:&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Software Platform has been built around a Rapid Application Development (RAD) Framework. This provides a high level of automation to ensure that new solutions can be quickly and effectively developed. Once a database table is defined, the Sahana Eden Framework automatically generates HTML pages to handle CRUD (Create, Read, Update, Delete) as well as Search, Map and Pivot Reports. Web Services are available to import and export in XML, CSV, JSON and EXtensible Stylesheet Language (XSL) transforms are supported to produce other data standards.&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Framework has flexible authorization policies which can be configured to grant permissions for different modules, tables as well as the ability to have multiple Organizations control their own data on a single Sahana Eden installation.&lt;br /&gt;
&lt;br /&gt;
Sahana Eden can be downloaded and run locally from a flash drive. Synchronization functionality allows data to be entered then keep up to date between different installations, including online servers and local flash drive installations. The Sahana Eden Framework also includes a scheduler for running tasks at a specific time, in regular intervals or as asynchronous tasks which are triggered by users. &lt;br /&gt;
&lt;br /&gt;
Sahana Eden is mainly implemented using Python, web2py, CSS and foundation. When you open the code in Eclipse, you can see that web2py is very much like Ruby on Rails. Analyze the screenshots below-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: workspace.png]][[File: workspace2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Our focus is on Controllers, Models, Modules and views. For every action on various pages on Sahana Humanitarian website, there are set of controllers defined. As mentioned above, we want to focus on 4 models- health, transport, water and school.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef Key&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef value (number)&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; OSM tag&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;amenity=hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;source=UNICEF&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ID&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; WPT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; FOSA_CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAT_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LONG_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PAYS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PREF, SOUS_PREF, COMM, VILLE_VILL, QUARTIER&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;addrːfull=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VILLE_VILL&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;addr:city=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; POP_VILLE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Public (306)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;operator:type=government&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Prive (37)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;private&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Poste de sante (204)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=dispensary&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Centre de sante (with beds) (118)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=health_center&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital prefectoral (7)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=prefectoral_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital regional (3)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:typeregional_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Clinique privee (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=private_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No attribut (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not to upload&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NOM_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;name=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_LITS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-179&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;capacity:beds=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_SO&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PATIENT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; COMITE_WAS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_WA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LTA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP_PLEIN&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LATRINES_S&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAVE_MAINS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; INCINERATE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; BAC_A_ORDU&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TOTAL_LATR&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-23&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;toilets:number=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==System Architecture==&lt;br /&gt;
The basic Sahana Eden architecture is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: 1px dotted rgb(0, 0, 0); border-collapse: collapse;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Server&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Apache&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Other web servers can also be used, such as Cherokee.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Application&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Sahana Eden&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Application Framework&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Web2Py&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Programming Language&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Python &amp;amp;amp; Java Script&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Database&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;MySQL, PostgreSQL, or SQLite&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;p&amp;gt;MySQL, PostgreSQL, and SQLite are supported.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Other databases should be usable without major additional work since Web2Py supplies many connectors.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Operating System&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Linux (Debian recommended)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Windows and Mac OS X are possible, but only recommended for single-user environments.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirement Analysis==&lt;br /&gt;
&lt;br /&gt;
The requirements state that some of the data needs new models. Also, the school database states that there is no module for education. Even on the [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education education website] of Central African Republic, it says that the data is incomplete. Addition of new module, say edu.py in s3db module, will solve this problem.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project, we will need to follow these steps-&lt;br /&gt;
&lt;br /&gt;
1. Installation and setup- Follow the installation guidelines provided by Sahana to build the system on individual machines. Then, do the setup for Git repository, i.e. forking Sahana eden repo and adding the original as remote branch.&lt;br /&gt;
&lt;br /&gt;
2. Identify properties for &amp;quot;edu.py&amp;quot; and define the basic data model in the models/ folder.&lt;br /&gt;
&lt;br /&gt;
3. Add corresponding controller which provides access to this resource. Create another new file, this time in the controllers/ folder.&lt;br /&gt;
&lt;br /&gt;
4. Define Field Types- By default fields are created with type string, however we may wish to use other data types. All fields have both client-side widgets &amp;amp; server-side validation automatically added based on their data type. &lt;br /&gt;
&lt;br /&gt;
5. Customize and Internationalize field labels- Field labels are automatically generated from the field names, however we are able to customize these by adding a 'label' attribute. &lt;br /&gt;
&lt;br /&gt;
6. Add Links to other Resources.&lt;br /&gt;
&lt;br /&gt;
7. Override default CRUD Strings.&lt;br /&gt;
&lt;br /&gt;
8. Update the Menus- There are two levels of menu within the system: The top-level 'Modules Menu' is visible in all modules. Underneath that, each module has its own menu for for module-specific navigation.&lt;br /&gt;
&lt;br /&gt;
9. Test the changes.&lt;br /&gt;
&lt;br /&gt;
=== GIS Requirements === &lt;br /&gt;
==== Understanding OpenLayers &amp;amp; GeoExt ====&lt;br /&gt;
OpenLayers is an open source, client side JavaScript library for making interactive web maps, viewable in nearly any web browser. Since it is a client side library, it requires no special server side so beware or settings—you can use it without even downloading anything.Originally developed by Metacarta, as a response, in part, to Google Maps, it has grown into a mature, popular framework with many passionate developers and a very helpful community.&lt;br /&gt;
*OpenLayers.Map&lt;br /&gt;
Here is an example that will create a page containing a full screen OpenLayers map. This is not the most basic of maps, but will work if you copy and paste the html content.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &lt;br /&gt;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;EN&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;style&amp;gt;&lt;br /&gt;
    html,body {&lt;br /&gt;
     height: 99%;&lt;br /&gt;
     width: 99%;&lt;br /&gt;
     }&lt;br /&gt;
    #map {&lt;br /&gt;
     width: 100%;&lt;br /&gt;
     height: 100%;&lt;br /&gt;
     border: 1px solid black;&lt;br /&gt;
     }	&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;script src='http://openlayers.org/api/OpenLayers.js'&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt; div id=&amp;quot;map&amp;quot;&amp;gt;&amp;lt;/ div&amp;gt;&lt;br /&gt;
      &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
       var map = new OpenLayers.Map('map',{maxResolution: 0.703125} );&lt;br /&gt;
       var wmscURL = [&lt;br /&gt;
        &amp;quot;http://wmsc1.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc2.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc3.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc4.terrapages.net/getmap?&amp;quot;&lt;br /&gt;
         ];&lt;br /&gt;
       var terrapagesStreetLayer = new OpenLayers.Layer.WMS( 'TerraPages Street',wmscURL, {layers: 'UnprojectedStreet', format: 'image/jpeg' }, {buffer: 1, isBaseLayer: true} );&lt;br /&gt;
       map.addLayer(terrapagesStreetLayer);&lt;br /&gt;
       map.zoomToMaxExtent();		&lt;br /&gt;
      &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*OpenLayers.Layer.Markers&lt;br /&gt;
&lt;br /&gt;
Below is an example of how to create a Markers Layer, and add a single marker on that layer at the specified lon and lat. This will also apply an offest to the icon image, so that it can be aligned horizontally centered, vertically bottom over the position.&lt;br /&gt;
&lt;br /&gt;
  var markersLayer = new OpenLayers.Layer.Markers(&amp;quot;My Marker Layer&amp;quot;);&lt;br /&gt;
  var iconSize =  new OpenLayers.Size(20,20);&lt;br /&gt;
  var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);&lt;br /&gt;
  var marker = new OpenLayers.Marker(&lt;br /&gt;
  new OpenLayers.LonLat(&amp;lt;&amp;lt;lon&amp;gt;&amp;gt;,&amp;lt;&amp;lt;lat&amp;gt;&amp;gt;),&lt;br /&gt;
  new OpenLayers.Icon(&amp;lt;&amp;lt;iconURL&amp;gt;&amp;gt;,iconSize,iconOffset)&lt;br /&gt;
  );&lt;br /&gt;
  markersLayer.setVisibility(true);&lt;br /&gt;
  markersLayer.addMarker(marker);&lt;br /&gt;
  map.addLayer(markersLayer);&lt;br /&gt;
&lt;br /&gt;
==== Add layers to the map ====&lt;br /&gt;
Sahana Eden makes use of Openlayers and GeoExt for its GIS module. A map is basically a combination of several stitched tiles which are rendered on the web page upon request. The overall map functionalities include displaying various hospital types, locations, heliports and other map related data.We are focusing on adding a new overlay layer to the existing map layers and as well using a customised image icon for displaying marker symbol for our overlay layer.&lt;br /&gt;
&lt;br /&gt;
[[File:Map-screen.png]]&lt;br /&gt;
&lt;br /&gt;
==Design Principles==&lt;br /&gt;
&lt;br /&gt;
For our project, the best design principle applicable is &amp;quot;Open Close Principle&amp;quot;. Since we are introducing a new module, there will definitely be extensions to it, but very few modifications.&lt;br /&gt;
&lt;br /&gt;
The common features/functions will be encapsulated to ensure that the code is &amp;quot;DRY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Further, we have followed the MVC(Model-View-Controller) architectural pattern to separate applications concerns.&lt;br /&gt;
&lt;br /&gt;
Model - Model represents an object carrying data. It can also have logic to update controller if its data changes.&lt;br /&gt;
&lt;br /&gt;
View - View represents the visualization of the data that model contains.&lt;br /&gt;
&lt;br /&gt;
Controller - Controller acts on both Model and view. It controls the data flow into model object and updates the view whenever data changes. It keeps View and Model separate.&lt;br /&gt;
&lt;br /&gt;
==Proposed Test Cases==&lt;br /&gt;
&lt;br /&gt;
For end-user performance gains, Sahana Eden minimizes and compresses the CSS and JavaScript. While this approach works well for optimized end-user performance, to debug the CSS and JavaScript we shall enable debug mode in models/000_config.py  in our Sahana Eden server with the following setting:&lt;br /&gt;
&lt;br /&gt;
  settings.base.debug = True&lt;br /&gt;
&lt;br /&gt;
Once any changes to the CSS and JavaScript are working, then we can minimizes and compresses the CSS and JavaScript using:&lt;br /&gt;
&lt;br /&gt;
  static/scripts/tools/build.sahana.py&lt;br /&gt;
&lt;br /&gt;
Although this uses a web service, you get better results by downloading a local version of the Closure Compiler (a tool for making JavaScript download and run faster) to static/scripts/tools. It is also possible to quickly view a single page in debug mode by adding the ?debug=1 variable to the end of a URL.&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
[https://groups.google.com/forum/#!forum/sahana-eden Public Google Forum to discuss any development issues]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/sahana-launches-eurosha-humanitarian-data-site/ Sahana Launches EUROSHA Humanitarian Data Site]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/eurosha-volunteer-diary/ A EUROSHA Volunteer Diary]&lt;br /&gt;
&lt;br /&gt;
[http://en.flossmanuals.net/sahana-eden/user-stories/ User stories]&lt;br /&gt;
&lt;br /&gt;
[http://www.un.org/apps/news/story.asp?NewsID=49300#.VGLHHo_wbK8 Central African Republic: UN urges support to meet basic needs in hard-hit province]&lt;br /&gt;
&lt;br /&gt;
[https://www.packtpub.com/books/content/what-openlayers OpenLayers]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Central_African_Republic Wiki Page]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=VoQAxQgevEA War in the Central African Republic (Full Length Documentary)]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92557</id>
		<title>CSC/ECE 517 Fall 2014/final S1455</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92557"/>
		<updated>2014-12-16T17:20:30Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Design Principles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please read the &amp;quot;README&amp;quot; file provided in expertiza. This wiki page contains design details for the project for Sahana Eden Humanitarian Platform, on their Central African Republic deployment.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:{{{align|right}}}&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |[[File:SahanaLogo.png|center|Sahana]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
== Background Information ==&lt;br /&gt;
====About Sahana Eden====&lt;br /&gt;
Sahana Eden is an Open Source Humanitarian Platform, which can be used to provide solutions for Disaster Management, Development, and Environmental Management sectors. It is supported by the  Sahana Software Foundation, Used in many Deployments, such as Ebola, Kashmir Floods, Hurricane Sandy, just to name a few. It is highly configurable so that it can be used in a wide variety of different contexts and is easy to modify to build custom solutions. Different levels of support are available from both the voluntary Sahana Eden community and professional companies. Sahana focuses on Community and Professional Support.&lt;br /&gt;
&lt;br /&gt;
====Getting to know the domain====&lt;br /&gt;
&lt;br /&gt;
Their [http://eden.sahanafoundation.org/wiki/Domain domain] page elaborately describes various major management projects and deployments that are done in the past or are ongoing. Spending some time to understand goals and purposes of Sahana before starting with actual development might help making the code better and more sensible from Sahana's perspective.&lt;br /&gt;
&lt;br /&gt;
====Installation &amp;amp; tutorials====&lt;br /&gt;
&lt;br /&gt;
Anyone who wishes to contribute their development skill to Sahana, can do so with the help of an elaborate guide they have provided, that covers everything from [http://eden.sahanafoundation.org/wiki/InstallationGuidelines installation] to [http://eden.sahanafoundation.org/wiki/Book tutorials] on Python. Once the installations are complete, you can simply identify a task you are interested in, and start working on it. You may also want to sign their [https://docs.google.com/a/ncsu.edu/spreadsheet/viewform?formkey=dEp5czdPYThPY2htX2pNM1JGaTBrRGc6MQ#gid=0 Contributor's License Agreement] before making any pull request.&lt;br /&gt;
&lt;br /&gt;
Below is a high level overview to begin contributing to Sahana-&lt;br /&gt;
&lt;br /&gt;
The code is in the folder: web2py/applications/eden&lt;br /&gt;
&lt;br /&gt;
Inside that folder are folders for Models (define the data structure), Controllers (provide URLs to enable access to the data) &amp;amp; Views (HTML templates).&lt;br /&gt;
&lt;br /&gt;
Each module within Sahana Eden will normally consist of one of each of these files:&lt;br /&gt;
&lt;br /&gt;
    Model: modules/s3db/modulename.py&lt;br /&gt;
    Controller: controllers/modulename.py&lt;br /&gt;
    View: views/modulename/index.html&lt;br /&gt;
&lt;br /&gt;
In order to know which file to edit in order to change a particular function, you need to look at the URL. The Web2Py web framework maps URLs as follows:&lt;br /&gt;
&lt;br /&gt;
    http://host/application/controller/function&lt;br /&gt;
&lt;br /&gt;
So, if you want to edit the Home page with the URL:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/default/index&lt;br /&gt;
&lt;br /&gt;
This implies that you should look at the file eden/controllers/default.py and the index function within it which can be found by searching for the function title &amp;quot;def index():&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Tip: Sahana Eden makes heavy use of integrated resource controllers so the typical mapping is:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/module/resource&lt;br /&gt;
&lt;br /&gt;
The resource refers to a table with the name module_resource in the file modules/s3db/&amp;lt;module&amp;gt;.py&lt;br /&gt;
&lt;br /&gt;
==Introduction to project==&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
In the Central African Republic page, some data needs new models, and some models need tweaking. The purpose of this project is to identify any such requirement and make necessary changes. The general steps to follow in Sahana development are mentioned below-&lt;br /&gt;
&lt;br /&gt;
1. Add/modify the core models in modules/s3db&lt;br /&gt;
&lt;br /&gt;
2. Add REST controllers for new models&lt;br /&gt;
&lt;br /&gt;
3. Check basic operations using automatic CRUD interface- tweak list_fields to the most-relevant fields perhaps &lt;br /&gt;
&lt;br /&gt;
4. Add menu entries (modules/s3menus.py)&lt;br /&gt;
&lt;br /&gt;
5. Develop XSLT &amp;amp; CSV templates (static/formats/s3csv) to bulk import the data&lt;br /&gt;
&lt;br /&gt;
6. Convert the data to these CSV templates- use ogr2ogr for this &lt;br /&gt;
&lt;br /&gt;
7. Add layers to the map (private/templates/&amp;lt;TEMPLATE&amp;gt;/gis_layer_feature.csv. Look at default for now) including Markers and tooltips (popup_format)&lt;br /&gt;
&lt;br /&gt;
8. Provide some report_options to make a meaningful report&lt;br /&gt;
&lt;br /&gt;
====Scope====&lt;br /&gt;
Four modules related to this deployment are-&lt;br /&gt;
&lt;br /&gt;
1. Health - modules/s3db/hms.py&lt;br /&gt;
&lt;br /&gt;
2. Transport - modules/s3db/transport.py&lt;br /&gt;
&lt;br /&gt;
3. Water - modules/s3db/water.py&lt;br /&gt;
&lt;br /&gt;
4. School - There is no separate module for education.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We took up the Health module and worked on the Magnu template of Sahana. The key point for the core module is to ensure that we can capture all of the data that is available. There was a need to hide some of this complexity from the Magnu template which is used by CAR.&lt;br /&gt;
&lt;br /&gt;
- Currently, Sahana is keen to show people how it could be used. &lt;br /&gt;
&lt;br /&gt;
- An approach to this is to add one or two deployment_setting to be able to easily switch on/off chunks of functionality like this without needing to resort to custom code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another thing on a to-do list is adding markers to hospital overlay, and making them vary by type of hospital.&lt;br /&gt;
&lt;br /&gt;
====Reference Material====&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-health Hospital Model]&lt;br /&gt;
&lt;br /&gt;
[http://geonode.wfp.org/layers/geonode:wld_poi_bcp_wfp Border Control Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-roads Roads], [http://geonode.wfp.org/layers/geonode:wld_trs_supplyroutes_wfp Routes], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-aerodromes-airports-airfields Airports]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies Water Bodies], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies-0 Water Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-courses Rivers]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education Education]&lt;br /&gt;
&lt;br /&gt;
==System Overview==&lt;br /&gt;
&lt;br /&gt;
Sahana Eden Framework:&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Software Platform has been built around a Rapid Application Development (RAD) Framework. This provides a high level of automation to ensure that new solutions can be quickly and effectively developed. Once a database table is defined, the Sahana Eden Framework automatically generates HTML pages to handle CRUD (Create, Read, Update, Delete) as well as Search, Map and Pivot Reports. Web Services are available to import and export in XML, CSV, JSON and EXtensible Stylesheet Language (XSL) transforms are supported to produce other data standards.&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Framework has flexible authorization policies which can be configured to grant permissions for different modules, tables as well as the ability to have multiple Organizations control their own data on a single Sahana Eden installation.&lt;br /&gt;
&lt;br /&gt;
Sahana Eden can be downloaded and run locally from a flash drive. Synchronization functionality allows data to be entered then keep up to date between different installations, including online servers and local flash drive installations. The Sahana Eden Framework also includes a scheduler for running tasks at a specific time, in regular intervals or as asynchronous tasks which are triggered by users. &lt;br /&gt;
&lt;br /&gt;
Sahana Eden is mainly implemented using Python, web2py, CSS and foundation. When you open the code in Eclipse, you can see that web2py is very much like Ruby on Rails. Analyze the screenshots below-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: workspace.png]][[File: workspace2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Our focus is on Controllers, Models, Modules and views. For every action on various pages on Sahana Humanitarian website, there are set of controllers defined. As mentioned above, we want to focus on 4 models- health, transport, water and school.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef Key&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef value (number)&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; OSM tag&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;amenity=hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;source=UNICEF&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ID&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; WPT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; FOSA_CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAT_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LONG_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PAYS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PREF, SOUS_PREF, COMM, VILLE_VILL, QUARTIER&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;addrːfull=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VILLE_VILL&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;addr:city=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; POP_VILLE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Public (306)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;operator:type=government&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Prive (37)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;private&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Poste de sante (204)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=dispensary&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Centre de sante (with beds) (118)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=health_center&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital prefectoral (7)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=prefectoral_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital regional (3)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:typeregional_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Clinique privee (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=private_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No attribut (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not to upload&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NOM_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;name=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_LITS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-179&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;capacity:beds=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_SO&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PATIENT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; COMITE_WAS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_WA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LTA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP_PLEIN&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LATRINES_S&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAVE_MAINS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; INCINERATE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; BAC_A_ORDU&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TOTAL_LATR&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-23&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;toilets:number=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==System Architecture==&lt;br /&gt;
The basic Sahana Eden architecture is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: 1px dotted rgb(0, 0, 0); border-collapse: collapse;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Server&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Apache&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Other web servers can also be used, such as Cherokee.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Application&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Sahana Eden&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Application Framework&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Web2Py&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Programming Language&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Python &amp;amp;amp; Java Script&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Database&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;MySQL, PostgreSQL, or SQLite&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;p&amp;gt;MySQL, PostgreSQL, and SQLite are supported.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Other databases should be usable without major additional work since Web2Py supplies many connectors.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Operating System&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Linux (Debian recommended)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Windows and Mac OS X are possible, but only recommended for single-user environments.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirement Analysis==&lt;br /&gt;
&lt;br /&gt;
The requirements state that some of the data needs new models. Also, the school database states that there is no module for education. Even on the [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education education website] of Central African Republic, it says that the data is incomplete. Addition of new module, say edu.py in s3db module, will solve this problem.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project, we will need to follow these steps-&lt;br /&gt;
&lt;br /&gt;
1. Installation and setup- Follow the installation guidelines provided by Sahana to build the system on individual machines. Then, do the setup for Git repository, i.e. forking Sahana eden repo and adding the original as remote branch.&lt;br /&gt;
&lt;br /&gt;
2. Identify properties for &amp;quot;edu.py&amp;quot; and define the basic data model in the models/ folder.&lt;br /&gt;
&lt;br /&gt;
3. Add corresponding controller which provides access to this resource. Create another new file, this time in the controllers/ folder.&lt;br /&gt;
&lt;br /&gt;
4. Define Field Types- By default fields are created with type string, however we may wish to use other data types. All fields have both client-side widgets &amp;amp; server-side validation automatically added based on their data type. &lt;br /&gt;
&lt;br /&gt;
5. Customize and Internationalize field labels- Field labels are automatically generated from the field names, however we are able to customize these by adding a 'label' attribute. &lt;br /&gt;
&lt;br /&gt;
6. Add Links to other Resources.&lt;br /&gt;
&lt;br /&gt;
7. Override default CRUD Strings.&lt;br /&gt;
&lt;br /&gt;
8. Update the Menus- There are two levels of menu within the system: The top-level 'Modules Menu' is visible in all modules. Underneath that, each module has its own menu for for module-specific navigation.&lt;br /&gt;
&lt;br /&gt;
9. Test the changes.&lt;br /&gt;
&lt;br /&gt;
=== GIS Requirements === &lt;br /&gt;
==== Understanding OpenLayers &amp;amp; GeoExt ====&lt;br /&gt;
OpenLayers is an open source, client side JavaScript library for making interactive web maps, viewable in nearly any web browser. Since it is a client side library, it requires no special server side so beware or settings—you can use it without even downloading anything.Originally developed by Metacarta, as a response, in part, to Google Maps, it has grown into a mature, popular framework with many passionate developers and a very helpful community.&lt;br /&gt;
*OpenLayers.Map&lt;br /&gt;
Here is an example that will create a page containing a full screen OpenLayers map. This is not the most basic of maps, but will work if you copy and paste the html content.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &lt;br /&gt;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;EN&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;style&amp;gt;&lt;br /&gt;
    html,body {&lt;br /&gt;
     height: 99%;&lt;br /&gt;
     width: 99%;&lt;br /&gt;
     }&lt;br /&gt;
    #map {&lt;br /&gt;
     width: 100%;&lt;br /&gt;
     height: 100%;&lt;br /&gt;
     border: 1px solid black;&lt;br /&gt;
     }	&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;script src='http://openlayers.org/api/OpenLayers.js'&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt; div id=&amp;quot;map&amp;quot;&amp;gt;&amp;lt;/ div&amp;gt;&lt;br /&gt;
      &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
       var map = new OpenLayers.Map('map',{maxResolution: 0.703125} );&lt;br /&gt;
       var wmscURL = [&lt;br /&gt;
        &amp;quot;http://wmsc1.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc2.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc3.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc4.terrapages.net/getmap?&amp;quot;&lt;br /&gt;
         ];&lt;br /&gt;
       var terrapagesStreetLayer = new OpenLayers.Layer.WMS( 'TerraPages Street',wmscURL, {layers: 'UnprojectedStreet', format: 'image/jpeg' }, {buffer: 1, isBaseLayer: true} );&lt;br /&gt;
       map.addLayer(terrapagesStreetLayer);&lt;br /&gt;
       map.zoomToMaxExtent();		&lt;br /&gt;
      &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*OpenLayers.Layer.Markers&lt;br /&gt;
&lt;br /&gt;
Below is an example of how to create a Markers Layer, and add a single marker on that layer at the specified lon and lat. This will also apply an offest to the icon image, so that it can be aligned horizontally centered, vertically bottom over the position.&lt;br /&gt;
&lt;br /&gt;
  var markersLayer = new OpenLayers.Layer.Markers(&amp;quot;My Marker Layer&amp;quot;);&lt;br /&gt;
  var iconSize =  new OpenLayers.Size(20,20);&lt;br /&gt;
  var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);&lt;br /&gt;
  var marker = new OpenLayers.Marker(&lt;br /&gt;
  new OpenLayers.LonLat(&amp;lt;&amp;lt;lon&amp;gt;&amp;gt;,&amp;lt;&amp;lt;lat&amp;gt;&amp;gt;),&lt;br /&gt;
  new OpenLayers.Icon(&amp;lt;&amp;lt;iconURL&amp;gt;&amp;gt;,iconSize,iconOffset)&lt;br /&gt;
  );&lt;br /&gt;
  markersLayer.setVisibility(true);&lt;br /&gt;
  markersLayer.addMarker(marker);&lt;br /&gt;
  map.addLayer(markersLayer);&lt;br /&gt;
&lt;br /&gt;
==== Add layers to the map ====&lt;br /&gt;
Sahana Eden makes use of Openlayers and GeoExt for its GIS module. A map is basically a combination of several stitched tiles which are rendered on the web page upon request. The overall map functionalities include displaying various hospital types, locations, heliports and other map related data.We are focusing on adding a new overlay layer to the existing map layers and as well using a customised image icon for displaying marker symbol for our overlay layer.&lt;br /&gt;
&lt;br /&gt;
[[File:Map-screen.png]]&lt;br /&gt;
&lt;br /&gt;
==Design Principles==&lt;br /&gt;
&lt;br /&gt;
For our project, the best design principle applicable is &amp;quot;Open Close Principle&amp;quot;. Since we are introducing a new module, there will definitely be extensions to it, but very few modifications.&lt;br /&gt;
&lt;br /&gt;
The common features/functions will be encapsulated to ensure that the code is &amp;quot;DRY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Further, we have followed the MVC(Model-View-Controller) architectural pattern to separate applications concerns.&lt;br /&gt;
Model - Model represents an object or JAVA POJO carrying data. It can also have logic to update controller if its data changes.&lt;br /&gt;
&lt;br /&gt;
View - View represents the visualization of the data that model contains.&lt;br /&gt;
&lt;br /&gt;
Controller - Controller acts on both Model and view. It controls the data flow into model object and updates the view whenever data changes. It keeps View and Model separate.&lt;br /&gt;
&lt;br /&gt;
==Proposed Test Cases==&lt;br /&gt;
&lt;br /&gt;
For end-user performance gains, Sahana Eden minimizes and compresses the CSS and JavaScript. While this approach works well for optimized end-user performance, to debug the CSS and JavaScript we shall enable debug mode in models/000_config.py  in our Sahana Eden server with the following setting:&lt;br /&gt;
&lt;br /&gt;
  settings.base.debug = True&lt;br /&gt;
&lt;br /&gt;
Once any changes to the CSS and JavaScript are working, then we can minimizes and compresses the CSS and JavaScript using:&lt;br /&gt;
&lt;br /&gt;
  static/scripts/tools/build.sahana.py&lt;br /&gt;
&lt;br /&gt;
Although this uses a web service, you get better results by downloading a local version of the Closure Compiler (a tool for making JavaScript download and run faster) to static/scripts/tools. It is also possible to quickly view a single page in debug mode by adding the ?debug=1 variable to the end of a URL.&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
[https://groups.google.com/forum/#!forum/sahana-eden Public Google Forum to discuss any development issues]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/sahana-launches-eurosha-humanitarian-data-site/ Sahana Launches EUROSHA Humanitarian Data Site]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/eurosha-volunteer-diary/ A EUROSHA Volunteer Diary]&lt;br /&gt;
&lt;br /&gt;
[http://en.flossmanuals.net/sahana-eden/user-stories/ User stories]&lt;br /&gt;
&lt;br /&gt;
[http://www.un.org/apps/news/story.asp?NewsID=49300#.VGLHHo_wbK8 Central African Republic: UN urges support to meet basic needs in hard-hit province]&lt;br /&gt;
&lt;br /&gt;
[https://www.packtpub.com/books/content/what-openlayers OpenLayers]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Central_African_Republic Wiki Page]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=VoQAxQgevEA War in the Central African Republic (Full Length Documentary)]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92556</id>
		<title>CSC/ECE 517 Fall 2014/final S1455</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92556"/>
		<updated>2014-12-16T04:51:37Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* System Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please read the &amp;quot;README&amp;quot; file provided in expertiza. This wiki page contains design details for the project for Sahana Eden Humanitarian Platform, on their Central African Republic deployment.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:{{{align|right}}}&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |[[File:SahanaLogo.png|center|Sahana]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
== Background Information ==&lt;br /&gt;
====About Sahana Eden====&lt;br /&gt;
Sahana Eden is an Open Source Humanitarian Platform, which can be used to provide solutions for Disaster Management, Development, and Environmental Management sectors. It is supported by the  Sahana Software Foundation, Used in many Deployments, such as Ebola, Kashmir Floods, Hurricane Sandy, just to name a few. It is highly configurable so that it can be used in a wide variety of different contexts and is easy to modify to build custom solutions. Different levels of support are available from both the voluntary Sahana Eden community and professional companies. Sahana focuses on Community and Professional Support.&lt;br /&gt;
&lt;br /&gt;
====Getting to know the domain====&lt;br /&gt;
&lt;br /&gt;
Their [http://eden.sahanafoundation.org/wiki/Domain domain] page elaborately describes various major management projects and deployments that are done in the past or are ongoing. Spending some time to understand goals and purposes of Sahana before starting with actual development might help making the code better and more sensible from Sahana's perspective.&lt;br /&gt;
&lt;br /&gt;
====Installation &amp;amp; tutorials====&lt;br /&gt;
&lt;br /&gt;
Anyone who wishes to contribute their development skill to Sahana, can do so with the help of an elaborate guide they have provided, that covers everything from [http://eden.sahanafoundation.org/wiki/InstallationGuidelines installation] to [http://eden.sahanafoundation.org/wiki/Book tutorials] on Python. Once the installations are complete, you can simply identify a task you are interested in, and start working on it. You may also want to sign their [https://docs.google.com/a/ncsu.edu/spreadsheet/viewform?formkey=dEp5czdPYThPY2htX2pNM1JGaTBrRGc6MQ#gid=0 Contributor's License Agreement] before making any pull request.&lt;br /&gt;
&lt;br /&gt;
Below is a high level overview to begin contributing to Sahana-&lt;br /&gt;
&lt;br /&gt;
The code is in the folder: web2py/applications/eden&lt;br /&gt;
&lt;br /&gt;
Inside that folder are folders for Models (define the data structure), Controllers (provide URLs to enable access to the data) &amp;amp; Views (HTML templates).&lt;br /&gt;
&lt;br /&gt;
Each module within Sahana Eden will normally consist of one of each of these files:&lt;br /&gt;
&lt;br /&gt;
    Model: modules/s3db/modulename.py&lt;br /&gt;
    Controller: controllers/modulename.py&lt;br /&gt;
    View: views/modulename/index.html&lt;br /&gt;
&lt;br /&gt;
In order to know which file to edit in order to change a particular function, you need to look at the URL. The Web2Py web framework maps URLs as follows:&lt;br /&gt;
&lt;br /&gt;
    http://host/application/controller/function&lt;br /&gt;
&lt;br /&gt;
So, if you want to edit the Home page with the URL:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/default/index&lt;br /&gt;
&lt;br /&gt;
This implies that you should look at the file eden/controllers/default.py and the index function within it which can be found by searching for the function title &amp;quot;def index():&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Tip: Sahana Eden makes heavy use of integrated resource controllers so the typical mapping is:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/module/resource&lt;br /&gt;
&lt;br /&gt;
The resource refers to a table with the name module_resource in the file modules/s3db/&amp;lt;module&amp;gt;.py&lt;br /&gt;
&lt;br /&gt;
==Introduction to project==&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
In the Central African Republic page, some data needs new models, and some models need tweaking. The purpose of this project is to identify any such requirement and make necessary changes. The general steps to follow in Sahana development are mentioned below-&lt;br /&gt;
&lt;br /&gt;
1. Add/modify the core models in modules/s3db&lt;br /&gt;
&lt;br /&gt;
2. Add REST controllers for new models&lt;br /&gt;
&lt;br /&gt;
3. Check basic operations using automatic CRUD interface- tweak list_fields to the most-relevant fields perhaps &lt;br /&gt;
&lt;br /&gt;
4. Add menu entries (modules/s3menus.py)&lt;br /&gt;
&lt;br /&gt;
5. Develop XSLT &amp;amp; CSV templates (static/formats/s3csv) to bulk import the data&lt;br /&gt;
&lt;br /&gt;
6. Convert the data to these CSV templates- use ogr2ogr for this &lt;br /&gt;
&lt;br /&gt;
7. Add layers to the map (private/templates/&amp;lt;TEMPLATE&amp;gt;/gis_layer_feature.csv. Look at default for now) including Markers and tooltips (popup_format)&lt;br /&gt;
&lt;br /&gt;
8. Provide some report_options to make a meaningful report&lt;br /&gt;
&lt;br /&gt;
====Scope====&lt;br /&gt;
Four modules related to this deployment are-&lt;br /&gt;
&lt;br /&gt;
1. Health - modules/s3db/hms.py&lt;br /&gt;
&lt;br /&gt;
2. Transport - modules/s3db/transport.py&lt;br /&gt;
&lt;br /&gt;
3. Water - modules/s3db/water.py&lt;br /&gt;
&lt;br /&gt;
4. School - There is no separate module for education.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We took up the Health module and worked on the Magnu template of Sahana. The key point for the core module is to ensure that we can capture all of the data that is available. There was a need to hide some of this complexity from the Magnu template which is used by CAR.&lt;br /&gt;
&lt;br /&gt;
- Currently, Sahana is keen to show people how it could be used. &lt;br /&gt;
&lt;br /&gt;
- An approach to this is to add one or two deployment_setting to be able to easily switch on/off chunks of functionality like this without needing to resort to custom code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another thing on a to-do list is adding markers to hospital overlay, and making them vary by type of hospital.&lt;br /&gt;
&lt;br /&gt;
====Reference Material====&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-health Hospital Model]&lt;br /&gt;
&lt;br /&gt;
[http://geonode.wfp.org/layers/geonode:wld_poi_bcp_wfp Border Control Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-roads Roads], [http://geonode.wfp.org/layers/geonode:wld_trs_supplyroutes_wfp Routes], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-aerodromes-airports-airfields Airports]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies Water Bodies], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies-0 Water Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-courses Rivers]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education Education]&lt;br /&gt;
&lt;br /&gt;
==System Overview==&lt;br /&gt;
&lt;br /&gt;
Sahana Eden Framework:&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Software Platform has been built around a Rapid Application Development (RAD) Framework. This provides a high level of automation to ensure that new solutions can be quickly and effectively developed. Once a database table is defined, the Sahana Eden Framework automatically generates HTML pages to handle CRUD (Create, Read, Update, Delete) as well as Search, Map and Pivot Reports. Web Services are available to import and export in XML, CSV, JSON and EXtensible Stylesheet Language (XSL) transforms are supported to produce other data standards.&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Framework has flexible authorization policies which can be configured to grant permissions for different modules, tables as well as the ability to have multiple Organizations control their own data on a single Sahana Eden installation.&lt;br /&gt;
&lt;br /&gt;
Sahana Eden can be downloaded and run locally from a flash drive. Synchronization functionality allows data to be entered then keep up to date between different installations, including online servers and local flash drive installations. The Sahana Eden Framework also includes a scheduler for running tasks at a specific time, in regular intervals or as asynchronous tasks which are triggered by users. &lt;br /&gt;
&lt;br /&gt;
Sahana Eden is mainly implemented using Python, web2py, CSS and foundation. When you open the code in Eclipse, you can see that web2py is very much like Ruby on Rails. Analyze the screenshots below-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: workspace.png]][[File: workspace2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Our focus is on Controllers, Models, Modules and views. For every action on various pages on Sahana Humanitarian website, there are set of controllers defined. As mentioned above, we want to focus on 4 models- health, transport, water and school.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef Key&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef value (number)&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; OSM tag&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;amenity=hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;source=UNICEF&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ID&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; WPT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; FOSA_CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAT_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LONG_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PAYS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PREF, SOUS_PREF, COMM, VILLE_VILL, QUARTIER&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;addrːfull=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VILLE_VILL&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;addr:city=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; POP_VILLE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Public (306)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;operator:type=government&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Prive (37)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;private&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Poste de sante (204)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=dispensary&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Centre de sante (with beds) (118)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=health_center&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital prefectoral (7)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=prefectoral_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital regional (3)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:typeregional_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Clinique privee (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;health_facility:type=private_hospital&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No attribut (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not to upload&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NOM_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;name=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_LITS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-179&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;capacity:beds=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_SO&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PATIENT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; COMITE_WAS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_WA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LTA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP_PLEIN&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LATRINES_S&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAVE_MAINS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; INCINERATE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; BAC_A_ORDU&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TOTAL_LATR&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-23&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;toilets:number=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==System Architecture==&lt;br /&gt;
The basic Sahana Eden architecture is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: 1px dotted rgb(0, 0, 0); border-collapse: collapse;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Server&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Apache&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Other web servers can also be used, such as Cherokee.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Application&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Sahana Eden&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Application Framework&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Web2Py&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Programming Language&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Python &amp;amp;amp; Java Script&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Database&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;MySQL, PostgreSQL, or SQLite&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;p&amp;gt;MySQL, PostgreSQL, and SQLite are supported.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Other databases should be usable without major additional work since Web2Py supplies many connectors.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Operating System&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Linux (Debian recommended)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Windows and Mac OS X are possible, but only recommended for single-user environments.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirement Analysis==&lt;br /&gt;
&lt;br /&gt;
The requirements state that some of the data needs new models. Also, the school database states that there is no module for education. Even on the [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education education website] of Central African Republic, it says that the data is incomplete. Addition of new module, say edu.py in s3db module, will solve this problem.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project, we will need to follow these steps-&lt;br /&gt;
&lt;br /&gt;
1. Installation and setup- Follow the installation guidelines provided by Sahana to build the system on individual machines. Then, do the setup for Git repository, i.e. forking Sahana eden repo and adding the original as remote branch.&lt;br /&gt;
&lt;br /&gt;
2. Identify properties for &amp;quot;edu.py&amp;quot; and define the basic data model in the models/ folder.&lt;br /&gt;
&lt;br /&gt;
3. Add corresponding controller which provides access to this resource. Create another new file, this time in the controllers/ folder.&lt;br /&gt;
&lt;br /&gt;
4. Define Field Types- By default fields are created with type string, however we may wish to use other data types. All fields have both client-side widgets &amp;amp; server-side validation automatically added based on their data type. &lt;br /&gt;
&lt;br /&gt;
5. Customize and Internationalize field labels- Field labels are automatically generated from the field names, however we are able to customize these by adding a 'label' attribute. &lt;br /&gt;
&lt;br /&gt;
6. Add Links to other Resources.&lt;br /&gt;
&lt;br /&gt;
7. Override default CRUD Strings.&lt;br /&gt;
&lt;br /&gt;
8. Update the Menus- There are two levels of menu within the system: The top-level 'Modules Menu' is visible in all modules. Underneath that, each module has its own menu for for module-specific navigation.&lt;br /&gt;
&lt;br /&gt;
9. Test the changes.&lt;br /&gt;
&lt;br /&gt;
=== GIS Requirements === &lt;br /&gt;
==== Understanding OpenLayers &amp;amp; GeoExt ====&lt;br /&gt;
OpenLayers is an open source, client side JavaScript library for making interactive web maps, viewable in nearly any web browser. Since it is a client side library, it requires no special server side so beware or settings—you can use it without even downloading anything.Originally developed by Metacarta, as a response, in part, to Google Maps, it has grown into a mature, popular framework with many passionate developers and a very helpful community.&lt;br /&gt;
*OpenLayers.Map&lt;br /&gt;
Here is an example that will create a page containing a full screen OpenLayers map. This is not the most basic of maps, but will work if you copy and paste the html content.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &lt;br /&gt;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;EN&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;style&amp;gt;&lt;br /&gt;
    html,body {&lt;br /&gt;
     height: 99%;&lt;br /&gt;
     width: 99%;&lt;br /&gt;
     }&lt;br /&gt;
    #map {&lt;br /&gt;
     width: 100%;&lt;br /&gt;
     height: 100%;&lt;br /&gt;
     border: 1px solid black;&lt;br /&gt;
     }	&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;script src='http://openlayers.org/api/OpenLayers.js'&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt; div id=&amp;quot;map&amp;quot;&amp;gt;&amp;lt;/ div&amp;gt;&lt;br /&gt;
      &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
       var map = new OpenLayers.Map('map',{maxResolution: 0.703125} );&lt;br /&gt;
       var wmscURL = [&lt;br /&gt;
        &amp;quot;http://wmsc1.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc2.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc3.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc4.terrapages.net/getmap?&amp;quot;&lt;br /&gt;
         ];&lt;br /&gt;
       var terrapagesStreetLayer = new OpenLayers.Layer.WMS( 'TerraPages Street',wmscURL, {layers: 'UnprojectedStreet', format: 'image/jpeg' }, {buffer: 1, isBaseLayer: true} );&lt;br /&gt;
       map.addLayer(terrapagesStreetLayer);&lt;br /&gt;
       map.zoomToMaxExtent();		&lt;br /&gt;
      &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*OpenLayers.Layer.Markers&lt;br /&gt;
&lt;br /&gt;
Below is an example of how to create a Markers Layer, and add a single marker on that layer at the specified lon and lat. This will also apply an offest to the icon image, so that it can be aligned horizontally centered, vertically bottom over the position.&lt;br /&gt;
&lt;br /&gt;
  var markersLayer = new OpenLayers.Layer.Markers(&amp;quot;My Marker Layer&amp;quot;);&lt;br /&gt;
  var iconSize =  new OpenLayers.Size(20,20);&lt;br /&gt;
  var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);&lt;br /&gt;
  var marker = new OpenLayers.Marker(&lt;br /&gt;
  new OpenLayers.LonLat(&amp;lt;&amp;lt;lon&amp;gt;&amp;gt;,&amp;lt;&amp;lt;lat&amp;gt;&amp;gt;),&lt;br /&gt;
  new OpenLayers.Icon(&amp;lt;&amp;lt;iconURL&amp;gt;&amp;gt;,iconSize,iconOffset)&lt;br /&gt;
  );&lt;br /&gt;
  markersLayer.setVisibility(true);&lt;br /&gt;
  markersLayer.addMarker(marker);&lt;br /&gt;
  map.addLayer(markersLayer);&lt;br /&gt;
&lt;br /&gt;
==== Add layers to the map ====&lt;br /&gt;
Sahana Eden makes use of Openlayers and GeoExt for its GIS module. A map is basically a combination of several stitched tiles which are rendered on the web page upon request. The overall map functionalities include displaying various hospital types, locations, heliports and other map related data.We are focusing on adding a new overlay layer to the existing map layers and as well using a customised image icon for displaying marker symbol for our overlay layer.&lt;br /&gt;
&lt;br /&gt;
[[File:Map-screen.png]]&lt;br /&gt;
&lt;br /&gt;
==Design Principles==&lt;br /&gt;
&lt;br /&gt;
For our project, the best design principle applicable is &amp;quot;Open Close Principle&amp;quot;. Since we are introducing a new module, there will definitely be extensions to it, but very few modifications.&lt;br /&gt;
&lt;br /&gt;
The common features/functions will be encapsulated to ensure that the code is &amp;quot;DRY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Proposed Test Cases==&lt;br /&gt;
&lt;br /&gt;
For end-user performance gains, Sahana Eden minimizes and compresses the CSS and JavaScript. While this approach works well for optimized end-user performance, to debug the CSS and JavaScript we shall enable debug mode in models/000_config.py  in our Sahana Eden server with the following setting:&lt;br /&gt;
&lt;br /&gt;
  settings.base.debug = True&lt;br /&gt;
&lt;br /&gt;
Once any changes to the CSS and JavaScript are working, then we can minimizes and compresses the CSS and JavaScript using:&lt;br /&gt;
&lt;br /&gt;
  static/scripts/tools/build.sahana.py&lt;br /&gt;
&lt;br /&gt;
Although this uses a web service, you get better results by downloading a local version of the Closure Compiler (a tool for making JavaScript download and run faster) to static/scripts/tools. It is also possible to quickly view a single page in debug mode by adding the ?debug=1 variable to the end of a URL.&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
[https://groups.google.com/forum/#!forum/sahana-eden Public Google Forum to discuss any development issues]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/sahana-launches-eurosha-humanitarian-data-site/ Sahana Launches EUROSHA Humanitarian Data Site]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/eurosha-volunteer-diary/ A EUROSHA Volunteer Diary]&lt;br /&gt;
&lt;br /&gt;
[http://en.flossmanuals.net/sahana-eden/user-stories/ User stories]&lt;br /&gt;
&lt;br /&gt;
[http://www.un.org/apps/news/story.asp?NewsID=49300#.VGLHHo_wbK8 Central African Republic: UN urges support to meet basic needs in hard-hit province]&lt;br /&gt;
&lt;br /&gt;
[https://www.packtpub.com/books/content/what-openlayers OpenLayers]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Central_African_Republic Wiki Page]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=VoQAxQgevEA War in the Central African Republic (Full Length Documentary)]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92333</id>
		<title>CSC/ECE 517 Fall 2014/final S1455</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92333"/>
		<updated>2014-12-02T04:59:39Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Further Reading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please read the &amp;quot;README&amp;quot; file provided in expertizza. This wiki page contains design details for the project for Sahana Eden Humanitarian Platform, on their Central African Republic deployment.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:{{{align|right}}}&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |[[File:SahanaLogo.png|center|Sahana]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
== Background Information ==&lt;br /&gt;
====About Sahana Eden====&lt;br /&gt;
Sahana Eden is an Open Source Humanitarian Platform, which can be used to provide solutions for Disaster Management, Development, and Environmental Management sectors. It is supported by the  Sahana Software Foundation, Used in many Deployments, such as Ebola, Kashmir Floods, Hurricane Sandy, just to name a few. It is highly configurable so that it can be used in a wide variety of different contexts and is easy to modify to build custom solutions. Different levels of support are available from both the voluntary Sahana Eden community and professional companies. Sahana focuses on Community and Professional Support.&lt;br /&gt;
&lt;br /&gt;
====Getting to know the domain====&lt;br /&gt;
&lt;br /&gt;
Their [http://eden.sahanafoundation.org/wiki/Domain domain] page elaborately describes various major management projects and deployments that are done in the past or are ongoing. Spending some time to understand goals and purposes of Sahana before starting with actual development might help making the code better and more sensible from Sahana's perspective.&lt;br /&gt;
&lt;br /&gt;
====Installation &amp;amp; tutorials====&lt;br /&gt;
&lt;br /&gt;
Anyone who wishes to contribute their development skill to Sahana, can do so with the help of an elaborate guide they have provided, that covers everything from [http://eden.sahanafoundation.org/wiki/InstallationGuidelines installation] to [http://eden.sahanafoundation.org/wiki/Book tutorials] on Python. Once the installations are complete, you can simply identify a task you are interested in, and start working on it. You may also want to sign their [https://docs.google.com/a/ncsu.edu/spreadsheet/viewform?formkey=dEp5czdPYThPY2htX2pNM1JGaTBrRGc6MQ#gid=0 Contributor's License Agreement] before making any pull request.&lt;br /&gt;
&lt;br /&gt;
Below is a high level overview to begin contributing to Sahana-&lt;br /&gt;
&lt;br /&gt;
The code is in the folder: web2py/applications/eden&lt;br /&gt;
&lt;br /&gt;
Inside that folder are folders for Models (define the data structure), Controllers (provide URLs to enable access to the data) &amp;amp; Views (HTML templates).&lt;br /&gt;
&lt;br /&gt;
Each module within Sahana Eden will normally consist of one of each of these files:&lt;br /&gt;
&lt;br /&gt;
    Model: modules/s3db/modulename.py&lt;br /&gt;
    Controller: controllers/modulename.py&lt;br /&gt;
    View: views/modulename/index.html&lt;br /&gt;
&lt;br /&gt;
In order to know which file to edit in order to change a particular function, you need to look at the URL. The Web2Py web framework maps URLs as follows:&lt;br /&gt;
&lt;br /&gt;
    http://host/application/controller/function&lt;br /&gt;
&lt;br /&gt;
So, if you want to edit the Home page with the URL:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/default/index&lt;br /&gt;
&lt;br /&gt;
This implies that you should look at the file eden/controllers/default.py and the index function within it which can be found by searching for the function title &amp;quot;def index():&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Tip: Sahana Eden makes heavy use of integrated resource controllers so the typical mapping is:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/module/resource&lt;br /&gt;
&lt;br /&gt;
The resource refers to a table with the name module_resource in the file modules/s3db/&amp;lt;module&amp;gt;.py&lt;br /&gt;
&lt;br /&gt;
==Introduction to project==&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
In the Central African Republic page, some data needs new models, and some models need tweaking. The purpose of this project is to identify any such requirement and make necessary changes. The general steps to follow in Sahana development are mentioned below-&lt;br /&gt;
&lt;br /&gt;
1. Add/modify the core models in modules/s3db&lt;br /&gt;
&lt;br /&gt;
2. Add REST controllers for new models&lt;br /&gt;
&lt;br /&gt;
3. Check basic operations using automatic CRUD interface- tweak list_fields to the most-relevant fields perhaps &lt;br /&gt;
&lt;br /&gt;
4. Add menu entries (modules/s3menus.py)&lt;br /&gt;
&lt;br /&gt;
5. Develop XSLT &amp;amp; CSV templates (static/formats/s3csv) to bulk import the data&lt;br /&gt;
&lt;br /&gt;
6. Convert the data to these CSV templates- use ogr2ogr for this &lt;br /&gt;
&lt;br /&gt;
7. Add layers to the map (private/templates/&amp;lt;TEMPLATE&amp;gt;/gis_layer_feature.csv. Look at default for now) including Markers and tooltips (popup_format)&lt;br /&gt;
&lt;br /&gt;
8. Provide some report_options to make a meaningful report&lt;br /&gt;
&lt;br /&gt;
====Scope====&lt;br /&gt;
Four modules related to this deployment are-&lt;br /&gt;
&lt;br /&gt;
1. Health - modules/s3db/hms.py&lt;br /&gt;
&lt;br /&gt;
2. Transport - modules/s3db/transport.py&lt;br /&gt;
&lt;br /&gt;
3. Water - modules/s3db/water.py&lt;br /&gt;
&lt;br /&gt;
4. School - There is no separate module for education. &lt;br /&gt;
&lt;br /&gt;
====Reference Material====&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-health Hospital Model]&lt;br /&gt;
&lt;br /&gt;
[http://geonode.wfp.org/layers/geonode:wld_poi_bcp_wfp Border Control Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-roads Roads], [http://geonode.wfp.org/layers/geonode:wld_trs_supplyroutes_wfp Routes], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-aerodromes-airports-airfields Airports]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies Water Bodies], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies-0 Water Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-courses Rivers]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education Education]&lt;br /&gt;
&lt;br /&gt;
==System Overview==&lt;br /&gt;
&lt;br /&gt;
Sahana Eden Framework:&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Software Platform has been built around a Rapid Application Development (RAD) Framework. This provides a high level of automation to ensure that new solutions can be quickly and effectively developed. Once a database table is defined, the Sahana Eden Framework automatically generates HTML pages to handle CRUD (Create, Read, Update, Delete) as well as Search, Map and Pivot Reports. Web Services are available to import and export in XML, CSV, JSON and EXtensible Stylesheet Language (XSL) transforms are supported to produce other data standards.&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Framework has flexible authorization policies which can be configured to grant permissions for different modules, tables as well as the ability to have multiple Organizations control their own data on a single Sahana Eden installation.&lt;br /&gt;
&lt;br /&gt;
Sahana Eden can be downloaded and run locally from a flash drive. Synchronization functionality allows data to be entered then keep up to date between different installations, including online servers and local flash drive installations. The Sahana Eden Framework also includes a scheduler for running tasks at a specific time, in regular intervals or as asynchronous tasks which are triggered by users. &lt;br /&gt;
&lt;br /&gt;
Sahana Eden is mainly implemented using Python, web2py, CSS and foundation. When you open the code in Eclipse, you can see that web2py is very much like Ruby on Rails. Analyze the screenshots below-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: workspace.png]][[File: workspace2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Our focus is on Controllers, Models, Modules and views. For every action on various pages on Sahana Humanitarian website, there are set of controllers defined. As mentioned above, we want to focus on 4 models- health, transport, water and school.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef Key&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef value (number)&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; OSM tag&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:amenity&amp;quot; title=&amp;quot;Key:amenity&amp;quot;&amp;gt;amenity&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/wiki/Tag:amenity%3Dhospital&amp;quot; title=&amp;quot;Tag:amenity=hospital&amp;quot;&amp;gt;hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:source&amp;quot; title=&amp;quot;Key:source&amp;quot;&amp;gt;source&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:source%3DUNICEF&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:source=UNICEF (page does not exist)&amp;quot;&amp;gt;UNICEF&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ID&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; WPT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; FOSA_CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAT_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LONG_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PAYS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PREF, SOUS_PREF, COMM, VILLE_VILL, QUARTIER&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:addr%CB%90full&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:addrːfull (page does not exist)&amp;quot;&amp;gt;addrːfull&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VILLE_VILL&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:addr:city&amp;quot; title=&amp;quot;Key:addr:city&amp;quot; class=&amp;quot;mw-redirect&amp;quot;&amp;gt;addr:city&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; POP_VILLE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Public (306)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:operator:type&amp;quot; title=&amp;quot;Key:operator:type&amp;quot;&amp;gt;operator:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:operator:type%3Dgovernment&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:operator:type=government (page does not exist)&amp;quot;&amp;gt;government&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Prive (37)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:operator:type&amp;quot; title=&amp;quot;Key:operator:type&amp;quot;&amp;gt;operator:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:operator:type%3Dprivate&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:operator:type=private (page does not exist)&amp;quot;&amp;gt;private&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Poste de sante (204)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Ddispensary&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=dispensary (page does not exist)&amp;quot;&amp;gt;dispensary&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Centre de sante (with beds) (118)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dhealth_center&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=health center (page does not exist)&amp;quot;&amp;gt;health_center&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital prefectoral (7)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dprefectoral_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=prefectoral hospital (page does not exist)&amp;quot;&amp;gt;prefectoral_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital regional (3)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dregional_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=regional hospital (page does not exist)&amp;quot;&amp;gt;regional_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Clinique privee (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dprivate_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=private hospital (page does not exist)&amp;quot;&amp;gt;private_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No attribut (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not to upload&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NOM_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:name&amp;quot; title=&amp;quot;Key:name&amp;quot;&amp;gt;name&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_LITS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-179&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:capacity:beds&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:capacity:beds (page does not exist)&amp;quot;&amp;gt;capacity:beds&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_SO&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PATIENT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; COMITE_WAS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_WA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LTA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP_PLEIN&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LATRINES_S&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAVE_MAINS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; INCINERATE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; BAC_A_ORDU&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TOTAL_LATR&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-23&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:toilets:number&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:toilets:number (page does not exist)&amp;quot;&amp;gt;toilets:number&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==System Architecture==&lt;br /&gt;
The basic Sahana Eden architecture is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: 1px dotted rgb(0, 0, 0); border-collapse: collapse;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Server&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Apache&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Other web servers can also be used, such as Cherokee.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Application&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Sahana Eden&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Application Framework&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Web2Py&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Programming Language&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Python &amp;amp;amp; Java Script&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Database&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;MySQL, PostgreSQL, or SQLite&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;p&amp;gt;MySQL, PostgreSQL, and SQLite are supported.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Other databases should be usable without major additional work since Web2Py supplies many connectors.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Operating System&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Linux (Debian recommended)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Windows and Mac OS X are possible, but only recommended for single-user environments.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirement Analysis==&lt;br /&gt;
&lt;br /&gt;
The requirements state that some of the data needs new models. Also, the school database states that there is no module for education. Even on the [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education education website] of Central African Republic, it says that the data is incomplete. Addition of new module, say edu.py in s3db module, will solve this problem.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project, we will need to follow these steps-&lt;br /&gt;
&lt;br /&gt;
1. Installation and setup- Follow the installation guidelines provided by Sahana to build the system on individual machines. Then, do the setup for Git repository, i.e. forking Sahana eden repo and adding the original as remote branch.&lt;br /&gt;
&lt;br /&gt;
2. Identify properties for &amp;quot;edu.py&amp;quot; and define the basic data model in the models/ folder.&lt;br /&gt;
&lt;br /&gt;
3. Add corresponding controller which provides access to this resource. Create another new file, this time in the controllers/ folder.&lt;br /&gt;
&lt;br /&gt;
4. Define Field Types- By default fields are created with type string, however we may wish to use other data types. All fields have both client-side widgets &amp;amp; server-side validation automatically added based on their data type. &lt;br /&gt;
&lt;br /&gt;
5. Customize and Internationalize field labels- Field labels are automatically generated from the field names, however we are able to customize these by adding a 'label' attribute. &lt;br /&gt;
&lt;br /&gt;
6. Add Links to other Resources.&lt;br /&gt;
&lt;br /&gt;
7. Override default CRUD Strings.&lt;br /&gt;
&lt;br /&gt;
8. Update the Menus- There are two levels of menu within the system: The top-level 'Modules Menu' is visible in all modules. Underneath that, each module has its own menu for for module-specific navigation.&lt;br /&gt;
&lt;br /&gt;
9. Test the changes.&lt;br /&gt;
&lt;br /&gt;
=== GIS Requirements === &lt;br /&gt;
==== Understanding OpenLayers &amp;amp; GeoExt ====&lt;br /&gt;
OpenLayers is an open source, client side JavaScript library for making interactive web maps, viewable in nearly any web browser. Since it is a client side library, it requires no special server side so beware or settings—you can use it without even downloading anything.Originally developed by Metacarta, as a response, in part, to Google Maps, it has grown into a mature, popular framework with many passionate developers and a very helpful community.&lt;br /&gt;
*OpenLayers.Map&lt;br /&gt;
Here is an example that will create a page containing a full screen OpenLayers map. This is not the most basic of maps, but will work if you copy and paste the html content.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &lt;br /&gt;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;EN&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;style&amp;gt;&lt;br /&gt;
    html,body {&lt;br /&gt;
     height: 99%;&lt;br /&gt;
     width: 99%;&lt;br /&gt;
     }&lt;br /&gt;
    #map {&lt;br /&gt;
     width: 100%;&lt;br /&gt;
     height: 100%;&lt;br /&gt;
     border: 1px solid black;&lt;br /&gt;
     }	&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;script src='http://openlayers.org/api/OpenLayers.js'&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt; div id=&amp;quot;map&amp;quot;&amp;gt;&amp;lt;/ div&amp;gt;&lt;br /&gt;
      &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
       var map = new OpenLayers.Map('map',{maxResolution: 0.703125} );&lt;br /&gt;
       var wmscURL = [&lt;br /&gt;
        &amp;quot;http://wmsc1.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc2.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc3.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc4.terrapages.net/getmap?&amp;quot;&lt;br /&gt;
         ];&lt;br /&gt;
       var terrapagesStreetLayer = new OpenLayers.Layer.WMS( 'TerraPages Street',wmscURL, {layers: 'UnprojectedStreet', format: 'image/jpeg' }, {buffer: 1, isBaseLayer: true} );&lt;br /&gt;
       map.addLayer(terrapagesStreetLayer);&lt;br /&gt;
       map.zoomToMaxExtent();		&lt;br /&gt;
      &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*OpenLayers.Layer.Markers&lt;br /&gt;
&lt;br /&gt;
Below is an example of how to create a Markers Layer, and add a single marker on that layer at the specified lon and lat. This will also apply an offest to the icon image, so that it can be aligned horizontally centered, vertically bottom over the position.&lt;br /&gt;
&lt;br /&gt;
  var markersLayer = new OpenLayers.Layer.Markers(&amp;quot;My Marker Layer&amp;quot;);&lt;br /&gt;
  var iconSize =  new OpenLayers.Size(20,20);&lt;br /&gt;
  var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);&lt;br /&gt;
  var marker = new OpenLayers.Marker(&lt;br /&gt;
  new OpenLayers.LonLat(&amp;lt;&amp;lt;lon&amp;gt;&amp;gt;,&amp;lt;&amp;lt;lat&amp;gt;&amp;gt;),&lt;br /&gt;
  new OpenLayers.Icon(&amp;lt;&amp;lt;iconURL&amp;gt;&amp;gt;,iconSize,iconOffset)&lt;br /&gt;
  );&lt;br /&gt;
  markersLayer.setVisibility(true);&lt;br /&gt;
  markersLayer.addMarker(marker);&lt;br /&gt;
  map.addLayer(markersLayer);&lt;br /&gt;
&lt;br /&gt;
==== Add layers to the map ====&lt;br /&gt;
Sahana Eden makes use of Openlayers and GeoExt for its GIS module. A map is basically a combination of several stitched tiles which are rendered on the web page upon request. The overall map functionalities include displaying various hospital types, locations, heliports and other map related data.We are focusing on adding a new overlay layer to the existing map layers and as well using a customised image icon for displaying marker symbol for our overlay layer.&lt;br /&gt;
&lt;br /&gt;
[[File:Map-screen.png]]&lt;br /&gt;
&lt;br /&gt;
==Design Principles==&lt;br /&gt;
&lt;br /&gt;
For our project, the best design principle applicable is &amp;quot;Open Close Principle&amp;quot;. Since we are introducing a new module, there will definitely be extensions to it, but very few modifications.&lt;br /&gt;
&lt;br /&gt;
The common features/functions will be encapsulated to ensure that the code is &amp;quot;DRY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Proposed Test Cases==&lt;br /&gt;
&lt;br /&gt;
For end-user performance gains, Sahana Eden minimizes and compresses the CSS and JavaScript. While this approach works well for optimized end-user performance, to debug the CSS and JavaScript we shall enable debug mode in models/000_config.py  in our Sahana Eden server with the following setting:&lt;br /&gt;
&lt;br /&gt;
  settings.base.debug = True&lt;br /&gt;
&lt;br /&gt;
Once any changes to the CSS and JavaScript are working, then we can minimizes and compresses the CSS and JavaScript using:&lt;br /&gt;
&lt;br /&gt;
  static/scripts/tools/build.sahana.py&lt;br /&gt;
&lt;br /&gt;
Although this uses a web service, you get better results by downloading a local version of the Closure Compiler (a tool for making JavaScript download and run faster) to static/scripts/tools. It is also possible to quickly view a single page in debug mode by adding the ?debug=1 variable to the end of a URL.&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
[https://groups.google.com/forum/#!forum/sahana-eden Public Google Forum to discuss any development issues]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/sahana-launches-eurosha-humanitarian-data-site/ Sahana Launches EUROSHA Humanitarian Data Site]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/eurosha-volunteer-diary/ A EUROSHA Volunteer Diary]&lt;br /&gt;
&lt;br /&gt;
[http://en.flossmanuals.net/sahana-eden/user-stories/ User stories]&lt;br /&gt;
&lt;br /&gt;
[http://www.un.org/apps/news/story.asp?NewsID=49300#.VGLHHo_wbK8 Central African Republic: UN urges support to meet basic needs in hard-hit province]&lt;br /&gt;
&lt;br /&gt;
[https://www.packtpub.com/books/content/what-openlayers OpenLayers]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Central_African_Republic Wiki Page]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=VoQAxQgevEA War in the Central African Republic (Full Length Documentary)]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92332</id>
		<title>CSC/ECE 517 Fall 2014/final S1455</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92332"/>
		<updated>2014-12-02T03:44:07Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Add layers to the map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please read the &amp;quot;README&amp;quot; file provided in expertizza. This wiki page contains design details for the project for Sahana Eden Humanitarian Platform, on their Central African Republic deployment.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:{{{align|right}}}&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |[[File:SahanaLogo.png|center|Sahana]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
== Background Information ==&lt;br /&gt;
====About Sahana Eden====&lt;br /&gt;
Sahana Eden is an Open Source Humanitarian Platform, which can be used to provide solutions for Disaster Management, Development, and Environmental Management sectors. It is supported by the  Sahana Software Foundation, Used in many Deployments, such as Ebola, Kashmir Floods, Hurricane Sandy, just to name a few. It is highly configurable so that it can be used in a wide variety of different contexts and is easy to modify to build custom solutions. Different levels of support are available from both the voluntary Sahana Eden community and professional companies. Sahana focuses on Community and Professional Support.&lt;br /&gt;
&lt;br /&gt;
====Getting to know the domain====&lt;br /&gt;
&lt;br /&gt;
Their [http://eden.sahanafoundation.org/wiki/Domain domain] page elaborately describes various major management projects and deployments that are done in the past or are ongoing. Spending some time to understand goals and purposes of Sahana before starting with actual development might help making the code better and more sensible from Sahana's perspective.&lt;br /&gt;
&lt;br /&gt;
====Installation &amp;amp; tutorials====&lt;br /&gt;
&lt;br /&gt;
Anyone who wishes to contribute their development skill to Sahana, can do so with the help of an elaborate guide they have provided, that covers everything from [http://eden.sahanafoundation.org/wiki/InstallationGuidelines installation] to [http://eden.sahanafoundation.org/wiki/Book tutorials] on Python. Once the installations are complete, you can simply identify a task you are interested in, and start working on it. You may also want to sign their [https://docs.google.com/a/ncsu.edu/spreadsheet/viewform?formkey=dEp5czdPYThPY2htX2pNM1JGaTBrRGc6MQ#gid=0 Contributor's License Agreement] before making any pull request.&lt;br /&gt;
&lt;br /&gt;
Below is a high level overview to begin contributing to Sahana-&lt;br /&gt;
&lt;br /&gt;
The code is in the folder: web2py/applications/eden&lt;br /&gt;
&lt;br /&gt;
Inside that folder are folders for Models (define the data structure), Controllers (provide URLs to enable access to the data) &amp;amp; Views (HTML templates).&lt;br /&gt;
&lt;br /&gt;
Each module within Sahana Eden will normally consist of one of each of these files:&lt;br /&gt;
&lt;br /&gt;
    Model: modules/s3db/modulename.py&lt;br /&gt;
    Controller: controllers/modulename.py&lt;br /&gt;
    View: views/modulename/index.html&lt;br /&gt;
&lt;br /&gt;
In order to know which file to edit in order to change a particular function, you need to look at the URL. The Web2Py web framework maps URLs as follows:&lt;br /&gt;
&lt;br /&gt;
    http://host/application/controller/function&lt;br /&gt;
&lt;br /&gt;
So, if you want to edit the Home page with the URL:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/default/index&lt;br /&gt;
&lt;br /&gt;
This implies that you should look at the file eden/controllers/default.py and the index function within it which can be found by searching for the function title &amp;quot;def index():&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Tip: Sahana Eden makes heavy use of integrated resource controllers so the typical mapping is:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/module/resource&lt;br /&gt;
&lt;br /&gt;
The resource refers to a table with the name module_resource in the file modules/s3db/&amp;lt;module&amp;gt;.py&lt;br /&gt;
&lt;br /&gt;
==Introduction to project==&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
In the Central African Republic page, some data needs new models, and some models need tweaking. The purpose of this project is to identify any such requirement and make necessary changes. The general steps to follow in Sahana development are mentioned below-&lt;br /&gt;
&lt;br /&gt;
1. Add/modify the core models in modules/s3db&lt;br /&gt;
&lt;br /&gt;
2. Add REST controllers for new models&lt;br /&gt;
&lt;br /&gt;
3. Check basic operations using automatic CRUD interface- tweak list_fields to the most-relevant fields perhaps &lt;br /&gt;
&lt;br /&gt;
4. Add menu entries (modules/s3menus.py)&lt;br /&gt;
&lt;br /&gt;
5. Develop XSLT &amp;amp; CSV templates (static/formats/s3csv) to bulk import the data&lt;br /&gt;
&lt;br /&gt;
6. Convert the data to these CSV templates- use ogr2ogr for this &lt;br /&gt;
&lt;br /&gt;
7. Add layers to the map (private/templates/&amp;lt;TEMPLATE&amp;gt;/gis_layer_feature.csv. Look at default for now) including Markers and tooltips (popup_format)&lt;br /&gt;
&lt;br /&gt;
8. Provide some report_options to make a meaningful report&lt;br /&gt;
&lt;br /&gt;
====Scope====&lt;br /&gt;
Four modules related to this deployment are-&lt;br /&gt;
&lt;br /&gt;
1. Health - modules/s3db/hms.py&lt;br /&gt;
&lt;br /&gt;
2. Transport - modules/s3db/transport.py&lt;br /&gt;
&lt;br /&gt;
3. Water - modules/s3db/water.py&lt;br /&gt;
&lt;br /&gt;
4. School - There is no separate module for education. &lt;br /&gt;
&lt;br /&gt;
====Reference Material====&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-health Hospital Model]&lt;br /&gt;
&lt;br /&gt;
[http://geonode.wfp.org/layers/geonode:wld_poi_bcp_wfp Border Control Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-roads Roads], [http://geonode.wfp.org/layers/geonode:wld_trs_supplyroutes_wfp Routes], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-aerodromes-airports-airfields Airports]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies Water Bodies], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies-0 Water Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-courses Rivers]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education Education]&lt;br /&gt;
&lt;br /&gt;
==System Overview==&lt;br /&gt;
&lt;br /&gt;
Sahana Eden Framework:&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Software Platform has been built around a Rapid Application Development (RAD) Framework. This provides a high level of automation to ensure that new solutions can be quickly and effectively developed. Once a database table is defined, the Sahana Eden Framework automatically generates HTML pages to handle CRUD (Create, Read, Update, Delete) as well as Search, Map and Pivot Reports. Web Services are available to import and export in XML, CSV, JSON and EXtensible Stylesheet Language (XSL) transforms are supported to produce other data standards.&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Framework has flexible authorization policies which can be configured to grant permissions for different modules, tables as well as the ability to have multiple Organizations control their own data on a single Sahana Eden installation.&lt;br /&gt;
&lt;br /&gt;
Sahana Eden can be downloaded and run locally from a flash drive. Synchronization functionality allows data to be entered then keep up to date between different installations, including online servers and local flash drive installations. The Sahana Eden Framework also includes a scheduler for running tasks at a specific time, in regular intervals or as asynchronous tasks which are triggered by users. &lt;br /&gt;
&lt;br /&gt;
Sahana Eden is mainly implemented using Python, web2py, CSS and foundation. When you open the code in Eclipse, you can see that web2py is very much like Ruby on Rails. Analyze the screenshots below-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: workspace.png]][[File: workspace2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Our focus is on Controllers, Models, Modules and views. For every action on various pages on Sahana Humanitarian website, there are set of controllers defined. As mentioned above, we want to focus on 4 models- health, transport, water and school.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef Key&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef value (number)&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; OSM tag&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:amenity&amp;quot; title=&amp;quot;Key:amenity&amp;quot;&amp;gt;amenity&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/wiki/Tag:amenity%3Dhospital&amp;quot; title=&amp;quot;Tag:amenity=hospital&amp;quot;&amp;gt;hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:source&amp;quot; title=&amp;quot;Key:source&amp;quot;&amp;gt;source&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:source%3DUNICEF&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:source=UNICEF (page does not exist)&amp;quot;&amp;gt;UNICEF&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ID&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; WPT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; FOSA_CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAT_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LONG_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PAYS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PREF, SOUS_PREF, COMM, VILLE_VILL, QUARTIER&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:addr%CB%90full&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:addrːfull (page does not exist)&amp;quot;&amp;gt;addrːfull&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VILLE_VILL&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:addr:city&amp;quot; title=&amp;quot;Key:addr:city&amp;quot; class=&amp;quot;mw-redirect&amp;quot;&amp;gt;addr:city&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; POP_VILLE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Public (306)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:operator:type&amp;quot; title=&amp;quot;Key:operator:type&amp;quot;&amp;gt;operator:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:operator:type%3Dgovernment&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:operator:type=government (page does not exist)&amp;quot;&amp;gt;government&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Prive (37)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:operator:type&amp;quot; title=&amp;quot;Key:operator:type&amp;quot;&amp;gt;operator:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:operator:type%3Dprivate&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:operator:type=private (page does not exist)&amp;quot;&amp;gt;private&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Poste de sante (204)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Ddispensary&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=dispensary (page does not exist)&amp;quot;&amp;gt;dispensary&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Centre de sante (with beds) (118)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dhealth_center&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=health center (page does not exist)&amp;quot;&amp;gt;health_center&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital prefectoral (7)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dprefectoral_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=prefectoral hospital (page does not exist)&amp;quot;&amp;gt;prefectoral_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital regional (3)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dregional_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=regional hospital (page does not exist)&amp;quot;&amp;gt;regional_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Clinique privee (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dprivate_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=private hospital (page does not exist)&amp;quot;&amp;gt;private_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No attribut (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not to upload&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NOM_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:name&amp;quot; title=&amp;quot;Key:name&amp;quot;&amp;gt;name&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_LITS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-179&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:capacity:beds&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:capacity:beds (page does not exist)&amp;quot;&amp;gt;capacity:beds&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_SO&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PATIENT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; COMITE_WAS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_WA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LTA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP_PLEIN&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LATRINES_S&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAVE_MAINS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; INCINERATE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; BAC_A_ORDU&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TOTAL_LATR&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-23&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:toilets:number&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:toilets:number (page does not exist)&amp;quot;&amp;gt;toilets:number&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==System Architecture==&lt;br /&gt;
The basic Sahana Eden architecture is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: 1px dotted rgb(0, 0, 0); border-collapse: collapse;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Server&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Apache&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Other web servers can also be used, such as Cherokee.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Application&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Sahana Eden&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Application Framework&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Web2Py&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Programming Language&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Python &amp;amp;amp; Java Script&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Database&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;MySQL, PostgreSQL, or SQLite&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;p&amp;gt;MySQL, PostgreSQL, and SQLite are supported.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Other databases should be usable without major additional work since Web2Py supplies many connectors.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Operating System&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Linux (Debian recommended)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Windows and Mac OS X are possible, but only recommended for single-user environments.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirement Analysis==&lt;br /&gt;
&lt;br /&gt;
The requirements state that some of the data needs new models. Also, the school database states that there is no module for education. Even on the [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education education website] of Central African Republic, it says that the data is incomplete. Addition of new module, say edu.py in s3db module, will solve this problem.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project, we will need to follow these steps-&lt;br /&gt;
&lt;br /&gt;
1. Installation and setup- Follow the installation guidelines provided by Sahana to build the system on individual machines. Then, do the setup for Git repository, i.e. forking Sahana eden repo and adding the original as remote branch.&lt;br /&gt;
&lt;br /&gt;
2. Identify properties for &amp;quot;edu.py&amp;quot; and define the basic data model in the models/ folder.&lt;br /&gt;
&lt;br /&gt;
3. Add corresponding controller which provides access to this resource. Create another new file, this time in the controllers/ folder.&lt;br /&gt;
&lt;br /&gt;
4. Define Field Types- By default fields are created with type string, however we may wish to use other data types. All fields have both client-side widgets &amp;amp; server-side validation automatically added based on their data type. &lt;br /&gt;
&lt;br /&gt;
5. Customize and Internationalize field labels- Field labels are automatically generated from the field names, however we are able to customize these by adding a 'label' attribute. &lt;br /&gt;
&lt;br /&gt;
6. Add Links to other Resources.&lt;br /&gt;
&lt;br /&gt;
7. Override default CRUD Strings.&lt;br /&gt;
&lt;br /&gt;
8. Update the Menus- There are two levels of menu within the system: The top-level 'Modules Menu' is visible in all modules. Underneath that, each module has its own menu for for module-specific navigation.&lt;br /&gt;
&lt;br /&gt;
9. Test the changes.&lt;br /&gt;
&lt;br /&gt;
=== GIS Requirements === &lt;br /&gt;
==== Understanding OpenLayers &amp;amp; GeoExt ====&lt;br /&gt;
OpenLayers is an open source, client side JavaScript library for making interactive web maps, viewable in nearly any web browser. Since it is a client side library, it requires no special server side so beware or settings—you can use it without even downloading anything.Originally developed by Metacarta, as a response, in part, to Google Maps, it has grown into a mature, popular framework with many passionate developers and a very helpful community.&lt;br /&gt;
*OpenLayers.Map&lt;br /&gt;
Here is an example that will create a page containing a full screen OpenLayers map. This is not the most basic of maps, but will work if you copy and paste the html content.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &lt;br /&gt;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;EN&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;style&amp;gt;&lt;br /&gt;
    html,body {&lt;br /&gt;
     height: 99%;&lt;br /&gt;
     width: 99%;&lt;br /&gt;
     }&lt;br /&gt;
    #map {&lt;br /&gt;
     width: 100%;&lt;br /&gt;
     height: 100%;&lt;br /&gt;
     border: 1px solid black;&lt;br /&gt;
     }	&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;script src='http://openlayers.org/api/OpenLayers.js'&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt; div id=&amp;quot;map&amp;quot;&amp;gt;&amp;lt;/ div&amp;gt;&lt;br /&gt;
      &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
       var map = new OpenLayers.Map('map',{maxResolution: 0.703125} );&lt;br /&gt;
       var wmscURL = [&lt;br /&gt;
        &amp;quot;http://wmsc1.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc2.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc3.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc4.terrapages.net/getmap?&amp;quot;&lt;br /&gt;
         ];&lt;br /&gt;
       var terrapagesStreetLayer = new OpenLayers.Layer.WMS( 'TerraPages Street',wmscURL, {layers: 'UnprojectedStreet', format: 'image/jpeg' }, {buffer: 1, isBaseLayer: true} );&lt;br /&gt;
       map.addLayer(terrapagesStreetLayer);&lt;br /&gt;
       map.zoomToMaxExtent();		&lt;br /&gt;
      &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*OpenLayers.Layer.Markers&lt;br /&gt;
&lt;br /&gt;
Below is an example of how to create a Markers Layer, and add a single marker on that layer at the specified lon and lat. This will also apply an offest to the icon image, so that it can be aligned horizontally centered, vertically bottom over the position.&lt;br /&gt;
&lt;br /&gt;
  var markersLayer = new OpenLayers.Layer.Markers(&amp;quot;My Marker Layer&amp;quot;);&lt;br /&gt;
  var iconSize =  new OpenLayers.Size(20,20);&lt;br /&gt;
  var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);&lt;br /&gt;
  var marker = new OpenLayers.Marker(&lt;br /&gt;
  new OpenLayers.LonLat(&amp;lt;&amp;lt;lon&amp;gt;&amp;gt;,&amp;lt;&amp;lt;lat&amp;gt;&amp;gt;),&lt;br /&gt;
  new OpenLayers.Icon(&amp;lt;&amp;lt;iconURL&amp;gt;&amp;gt;,iconSize,iconOffset)&lt;br /&gt;
  );&lt;br /&gt;
  markersLayer.setVisibility(true);&lt;br /&gt;
  markersLayer.addMarker(marker);&lt;br /&gt;
  map.addLayer(markersLayer);&lt;br /&gt;
&lt;br /&gt;
==== Add layers to the map ====&lt;br /&gt;
Sahana Eden makes use of Openlayers and GeoExt for its GIS module. A map is basically a combination of several stitched tiles which are rendered on the web page upon request. The overall map functionalities include displaying various hospital types, locations, heliports and other map related data.We are focusing on adding a new overlay layer to the existing map layers and as well using a customised image icon for displaying marker symbol for our overlay layer.&lt;br /&gt;
&lt;br /&gt;
[[File:Map-screen.png]]&lt;br /&gt;
&lt;br /&gt;
==Design Principles==&lt;br /&gt;
&lt;br /&gt;
For our project, the best design principle applicable is &amp;quot;Open Close Principle&amp;quot;. Since we are introducing a new module, there will definitely be extensions to it, but very few modifications.&lt;br /&gt;
&lt;br /&gt;
The common features/functions will be encapsulated to ensure that the code is &amp;quot;DRY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Proposed Test Cases==&lt;br /&gt;
&lt;br /&gt;
For end-user performance gains, Sahana Eden minimizes and compresses the CSS and JavaScript. While this approach works well for optimized end-user performance, to debug the CSS and JavaScript we shall enable debug mode in models/000_config.py  in our Sahana Eden server with the following setting:&lt;br /&gt;
&lt;br /&gt;
  settings.base.debug = True&lt;br /&gt;
&lt;br /&gt;
Once any changes to the CSS and JavaScript are working, then we can minimizes and compresses the CSS and JavaScript using:&lt;br /&gt;
&lt;br /&gt;
  static/scripts/tools/build.sahana.py&lt;br /&gt;
&lt;br /&gt;
Although this uses a web service, you get better results by downloading a local version of the Closure Compiler (a tool for making JavaScript download and run faster) to static/scripts/tools. It is also possible to quickly view a single page in debug mode by adding the ?debug=1 variable to the end of a URL.&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
[https://groups.google.com/forum/#!forum/sahana-eden Public Google Forum to discuss any development issues]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/sahana-launches-eurosha-humanitarian-data-site/ Sahana Launches EUROSHA Humanitarian Data Site]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/eurosha-volunteer-diary/ A EUROSHA Volunteer Diary]&lt;br /&gt;
&lt;br /&gt;
[http://en.flossmanuals.net/sahana-eden/user-stories/ User stories]&lt;br /&gt;
&lt;br /&gt;
[http://www.un.org/apps/news/story.asp?NewsID=49300#.VGLHHo_wbK8 Central African Republic: UN urges support to meet basic needs in hard-hit province]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Central_African_Republic Wiki Page]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=VoQAxQgevEA War in the Central African Republic (Full Length Documentary)]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Map-screen.png&amp;diff=92331</id>
		<title>File:Map-screen.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Map-screen.png&amp;diff=92331"/>
		<updated>2014-12-02T03:42:48Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: hms module Map&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;hms module Map&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Hms-mapoverlays.png&amp;diff=92330</id>
		<title>File:Hms-mapoverlays.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Hms-mapoverlays.png&amp;diff=92330"/>
		<updated>2014-12-02T03:40:07Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: Sahana Overlays-Map Hms&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sahana Overlays-Map Hms&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92329</id>
		<title>CSC/ECE 517 Fall 2014/final S1455</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92329"/>
		<updated>2014-12-02T03:38:26Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Understanding OpenLayers &amp;amp; GeoExt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please read the &amp;quot;README&amp;quot; file provided in expertizza. This wiki page contains design details for the project for Sahana Eden Humanitarian Platform, on their Central African Republic deployment.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:{{{align|right}}}&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |[[File:SahanaLogo.png|center|Sahana]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
== Background Information ==&lt;br /&gt;
====About Sahana Eden====&lt;br /&gt;
Sahana Eden is an Open Source Humanitarian Platform, which can be used to provide solutions for Disaster Management, Development, and Environmental Management sectors. It is supported by the  Sahana Software Foundation, Used in many Deployments, such as Ebola, Kashmir Floods, Hurricane Sandy, just to name a few. It is highly configurable so that it can be used in a wide variety of different contexts and is easy to modify to build custom solutions. Different levels of support are available from both the voluntary Sahana Eden community and professional companies. Sahana focuses on Community and Professional Support.&lt;br /&gt;
&lt;br /&gt;
====Getting to know the domain====&lt;br /&gt;
&lt;br /&gt;
Their [http://eden.sahanafoundation.org/wiki/Domain domain] page elaborately describes various major management projects and deployments that are done in the past or are ongoing. Spending some time to understand goals and purposes of Sahana before starting with actual development might help making the code better and more sensible from Sahana's perspective.&lt;br /&gt;
&lt;br /&gt;
====Installation &amp;amp; tutorials====&lt;br /&gt;
&lt;br /&gt;
Anyone who wishes to contribute their development skill to Sahana, can do so with the help of an elaborate guide they have provided, that covers everything from [http://eden.sahanafoundation.org/wiki/InstallationGuidelines installation] to [http://eden.sahanafoundation.org/wiki/Book tutorials] on Python. Once the installations are complete, you can simply identify a task you are interested in, and start working on it. You may also want to sign their [https://docs.google.com/a/ncsu.edu/spreadsheet/viewform?formkey=dEp5czdPYThPY2htX2pNM1JGaTBrRGc6MQ#gid=0 Contributor's License Agreement] before making any pull request.&lt;br /&gt;
&lt;br /&gt;
Below is a high level overview to begin contributing to Sahana-&lt;br /&gt;
&lt;br /&gt;
The code is in the folder: web2py/applications/eden&lt;br /&gt;
&lt;br /&gt;
Inside that folder are folders for Models (define the data structure), Controllers (provide URLs to enable access to the data) &amp;amp; Views (HTML templates).&lt;br /&gt;
&lt;br /&gt;
Each module within Sahana Eden will normally consist of one of each of these files:&lt;br /&gt;
&lt;br /&gt;
    Model: modules/s3db/modulename.py&lt;br /&gt;
    Controller: controllers/modulename.py&lt;br /&gt;
    View: views/modulename/index.html&lt;br /&gt;
&lt;br /&gt;
In order to know which file to edit in order to change a particular function, you need to look at the URL. The Web2Py web framework maps URLs as follows:&lt;br /&gt;
&lt;br /&gt;
    http://host/application/controller/function&lt;br /&gt;
&lt;br /&gt;
So, if you want to edit the Home page with the URL:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/default/index&lt;br /&gt;
&lt;br /&gt;
This implies that you should look at the file eden/controllers/default.py and the index function within it which can be found by searching for the function title &amp;quot;def index():&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Tip: Sahana Eden makes heavy use of integrated resource controllers so the typical mapping is:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/module/resource&lt;br /&gt;
&lt;br /&gt;
The resource refers to a table with the name module_resource in the file modules/s3db/&amp;lt;module&amp;gt;.py&lt;br /&gt;
&lt;br /&gt;
==Introduction to project==&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
In the Central African Republic page, some data needs new models, and some models need tweaking. The purpose of this project is to identify any such requirement and make necessary changes. The general steps to follow in Sahana development are mentioned below-&lt;br /&gt;
&lt;br /&gt;
1. Add/modify the core models in modules/s3db&lt;br /&gt;
&lt;br /&gt;
2. Add REST controllers for new models&lt;br /&gt;
&lt;br /&gt;
3. Check basic operations using automatic CRUD interface- tweak list_fields to the most-relevant fields perhaps &lt;br /&gt;
&lt;br /&gt;
4. Add menu entries (modules/s3menus.py)&lt;br /&gt;
&lt;br /&gt;
5. Develop XSLT &amp;amp; CSV templates (static/formats/s3csv) to bulk import the data&lt;br /&gt;
&lt;br /&gt;
6. Convert the data to these CSV templates- use ogr2ogr for this &lt;br /&gt;
&lt;br /&gt;
7. Add layers to the map (private/templates/&amp;lt;TEMPLATE&amp;gt;/gis_layer_feature.csv. Look at default for now) including Markers and tooltips (popup_format)&lt;br /&gt;
&lt;br /&gt;
8. Provide some report_options to make a meaningful report&lt;br /&gt;
&lt;br /&gt;
====Scope====&lt;br /&gt;
Four modules related to this deployment are-&lt;br /&gt;
&lt;br /&gt;
1. Health - modules/s3db/hms.py&lt;br /&gt;
&lt;br /&gt;
2. Transport - modules/s3db/transport.py&lt;br /&gt;
&lt;br /&gt;
3. Water - modules/s3db/water.py&lt;br /&gt;
&lt;br /&gt;
4. School - There is no separate module for education. &lt;br /&gt;
&lt;br /&gt;
====Reference Material====&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-health Hospital Model]&lt;br /&gt;
&lt;br /&gt;
[http://geonode.wfp.org/layers/geonode:wld_poi_bcp_wfp Border Control Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-roads Roads], [http://geonode.wfp.org/layers/geonode:wld_trs_supplyroutes_wfp Routes], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-aerodromes-airports-airfields Airports]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies Water Bodies], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies-0 Water Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-courses Rivers]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education Education]&lt;br /&gt;
&lt;br /&gt;
==System Overview==&lt;br /&gt;
&lt;br /&gt;
Sahana Eden Framework:&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Software Platform has been built around a Rapid Application Development (RAD) Framework. This provides a high level of automation to ensure that new solutions can be quickly and effectively developed. Once a database table is defined, the Sahana Eden Framework automatically generates HTML pages to handle CRUD (Create, Read, Update, Delete) as well as Search, Map and Pivot Reports. Web Services are available to import and export in XML, CSV, JSON and EXtensible Stylesheet Language (XSL) transforms are supported to produce other data standards.&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Framework has flexible authorization policies which can be configured to grant permissions for different modules, tables as well as the ability to have multiple Organizations control their own data on a single Sahana Eden installation.&lt;br /&gt;
&lt;br /&gt;
Sahana Eden can be downloaded and run locally from a flash drive. Synchronization functionality allows data to be entered then keep up to date between different installations, including online servers and local flash drive installations. The Sahana Eden Framework also includes a scheduler for running tasks at a specific time, in regular intervals or as asynchronous tasks which are triggered by users. &lt;br /&gt;
&lt;br /&gt;
Sahana Eden is mainly implemented using Python, web2py, CSS and foundation. When you open the code in Eclipse, you can see that web2py is very much like Ruby on Rails. Analyze the screenshots below-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: workspace.png]][[File: workspace2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Our focus is on Controllers, Models, Modules and views. For every action on various pages on Sahana Humanitarian website, there are set of controllers defined. As mentioned above, we want to focus on 4 models- health, transport, water and school.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef Key&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef value (number)&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; OSM tag&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:amenity&amp;quot; title=&amp;quot;Key:amenity&amp;quot;&amp;gt;amenity&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/wiki/Tag:amenity%3Dhospital&amp;quot; title=&amp;quot;Tag:amenity=hospital&amp;quot;&amp;gt;hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:source&amp;quot; title=&amp;quot;Key:source&amp;quot;&amp;gt;source&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:source%3DUNICEF&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:source=UNICEF (page does not exist)&amp;quot;&amp;gt;UNICEF&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ID&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; WPT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; FOSA_CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAT_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LONG_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PAYS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PREF, SOUS_PREF, COMM, VILLE_VILL, QUARTIER&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:addr%CB%90full&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:addrːfull (page does not exist)&amp;quot;&amp;gt;addrːfull&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VILLE_VILL&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:addr:city&amp;quot; title=&amp;quot;Key:addr:city&amp;quot; class=&amp;quot;mw-redirect&amp;quot;&amp;gt;addr:city&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; POP_VILLE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Public (306)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:operator:type&amp;quot; title=&amp;quot;Key:operator:type&amp;quot;&amp;gt;operator:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:operator:type%3Dgovernment&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:operator:type=government (page does not exist)&amp;quot;&amp;gt;government&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Prive (37)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:operator:type&amp;quot; title=&amp;quot;Key:operator:type&amp;quot;&amp;gt;operator:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:operator:type%3Dprivate&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:operator:type=private (page does not exist)&amp;quot;&amp;gt;private&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Poste de sante (204)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Ddispensary&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=dispensary (page does not exist)&amp;quot;&amp;gt;dispensary&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Centre de sante (with beds) (118)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dhealth_center&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=health center (page does not exist)&amp;quot;&amp;gt;health_center&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital prefectoral (7)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dprefectoral_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=prefectoral hospital (page does not exist)&amp;quot;&amp;gt;prefectoral_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital regional (3)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dregional_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=regional hospital (page does not exist)&amp;quot;&amp;gt;regional_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Clinique privee (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dprivate_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=private hospital (page does not exist)&amp;quot;&amp;gt;private_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No attribut (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not to upload&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NOM_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:name&amp;quot; title=&amp;quot;Key:name&amp;quot;&amp;gt;name&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_LITS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-179&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:capacity:beds&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:capacity:beds (page does not exist)&amp;quot;&amp;gt;capacity:beds&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_SO&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PATIENT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; COMITE_WAS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_WA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LTA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP_PLEIN&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LATRINES_S&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAVE_MAINS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; INCINERATE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; BAC_A_ORDU&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TOTAL_LATR&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-23&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:toilets:number&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:toilets:number (page does not exist)&amp;quot;&amp;gt;toilets:number&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==System Architecture==&lt;br /&gt;
The basic Sahana Eden architecture is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: 1px dotted rgb(0, 0, 0); border-collapse: collapse;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Server&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Apache&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Other web servers can also be used, such as Cherokee.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Application&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Sahana Eden&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Application Framework&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Web2Py&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Programming Language&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Python &amp;amp;amp; Java Script&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Database&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;MySQL, PostgreSQL, or SQLite&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;p&amp;gt;MySQL, PostgreSQL, and SQLite are supported.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Other databases should be usable without major additional work since Web2Py supplies many connectors.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Operating System&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Linux (Debian recommended)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Windows and Mac OS X are possible, but only recommended for single-user environments.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirement Analysis==&lt;br /&gt;
&lt;br /&gt;
The requirements state that some of the data needs new models. Also, the school database states that there is no module for education. Even on the [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education education website] of Central African Republic, it says that the data is incomplete. Addition of new module, say edu.py in s3db module, will solve this problem.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project, we will need to follow these steps-&lt;br /&gt;
&lt;br /&gt;
1. Installation and setup- Follow the installation guidelines provided by Sahana to build the system on individual machines. Then, do the setup for Git repository, i.e. forking Sahana eden repo and adding the original as remote branch.&lt;br /&gt;
&lt;br /&gt;
2. Identify properties for &amp;quot;edu.py&amp;quot; and define the basic data model in the models/ folder.&lt;br /&gt;
&lt;br /&gt;
3. Add corresponding controller which provides access to this resource. Create another new file, this time in the controllers/ folder.&lt;br /&gt;
&lt;br /&gt;
4. Define Field Types- By default fields are created with type string, however we may wish to use other data types. All fields have both client-side widgets &amp;amp; server-side validation automatically added based on their data type. &lt;br /&gt;
&lt;br /&gt;
5. Customize and Internationalize field labels- Field labels are automatically generated from the field names, however we are able to customize these by adding a 'label' attribute. &lt;br /&gt;
&lt;br /&gt;
6. Add Links to other Resources.&lt;br /&gt;
&lt;br /&gt;
7. Override default CRUD Strings.&lt;br /&gt;
&lt;br /&gt;
8. Update the Menus- There are two levels of menu within the system: The top-level 'Modules Menu' is visible in all modules. Underneath that, each module has its own menu for for module-specific navigation.&lt;br /&gt;
&lt;br /&gt;
9. Test the changes.&lt;br /&gt;
&lt;br /&gt;
=== GIS Requirements === &lt;br /&gt;
==== Understanding OpenLayers &amp;amp; GeoExt ====&lt;br /&gt;
OpenLayers is an open source, client side JavaScript library for making interactive web maps, viewable in nearly any web browser. Since it is a client side library, it requires no special server side so beware or settings—you can use it without even downloading anything.Originally developed by Metacarta, as a response, in part, to Google Maps, it has grown into a mature, popular framework with many passionate developers and a very helpful community.&lt;br /&gt;
*OpenLayers.Map&lt;br /&gt;
Here is an example that will create a page containing a full screen OpenLayers map. This is not the most basic of maps, but will work if you copy and paste the html content.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &lt;br /&gt;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;EN&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
   &amp;lt;style&amp;gt;&lt;br /&gt;
    html,body {&lt;br /&gt;
     height: 99%;&lt;br /&gt;
     width: 99%;&lt;br /&gt;
     }&lt;br /&gt;
    #map {&lt;br /&gt;
     width: 100%;&lt;br /&gt;
     height: 100%;&lt;br /&gt;
     border: 1px solid black;&lt;br /&gt;
     }	&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;script src='http://openlayers.org/api/OpenLayers.js'&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt; div id=&amp;quot;map&amp;quot;&amp;gt;&amp;lt;/ div&amp;gt;&lt;br /&gt;
      &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
       var map = new OpenLayers.Map('map',{maxResolution: 0.703125} );&lt;br /&gt;
       var wmscURL = [&lt;br /&gt;
        &amp;quot;http://wmsc1.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc2.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc3.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc4.terrapages.net/getmap?&amp;quot;&lt;br /&gt;
         ];&lt;br /&gt;
       var terrapagesStreetLayer = new OpenLayers.Layer.WMS( 'TerraPages Street',wmscURL, {layers: 'UnprojectedStreet', format: 'image/jpeg' }, {buffer: 1, isBaseLayer: true} );&lt;br /&gt;
       map.addLayer(terrapagesStreetLayer);&lt;br /&gt;
       map.zoomToMaxExtent();		&lt;br /&gt;
      &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*OpenLayers.Layer.Markers&lt;br /&gt;
&lt;br /&gt;
Below is an example of how to create a Markers Layer, and add a single marker on that layer at the specified lon and lat. This will also apply an offest to the icon image, so that it can be aligned horizontally centered, vertically bottom over the position.&lt;br /&gt;
&lt;br /&gt;
  var markersLayer = new OpenLayers.Layer.Markers(&amp;quot;My Marker Layer&amp;quot;);&lt;br /&gt;
  var iconSize =  new OpenLayers.Size(20,20);&lt;br /&gt;
  var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);&lt;br /&gt;
  var marker = new OpenLayers.Marker(&lt;br /&gt;
  new OpenLayers.LonLat(&amp;lt;&amp;lt;lon&amp;gt;&amp;gt;,&amp;lt;&amp;lt;lat&amp;gt;&amp;gt;),&lt;br /&gt;
  new OpenLayers.Icon(&amp;lt;&amp;lt;iconURL&amp;gt;&amp;gt;,iconSize,iconOffset)&lt;br /&gt;
  );&lt;br /&gt;
  markersLayer.setVisibility(true);&lt;br /&gt;
  markersLayer.addMarker(marker);&lt;br /&gt;
  map.addLayer(markersLayer);&lt;br /&gt;
&lt;br /&gt;
==== Add layers to the map ====&lt;br /&gt;
Sahana Eden makes use of Openlayers and GeoExt for its GIS module. A map is basically a combination of several stitched tiles which are rendered on the web page upon request. The overall map functionalities include displaying various hospital types, locations, heliports and other map related data.We are focusing on adding a new overlay layer to the existing map layers and as well using a customised image icon for displaying marker symbol for our overlay layer.&lt;br /&gt;
&lt;br /&gt;
==Design Principles==&lt;br /&gt;
&lt;br /&gt;
For our project, the best design principle applicable is &amp;quot;Open Close Principle&amp;quot;. Since we are introducing a new module, there will definitely be extensions to it, but very few modifications.&lt;br /&gt;
&lt;br /&gt;
The common features/functions will be encapsulated to ensure that the code is &amp;quot;DRY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Proposed Test Cases==&lt;br /&gt;
&lt;br /&gt;
For end-user performance gains, Sahana Eden minimizes and compresses the CSS and JavaScript. While this approach works well for optimized end-user performance, to debug the CSS and JavaScript we shall enable debug mode in models/000_config.py  in our Sahana Eden server with the following setting:&lt;br /&gt;
&lt;br /&gt;
  settings.base.debug = True&lt;br /&gt;
&lt;br /&gt;
Once any changes to the CSS and JavaScript are working, then we can minimizes and compresses the CSS and JavaScript using:&lt;br /&gt;
&lt;br /&gt;
  static/scripts/tools/build.sahana.py&lt;br /&gt;
&lt;br /&gt;
Although this uses a web service, you get better results by downloading a local version of the Closure Compiler (a tool for making JavaScript download and run faster) to static/scripts/tools. It is also possible to quickly view a single page in debug mode by adding the ?debug=1 variable to the end of a URL.&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
[https://groups.google.com/forum/#!forum/sahana-eden Public Google Forum to discuss any development issues]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/sahana-launches-eurosha-humanitarian-data-site/ Sahana Launches EUROSHA Humanitarian Data Site]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/eurosha-volunteer-diary/ A EUROSHA Volunteer Diary]&lt;br /&gt;
&lt;br /&gt;
[http://en.flossmanuals.net/sahana-eden/user-stories/ User stories]&lt;br /&gt;
&lt;br /&gt;
[http://www.un.org/apps/news/story.asp?NewsID=49300#.VGLHHo_wbK8 Central African Republic: UN urges support to meet basic needs in hard-hit province]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Central_African_Republic Wiki Page]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=VoQAxQgevEA War in the Central African Republic (Full Length Documentary)]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92328</id>
		<title>CSC/ECE 517 Fall 2014/final S1455</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=92328"/>
		<updated>2014-12-02T03:35:00Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Requirement Analysis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please read the &amp;quot;README&amp;quot; file provided in expertizza. This wiki page contains design details for the project for Sahana Eden Humanitarian Platform, on their Central African Republic deployment.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:{{{align|right}}}&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |[[File:SahanaLogo.png|center|Sahana]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
== Background Information ==&lt;br /&gt;
====About Sahana Eden====&lt;br /&gt;
Sahana Eden is an Open Source Humanitarian Platform, which can be used to provide solutions for Disaster Management, Development, and Environmental Management sectors. It is supported by the  Sahana Software Foundation, Used in many Deployments, such as Ebola, Kashmir Floods, Hurricane Sandy, just to name a few. It is highly configurable so that it can be used in a wide variety of different contexts and is easy to modify to build custom solutions. Different levels of support are available from both the voluntary Sahana Eden community and professional companies. Sahana focuses on Community and Professional Support.&lt;br /&gt;
&lt;br /&gt;
====Getting to know the domain====&lt;br /&gt;
&lt;br /&gt;
Their [http://eden.sahanafoundation.org/wiki/Domain domain] page elaborately describes various major management projects and deployments that are done in the past or are ongoing. Spending some time to understand goals and purposes of Sahana before starting with actual development might help making the code better and more sensible from Sahana's perspective.&lt;br /&gt;
&lt;br /&gt;
====Installation &amp;amp; tutorials====&lt;br /&gt;
&lt;br /&gt;
Anyone who wishes to contribute their development skill to Sahana, can do so with the help of an elaborate guide they have provided, that covers everything from [http://eden.sahanafoundation.org/wiki/InstallationGuidelines installation] to [http://eden.sahanafoundation.org/wiki/Book tutorials] on Python. Once the installations are complete, you can simply identify a task you are interested in, and start working on it. You may also want to sign their [https://docs.google.com/a/ncsu.edu/spreadsheet/viewform?formkey=dEp5czdPYThPY2htX2pNM1JGaTBrRGc6MQ#gid=0 Contributor's License Agreement] before making any pull request.&lt;br /&gt;
&lt;br /&gt;
Below is a high level overview to begin contributing to Sahana-&lt;br /&gt;
&lt;br /&gt;
The code is in the folder: web2py/applications/eden&lt;br /&gt;
&lt;br /&gt;
Inside that folder are folders for Models (define the data structure), Controllers (provide URLs to enable access to the data) &amp;amp; Views (HTML templates).&lt;br /&gt;
&lt;br /&gt;
Each module within Sahana Eden will normally consist of one of each of these files:&lt;br /&gt;
&lt;br /&gt;
    Model: modules/s3db/modulename.py&lt;br /&gt;
    Controller: controllers/modulename.py&lt;br /&gt;
    View: views/modulename/index.html&lt;br /&gt;
&lt;br /&gt;
In order to know which file to edit in order to change a particular function, you need to look at the URL. The Web2Py web framework maps URLs as follows:&lt;br /&gt;
&lt;br /&gt;
    http://host/application/controller/function&lt;br /&gt;
&lt;br /&gt;
So, if you want to edit the Home page with the URL:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/default/index&lt;br /&gt;
&lt;br /&gt;
This implies that you should look at the file eden/controllers/default.py and the index function within it which can be found by searching for the function title &amp;quot;def index():&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Tip: Sahana Eden makes heavy use of integrated resource controllers so the typical mapping is:&lt;br /&gt;
&lt;br /&gt;
    http://host/eden/module/resource&lt;br /&gt;
&lt;br /&gt;
The resource refers to a table with the name module_resource in the file modules/s3db/&amp;lt;module&amp;gt;.py&lt;br /&gt;
&lt;br /&gt;
==Introduction to project==&lt;br /&gt;
&lt;br /&gt;
====Overview====&lt;br /&gt;
In the Central African Republic page, some data needs new models, and some models need tweaking. The purpose of this project is to identify any such requirement and make necessary changes. The general steps to follow in Sahana development are mentioned below-&lt;br /&gt;
&lt;br /&gt;
1. Add/modify the core models in modules/s3db&lt;br /&gt;
&lt;br /&gt;
2. Add REST controllers for new models&lt;br /&gt;
&lt;br /&gt;
3. Check basic operations using automatic CRUD interface- tweak list_fields to the most-relevant fields perhaps &lt;br /&gt;
&lt;br /&gt;
4. Add menu entries (modules/s3menus.py)&lt;br /&gt;
&lt;br /&gt;
5. Develop XSLT &amp;amp; CSV templates (static/formats/s3csv) to bulk import the data&lt;br /&gt;
&lt;br /&gt;
6. Convert the data to these CSV templates- use ogr2ogr for this &lt;br /&gt;
&lt;br /&gt;
7. Add layers to the map (private/templates/&amp;lt;TEMPLATE&amp;gt;/gis_layer_feature.csv. Look at default for now) including Markers and tooltips (popup_format)&lt;br /&gt;
&lt;br /&gt;
8. Provide some report_options to make a meaningful report&lt;br /&gt;
&lt;br /&gt;
====Scope====&lt;br /&gt;
Four modules related to this deployment are-&lt;br /&gt;
&lt;br /&gt;
1. Health - modules/s3db/hms.py&lt;br /&gt;
&lt;br /&gt;
2. Transport - modules/s3db/transport.py&lt;br /&gt;
&lt;br /&gt;
3. Water - modules/s3db/water.py&lt;br /&gt;
&lt;br /&gt;
4. School - There is no separate module for education. &lt;br /&gt;
&lt;br /&gt;
====Reference Material====&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-health Hospital Model]&lt;br /&gt;
&lt;br /&gt;
[http://geonode.wfp.org/layers/geonode:wld_poi_bcp_wfp Border Control Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-roads Roads], [http://geonode.wfp.org/layers/geonode:wld_trs_supplyroutes_wfp Routes], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-aerodromes-airports-airfields Airports]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies Water Bodies], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-bodies-0 Water Points], [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-water-courses Rivers]&lt;br /&gt;
&lt;br /&gt;
[http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education Education]&lt;br /&gt;
&lt;br /&gt;
==System Overview==&lt;br /&gt;
&lt;br /&gt;
Sahana Eden Framework:&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Software Platform has been built around a Rapid Application Development (RAD) Framework. This provides a high level of automation to ensure that new solutions can be quickly and effectively developed. Once a database table is defined, the Sahana Eden Framework automatically generates HTML pages to handle CRUD (Create, Read, Update, Delete) as well as Search, Map and Pivot Reports. Web Services are available to import and export in XML, CSV, JSON and EXtensible Stylesheet Language (XSL) transforms are supported to produce other data standards.&lt;br /&gt;
&lt;br /&gt;
The Sahana Eden Framework has flexible authorization policies which can be configured to grant permissions for different modules, tables as well as the ability to have multiple Organizations control their own data on a single Sahana Eden installation.&lt;br /&gt;
&lt;br /&gt;
Sahana Eden can be downloaded and run locally from a flash drive. Synchronization functionality allows data to be entered then keep up to date between different installations, including online servers and local flash drive installations. The Sahana Eden Framework also includes a scheduler for running tasks at a specific time, in regular intervals or as asynchronous tasks which are triggered by users. &lt;br /&gt;
&lt;br /&gt;
Sahana Eden is mainly implemented using Python, web2py, CSS and foundation. When you open the code in Eclipse, you can see that web2py is very much like Ruby on Rails. Analyze the screenshots below-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: workspace.png]][[File: workspace2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Our focus is on Controllers, Models, Modules and views. For every action on various pages on Sahana Humanitarian website, there are set of controllers defined. As mentioned above, we want to focus on 4 models- health, transport, water and school.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef Key&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; Unicef value (number)&lt;br /&gt;
&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt; OSM tag&lt;br /&gt;
&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:amenity&amp;quot; title=&amp;quot;Key:amenity&amp;quot;&amp;gt;amenity&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/wiki/Tag:amenity%3Dhospital&amp;quot; title=&amp;quot;Tag:amenity=hospital&amp;quot;&amp;gt;hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; all objects&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:source&amp;quot; title=&amp;quot;Key:source&amp;quot;&amp;gt;source&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:source%3DUNICEF&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:source=UNICEF (page does not exist)&amp;quot;&amp;gt;UNICEF&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; ID&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; WPT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; FOSA_CODE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAT_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LONG_DD&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PAYS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; PREF, SOUS_PREF, COMM, VILLE_VILL, QUARTIER&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:addr%CB%90full&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:addrːfull (page does not exist)&amp;quot;&amp;gt;addrːfull&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VILLE_VILL&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:addr:city&amp;quot; title=&amp;quot;Key:addr:city&amp;quot; class=&amp;quot;mw-redirect&amp;quot;&amp;gt;addr:city&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; POP_VILLE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Public (306)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:operator:type&amp;quot; title=&amp;quot;Key:operator:type&amp;quot;&amp;gt;operator:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:operator:type%3Dgovernment&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:operator:type=government (page does not exist)&amp;quot;&amp;gt;government&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; STATUT_FOS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Prive (37)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:operator:type&amp;quot; title=&amp;quot;Key:operator:type&amp;quot;&amp;gt;operator:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:operator:type%3Dprivate&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:operator:type=private (page does not exist)&amp;quot;&amp;gt;private&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Poste de sante (204)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Ddispensary&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=dispensary (page does not exist)&amp;quot;&amp;gt;dispensary&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Centre de sante (with beds) (118)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dhealth_center&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=health center (page does not exist)&amp;quot;&amp;gt;health_center&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital prefectoral (7)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dprefectoral_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=prefectoral hospital (page does not exist)&amp;quot;&amp;gt;prefectoral_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Hopital regional (3)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dregional_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=regional hospital (page does not exist)&amp;quot;&amp;gt;regional_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Clinique privee (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:health_facility:type&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:health facility:type (page does not exist)&amp;quot;&amp;gt;health_facility:type&amp;lt;/a&amp;gt;=&amp;lt;a href=&amp;quot;/w/index.php?title=Tag:health_facility:type%3Dprivate_hospital&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Tag:health facility:type=private hospital (page does not exist)&amp;quot;&amp;gt;private_hospital&amp;lt;/a&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TYPE_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; No attribut (1)&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not to upload&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NOM_FOSA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/wiki/Key:name&amp;quot; title=&amp;quot;Key:name&amp;quot;&amp;gt;name&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_LITS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-179&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:capacity:beds&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:capacity:beds (page does not exist)&amp;quot;&amp;gt;capacity:beds&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_SO&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PATIENT&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; COMITE_WAS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; NB_PERS_WA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LTA&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; VIP_PLEIN&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because unknown meaning&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LATRINES_S&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; LAVE_MAINS&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; INCINERATE&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; BAC_A_ORDU&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Oui/Non&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; not tagged because not relevant&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; TOTAL_LATR&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; numbers 0-23&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; &amp;lt;tt style=&amp;quot;background-color:#dde; white-space:pre;&amp;quot; dir=&amp;quot;ltr&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;/w/index.php?title=Key:toilets:number&amp;amp;amp;action=edit&amp;amp;amp;redlink=1&amp;quot; class=&amp;quot;new&amp;quot; title=&amp;quot;Key:toilets:number (page does not exist)&amp;quot;&amp;gt;toilets:number&amp;lt;/a&amp;gt;=*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==System Architecture==&lt;br /&gt;
The basic Sahana Eden architecture is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: 1px dotted rgb(0, 0, 0); border-collapse: collapse;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Server&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Apache&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Other web servers can also be used, such as Cherokee.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Application&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Sahana Eden&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Web Application Framework&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Web2Py&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Programming Language&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Python &amp;amp;amp; Java Script&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Database&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;MySQL, PostgreSQL, or SQLite&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;p&amp;gt;MySQL, PostgreSQL, and SQLite are supported.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Other databases should be usable without major additional work since Web2Py supplies many connectors.&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Operating System&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Linux (Debian recommended)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted rgb(0, 0, 0);&amp;quot;&amp;gt;Windows and Mac OS X are possible, but only recommended for single-user environments.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirement Analysis==&lt;br /&gt;
&lt;br /&gt;
The requirements state that some of the data needs new models. Also, the school database states that there is no module for education. Even on the [http://www.humanitarianresponse.info/operations/central-african-republic/dataset/central-african-republic-education education website] of Central African Republic, it says that the data is incomplete. Addition of new module, say edu.py in s3db module, will solve this problem.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project, we will need to follow these steps-&lt;br /&gt;
&lt;br /&gt;
1. Installation and setup- Follow the installation guidelines provided by Sahana to build the system on individual machines. Then, do the setup for Git repository, i.e. forking Sahana eden repo and adding the original as remote branch.&lt;br /&gt;
&lt;br /&gt;
2. Identify properties for &amp;quot;edu.py&amp;quot; and define the basic data model in the models/ folder.&lt;br /&gt;
&lt;br /&gt;
3. Add corresponding controller which provides access to this resource. Create another new file, this time in the controllers/ folder.&lt;br /&gt;
&lt;br /&gt;
4. Define Field Types- By default fields are created with type string, however we may wish to use other data types. All fields have both client-side widgets &amp;amp; server-side validation automatically added based on their data type. &lt;br /&gt;
&lt;br /&gt;
5. Customize and Internationalize field labels- Field labels are automatically generated from the field names, however we are able to customize these by adding a 'label' attribute. &lt;br /&gt;
&lt;br /&gt;
6. Add Links to other Resources.&lt;br /&gt;
&lt;br /&gt;
7. Override default CRUD Strings.&lt;br /&gt;
&lt;br /&gt;
8. Update the Menus- There are two levels of menu within the system: The top-level 'Modules Menu' is visible in all modules. Underneath that, each module has its own menu for for module-specific navigation.&lt;br /&gt;
&lt;br /&gt;
9. Test the changes.&lt;br /&gt;
&lt;br /&gt;
=== GIS Requirements === &lt;br /&gt;
==== Understanding OpenLayers &amp;amp; GeoExt ====&lt;br /&gt;
OpenLayers is an open source, client side JavaScript library for making interactive web maps, viewable in nearly any web browser. Since it is a client side library, it requires no special server side so beware or settings—you can use it without even downloading anything.Originally developed by Metacarta, as a response, in part, to Google Maps, it has grown into a mature, popular framework with many passionate developers and a very helpful community.&lt;br /&gt;
*OpenLayers.Map&lt;br /&gt;
Here is an example that will create a page containing a full screen OpenLayers map. This is not the most basic of maps, but will work if you copy and paste the html content.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &lt;br /&gt;
 &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;EN&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    html,body {&lt;br /&gt;
     height: 99%;&lt;br /&gt;
     width: 99%;&lt;br /&gt;
     }&lt;br /&gt;
    #map {&lt;br /&gt;
     width: 100%;&lt;br /&gt;
     height: 100%;&lt;br /&gt;
     border: 1px solid black;&lt;br /&gt;
     }	&lt;br /&gt;
   &amp;lt;/style&amp;gt;&lt;br /&gt;
    &amp;lt;script src='http://openlayers.org/api/OpenLayers.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
      &amp;lt;div id='map'&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
       var map = new OpenLayers.Map('map',{maxResolution: 0.703125} );&lt;br /&gt;
       var wmscURL = [&lt;br /&gt;
        &amp;quot;http://wmsc1.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc2.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc3.terrapages.net/getmap?&amp;quot;,&lt;br /&gt;
        &amp;quot;http://wmsc4.terrapages.net/getmap?&amp;quot;&lt;br /&gt;
         ];&lt;br /&gt;
       var terrapagesStreetLayer = new OpenLayers.Layer.WMS( 'TerraPages Street',wmscURL, {layers: 'UnprojectedStreet', format: 'image/jpeg' }, {buffer: 1, isBaseLayer: true} );&lt;br /&gt;
       map.addLayer(terrapagesStreetLayer);&lt;br /&gt;
       map.zoomToMaxExtent();		&lt;br /&gt;
      &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*OpenLayers.Layer.Markers&lt;br /&gt;
&lt;br /&gt;
Below is an example of how to create a Markers Layer, and add a single marker on that layer at the specified lon and lat. This will also apply an offest to the icon image, so that it can be aligned horizontally centered, vertically bottom over the position.&lt;br /&gt;
&lt;br /&gt;
  var markersLayer = new OpenLayers.Layer.Markers(&amp;quot;My Marker Layer&amp;quot;);&lt;br /&gt;
  var iconSize =  new OpenLayers.Size(20,20);&lt;br /&gt;
  var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);&lt;br /&gt;
  var marker = new OpenLayers.Marker(&lt;br /&gt;
  new OpenLayers.LonLat(&amp;lt;&amp;lt;lon&amp;gt;&amp;gt;,&amp;lt;&amp;lt;lat&amp;gt;&amp;gt;),&lt;br /&gt;
  new OpenLayers.Icon(&amp;lt;&amp;lt;iconURL&amp;gt;&amp;gt;,iconSize,iconOffset)&lt;br /&gt;
  );&lt;br /&gt;
  markersLayer.setVisibility(true);&lt;br /&gt;
  markersLayer.addMarker(marker);&lt;br /&gt;
  map.addLayer(markersLayer);&lt;br /&gt;
&lt;br /&gt;
==== Add layers to the map ====&lt;br /&gt;
Sahana Eden makes use of Openlayers and GeoExt for its GIS module. A map is basically a combination of several stitched tiles which are rendered on the web page upon request. The overall map functionalities include displaying various hospital types, locations, heliports and other map related data.We are focusing on adding a new overlay layer to the existing map layers and as well using a customised image icon for displaying marker symbol for our overlay layer.&lt;br /&gt;
&lt;br /&gt;
==Design Principles==&lt;br /&gt;
&lt;br /&gt;
For our project, the best design principle applicable is &amp;quot;Open Close Principle&amp;quot;. Since we are introducing a new module, there will definitely be extensions to it, but very few modifications.&lt;br /&gt;
&lt;br /&gt;
The common features/functions will be encapsulated to ensure that the code is &amp;quot;DRY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Proposed Test Cases==&lt;br /&gt;
&lt;br /&gt;
For end-user performance gains, Sahana Eden minimizes and compresses the CSS and JavaScript. While this approach works well for optimized end-user performance, to debug the CSS and JavaScript we shall enable debug mode in models/000_config.py  in our Sahana Eden server with the following setting:&lt;br /&gt;
&lt;br /&gt;
  settings.base.debug = True&lt;br /&gt;
&lt;br /&gt;
Once any changes to the CSS and JavaScript are working, then we can minimizes and compresses the CSS and JavaScript using:&lt;br /&gt;
&lt;br /&gt;
  static/scripts/tools/build.sahana.py&lt;br /&gt;
&lt;br /&gt;
Although this uses a web service, you get better results by downloading a local version of the Closure Compiler (a tool for making JavaScript download and run faster) to static/scripts/tools. It is also possible to quickly view a single page in debug mode by adding the ?debug=1 variable to the end of a URL.&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
[https://groups.google.com/forum/#!forum/sahana-eden Public Google Forum to discuss any development issues]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/sahana-launches-eurosha-humanitarian-data-site/ Sahana Launches EUROSHA Humanitarian Data Site]&lt;br /&gt;
&lt;br /&gt;
[http://sahanafoundation.org/eurosha-volunteer-diary/ A EUROSHA Volunteer Diary]&lt;br /&gt;
&lt;br /&gt;
[http://en.flossmanuals.net/sahana-eden/user-stories/ User stories]&lt;br /&gt;
&lt;br /&gt;
[http://www.un.org/apps/news/story.asp?NewsID=49300#.VGLHHo_wbK8 Central African Republic: UN urges support to meet basic needs in hard-hit province]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Central_African_Republic Wiki Page]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=VoQAxQgevEA War in the Central African Republic (Full Length Documentary)]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=91897</id>
		<title>CSC/ECE 517 Fall 2014/final S1455</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/final_S1455&amp;diff=91897"/>
		<updated>2014-11-12T01:03:11Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Installation &amp;amp; tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This wiki page contains design details for the project for Sahana Eden Humanitarian Platform, on [http://eden.sahanafoundation.org/wiki/Deployments/CAR Central African Republic].&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:{{{align|right}}}&amp;quot;&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |[[File:SahanaLogo.png|center|Sahana]]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
== Background Information ==&lt;br /&gt;
===About Sahana Eden===&lt;br /&gt;
Sahana Eden is an Open Source Humanitarian Platform, which can be used to provide solutions for Disaster Management, Development, and Environmental Management sectors. It is supported by the  Sahana Software Foundation, Used in many Deployments, such as Ebola, Kashmir Floods, Hurricane Sandy, just to name a few.&lt;br /&gt;
&lt;br /&gt;
===Installation &amp;amp; tutorials===&lt;br /&gt;
&lt;br /&gt;
Anyone who wishes to contribute their development skill to Sahana, can do so with the help of an elaborate guide they have provided, that covers everything from [http://eden.sahanafoundation.org/wiki/InstallationGuidelines installation] to [http://eden.sahanafoundation.org/wiki/Book tutorials] on Python. Once the installations are complete, you can simply identify a task you are interested in, and start working on it. You may also want to sign their [https://docs.google.com/a/ncsu.edu/spreadsheet/viewform?formkey=dEp5czdPYThPY2htX2pNM1JGaTBrRGc6MQ#gid=0 Contributor's License Agreement] before making any pull request.&lt;br /&gt;
&lt;br /&gt;
===Getting to know the domain===&lt;br /&gt;
&lt;br /&gt;
Their [http://eden.sahanafoundation.org/wiki/Domain domain] page elaborately describes various major management projects and deployments that are done in the past or are ongoing. Spending some time to understand goals and purposes of Sahana before starting with actual development might help making the code better and more sensible from Sahana's perspective. &lt;br /&gt;
&lt;br /&gt;
==Introduction to project==&lt;br /&gt;
&lt;br /&gt;
===Scope===&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
===Reference Material===&lt;br /&gt;
&lt;br /&gt;
==System Overview==&lt;br /&gt;
&lt;br /&gt;
Sahana Eden is mainly implemented using Python, web2py, CSS and foundation. When you open the code in Eclipse, you can see that web2py is very much like Ruby on Rails. Analyze the screenshots below-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File: workspace.png]][[File: workspace2.png]]&lt;br /&gt;
&lt;br /&gt;
==System Architecture==&lt;br /&gt;
&lt;br /&gt;
==Requirement Analysis==&lt;br /&gt;
&lt;br /&gt;
==Data and Component Design==&lt;br /&gt;
&lt;br /&gt;
==Design Principles==&lt;br /&gt;
&lt;br /&gt;
==Proposed Test Cases==&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
[https://groups.google.com/forum/#!forum/sahana-eden Public Google Forum to discuss any development issues]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91372</id>
		<title>CSC/ECE 517 Fall 2014/oss E1463 vpd</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91372"/>
		<updated>2014-11-03T15:15:54Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* look at the rest of the methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''E1463: Refactoring TreeDisplayController''' =&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Project Links=&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Our Expertiza Fork on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/Druotic/expertiza Github Repo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Project Running on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
Admin Account login details : &amp;lt;br&amp;gt;&lt;br /&gt;
Username: user2 &amp;lt;br&amp;gt;&lt;br /&gt;
Password: password&lt;br /&gt;
&lt;br /&gt;
=Project Description=&lt;br /&gt;
&lt;br /&gt;
For this project, our team refactored the TreeDisplayController class in the [http://expertiza.ncsu.edu/ Expertiza] OSS project. This class provides access to questionnaires, review rubrics, author feedback, courses, assignments, and course evaluations. The tree display lists all of these categories with the ability for the user to &amp;quot;drill down&amp;quot; into the subcategories or just expand/collapse as needed.&lt;br /&gt;
&lt;br /&gt;
'''Example Image Of Tree Display:&lt;br /&gt;
'''&lt;br /&gt;
[[File:Expertiza.PNG ]]&lt;br /&gt;
&lt;br /&gt;
=Refactoring TreeDisplayController Tasks=&lt;br /&gt;
&lt;br /&gt;
As part of the refactoring task, we had to address the following issues for enhancing code readability and maintainability. The tasks include-&lt;br /&gt;
#Changing List to Index using a [http://www.restapitutorial.com/lessons/whatisrest.html RESTful] approach.&lt;br /&gt;
#Use of routing helpers&lt;br /&gt;
#Use {} and [] instead of Hash.new and Array.new&lt;br /&gt;
#Ensuring that instantiation of instance variables is minimized.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Changing List to Index==&lt;br /&gt;
All our code changes can be checked out at our [https://github.com/Druotic/expertiza/pull/1/files Git project repository]. It can be seen that we have replaced all the controller action redirections with a tree_display_index_path which enormously reduces the code content and as well as provides an organized approach to action redirections. &lt;br /&gt;
&lt;br /&gt;
[[File:List_to_Index.png]]&lt;br /&gt;
&lt;br /&gt;
combined all of the goto methods&lt;br /&gt;
&lt;br /&gt;
==Use Routing Helpers==&lt;br /&gt;
We refactored the treedisplay controller class to use route helpers rather than calling &amp;quot;:action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&amp;quot;, or something similar. This involved many edits in the tree_display_controller.rb file and related controller and view files. Our [https://github.com/Druotic/expertiza Github repo] shows all the changes made.&lt;br /&gt;
&lt;br /&gt;
Example -- Route helpers added to breadcrumbs view file:&lt;br /&gt;
[[File:routehelpers.PNG ]]&lt;br /&gt;
&lt;br /&gt;
==Minimizing the count of Instance Variables==&lt;br /&gt;
=== Instance Variables in Ruby ===&lt;br /&gt;
An instance variable has a name beginning with @, and its scope is confined to whatever object self refers to. Two different objects, even if they belong to the same class, are allowed to have different values for their instance variables. From outside the object, instance variables cannot be altered or even observed (i.e., ruby's instance variables are never public) except by whatever methods are explicitly provided by the programmer. As with globals, instance variables have the nil value until they are initialized.&lt;br /&gt;
&lt;br /&gt;
Instance variables do not need to be declared. This indicates a flexible object structure; in fact, each instance variable is dynamically appended to an object when it is first assigned.&lt;br /&gt;
&lt;br /&gt;
We have observed that in Expertiza, there were several code files related to the Tree Display controller which were observed to be using multiple instance variables which could be reduced. Our team aimed to limit the instantiation of such variables to only necessary places in our code.&lt;br /&gt;
&lt;br /&gt;
==Other Methods==&lt;br /&gt;
&lt;br /&gt;
=Summary and Conclusions=&lt;br /&gt;
=Future Work=&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91371</id>
		<title>CSC/ECE 517 Fall 2014/oss E1463 vpd</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91371"/>
		<updated>2014-11-03T13:04:32Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Project Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''E1463: Refactoring TreeDisplayController''' =&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Project Links=&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Our Expertiza Fork on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/Druotic/expertiza Github Repo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Project Running on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
Admin Account login details : &amp;lt;br&amp;gt;&lt;br /&gt;
Username: user2 &amp;lt;br&amp;gt;&lt;br /&gt;
Password: password&lt;br /&gt;
&lt;br /&gt;
=Project Description=&lt;br /&gt;
&lt;br /&gt;
For this project, our team refactored the TreeDisplayController class in the [http://expertiza.ncsu.edu/ Expertiza] OSS project. This class provides access to questionnaires, review rubrics, author feedback, courses, assignments, and course evaluations. The tree display lists all of these categories with the ability for the user to &amp;quot;drill down&amp;quot; into the subcategories or just expand/collapse as needed.&lt;br /&gt;
&lt;br /&gt;
'''Example Image Of Tree Display:&lt;br /&gt;
'''&lt;br /&gt;
[[File:Expertiza.PNG ]]&lt;br /&gt;
&lt;br /&gt;
=Refactoring TreeDisplayController Tasks=&lt;br /&gt;
&lt;br /&gt;
As part of the refactoring task, we had to address the following issues for enhancing code readability and maintainability. The tasks include-&lt;br /&gt;
#Changing List to Index using a [http://www.restapitutorial.com/lessons/whatisrest.html RESTful] approach.&lt;br /&gt;
#Use of routing helpers&lt;br /&gt;
#Use {} and [] instead of Hash.new and Array.new&lt;br /&gt;
#Ensuring that instantiation of instance variables is minimized.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Changing List to Index==&lt;br /&gt;
All our code changes can be checked out at our [https://github.com/Druotic/expertiza/pull/1/files Git project repository]. It can be seen that we have replaced all the controller action redirections with a tree_display_index_path which enormously reduces the code content and as well as provides an organized approach to action redirections. &lt;br /&gt;
&lt;br /&gt;
[[File:List_to_Index.png]]&lt;br /&gt;
&lt;br /&gt;
combined all of the goto methods&lt;br /&gt;
&lt;br /&gt;
==Use Routing Helpers==&lt;br /&gt;
We refactored the treedisplay controller class to use route helpers rather than calling &amp;quot;:action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&amp;quot;, or something similar. This involved many edits in the tree_display_controller.rb file and related controller and view files. Our [https://github.com/Druotic/expertiza Github repo] shows all the changes made.&lt;br /&gt;
&lt;br /&gt;
Example -- Route helpers added to breadcrumbs view file:&lt;br /&gt;
[[File:routehelpers.PNG ]]&lt;br /&gt;
&lt;br /&gt;
==Minimizing the count of Instance Variables==&lt;br /&gt;
=== Instance Variables in Ruby ===&lt;br /&gt;
An instance variable has a name beginning with @, and its scope is confined to whatever object self refers to. Two different objects, even if they belong to the same class, are allowed to have different values for their instance variables. From outside the object, instance variables cannot be altered or even observed (i.e., ruby's instance variables are never public) except by whatever methods are explicitly provided by the programmer. As with globals, instance variables have the nil value until they are initialized.&lt;br /&gt;
&lt;br /&gt;
Instance variables do not need to be declared. This indicates a flexible object structure; in fact, each instance variable is dynamically appended to an object when it is first assigned.&lt;br /&gt;
&lt;br /&gt;
We have observed that in Expertiza, there were several code files related to the Tree Display controller which were observed to be using multiple instance variables which could be reduced. Our team aimed to limit the instantiation of such variables to only necessary places in our code.&lt;br /&gt;
&lt;br /&gt;
==look at the rest of the methods==&lt;br /&gt;
&lt;br /&gt;
=Summary and Conclusions=&lt;br /&gt;
=Future Work=&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91370</id>
		<title>CSC/ECE 517 Fall 2014/oss E1463 vpd</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91370"/>
		<updated>2014-11-03T12:53:30Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* only use 1 instance variable in list method */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''E1463: Refactoring TreeDisplayController''' =&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Project Links=&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Our Expertiza Fork on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/Druotic/expertiza Github Repo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Project Running on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
Admin Account: &amp;lt;br&amp;gt;&lt;br /&gt;
Username: user2 &amp;lt;br&amp;gt;&lt;br /&gt;
Password: password&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Project Description=&lt;br /&gt;
&lt;br /&gt;
For this project, our team refactored the TreeDisplayController class in the [http://expertiza.ncsu.edu/ Expertiza] OSS project. This class provides access to questionnaires, review rubrics, author feedback, courses, assignments, and course evaluations. The tree display lists all of these categories with the ability for the user to &amp;quot;drill down&amp;quot; into the subcategories or just expand/collapse as needed.&lt;br /&gt;
&lt;br /&gt;
'''Example Image Of Tree Display:&lt;br /&gt;
'''&lt;br /&gt;
[[File:Expertiza.PNG ]]&lt;br /&gt;
&lt;br /&gt;
=Refactoring TreeDisplayController Tasks=&lt;br /&gt;
&lt;br /&gt;
As part of the refactoring task, we had to address the following issues for enhancing code readability and maintainability. The tasks include-&lt;br /&gt;
#Changing List to Index using a [http://www.restapitutorial.com/lessons/whatisrest.html RESTful] approach.&lt;br /&gt;
#Use of routing helpers&lt;br /&gt;
#Use {} and [] instead of Hash.new and Array.new&lt;br /&gt;
#Ensuring that instantiation of instance variables is minimized.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Changing List to Index==&lt;br /&gt;
All our code changes can be checked out at our [https://github.com/Druotic/expertiza/pull/1/files Git project repository]. It can be seen that we have replaced all the controller action redirections with a tree_display_index_path which enormously reduces the code content and as well as provides an organized approach to action redirections. &lt;br /&gt;
&lt;br /&gt;
[[File:List_to_Index.png]]&lt;br /&gt;
&lt;br /&gt;
combined all of the goto methods&lt;br /&gt;
&lt;br /&gt;
==Use Routing Helpers==&lt;br /&gt;
We refactored the treedisplay controller class to use route helpers rather than calling &amp;quot;:action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&amp;quot;, or something similar. This involved many edits in the tree_display_controller.rb file and related controller and view files. Our [https://github.com/Druotic/expertiza Github repo] shows all the changes made.&lt;br /&gt;
&lt;br /&gt;
Example -- Route helpers added to breadcrumbs view file:&lt;br /&gt;
[[File:routehelpers.PNG ]]&lt;br /&gt;
&lt;br /&gt;
==Minimizing the count of Instance Variables==&lt;br /&gt;
=== Instance Variables in Ruby ===&lt;br /&gt;
An instance variable has a name beginning with @, and its scope is confined to whatever object self refers to. Two different objects, even if they belong to the same class, are allowed to have different values for their instance variables. From outside the object, instance variables cannot be altered or even observed (i.e., ruby's instance variables are never public) except by whatever methods are explicitly provided by the programmer. As with globals, instance variables have the nil value until they are initialized.&lt;br /&gt;
&lt;br /&gt;
Instance variables do not need to be declared. This indicates a flexible object structure; in fact, each instance variable is dynamically appended to an object when it is first assigned.&lt;br /&gt;
&lt;br /&gt;
We have observed that in Expertiza, there were several code files related to the Tree Display controller which were observed to be using multiple instance variables which could be reduced. Our team aimed to limit the instantiation of such variables to only necessary places in our code.&lt;br /&gt;
&lt;br /&gt;
==look at the rest of the methods==&lt;br /&gt;
&lt;br /&gt;
=Summary and Conclusions=&lt;br /&gt;
=Future Work=&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91369</id>
		<title>CSC/ECE 517 Fall 2014/oss E1463 vpd</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91369"/>
		<updated>2014-11-03T12:22:20Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Changing List to Index */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''E1463: Refactoring TreeDisplayController''' =&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Project Links=&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Our Expertiza Fork on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/Druotic/expertiza Github Repo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Project Running on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
Admin Account: &amp;lt;br&amp;gt;&lt;br /&gt;
Username: user2 &amp;lt;br&amp;gt;&lt;br /&gt;
Password: password&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Project Description=&lt;br /&gt;
&lt;br /&gt;
For this project, our team refactored the TreeDisplayController class in the [http://expertiza.ncsu.edu/ Expertiza] OSS project. This class provides access to questionnaires, review rubrics, author feedback, courses, assignments, and course evaluations. The tree display lists all of these categories with the ability for the user to &amp;quot;drill down&amp;quot; into the subcategories or just expand/collapse as needed.&lt;br /&gt;
&lt;br /&gt;
'''Example Image Of Tree Display:&lt;br /&gt;
'''&lt;br /&gt;
[[File:Expertiza.PNG ]]&lt;br /&gt;
&lt;br /&gt;
=Refactoring TreeDisplayController Tasks=&lt;br /&gt;
&lt;br /&gt;
As part of the refactoring task, we had to address the following issues for enhancing code readability and maintainability. The tasks include-&lt;br /&gt;
#Changing List to Index using a [http://www.restapitutorial.com/lessons/whatisrest.html RESTful] approach.&lt;br /&gt;
#Use of routing helpers&lt;br /&gt;
#Use {} and [] instead of Hash.new and Array.new&lt;br /&gt;
#Ensuring that instantiation of instance variables is minimized.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Changing List to Index==&lt;br /&gt;
All our code changes can be checked out at our [https://github.com/Druotic/expertiza/pull/1/files Git project repository]. It can be seen that we have replaced all the controller action redirections with a tree_display_index_path which enormously reduces the code content and as well as provides an organized approach to action redirections. &lt;br /&gt;
&lt;br /&gt;
[[File:List_to_Index.png]]&lt;br /&gt;
&lt;br /&gt;
combined all of the goto methods&lt;br /&gt;
&lt;br /&gt;
==Use Routing Helpers==&lt;br /&gt;
We refactored the treedisplay controller class to use route helpers rather than calling &amp;quot;:action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&amp;quot;, or something similar. This involved many edits in the tree_display_controller.rb file and related controller and view files. Our [https://github.com/Druotic/expertiza Github repo] shows all the changes made.&lt;br /&gt;
&lt;br /&gt;
Example -- Route helpers added to breadcrumbs view file:&lt;br /&gt;
[[File:routehelpers.PNG ]]&lt;br /&gt;
&lt;br /&gt;
==only use 1 instance variable in list method==&lt;br /&gt;
&lt;br /&gt;
==look at the rest of the methods==&lt;br /&gt;
&lt;br /&gt;
=Summary and Conclusions=&lt;br /&gt;
=Future Work=&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91368</id>
		<title>CSC/ECE 517 Fall 2014/oss E1463 vpd</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91368"/>
		<updated>2014-11-03T12:17:59Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Changing List to Index */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''E1463: Refactoring TreeDisplayController''' =&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Project Links=&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Our Expertiza Fork on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/Druotic/expertiza Github Repo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Project Running on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
Admin Account: &amp;lt;br&amp;gt;&lt;br /&gt;
Username: user2 &amp;lt;br&amp;gt;&lt;br /&gt;
Password: password&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Project Description=&lt;br /&gt;
&lt;br /&gt;
For this project, our team refactored the TreeDisplayController class in the [http://expertiza.ncsu.edu/ Expertiza] OSS project. This class provides access to questionnaires, review rubrics, author feedback, courses, assignments, and course evaluations. The tree display lists all of these categories with the ability for the user to &amp;quot;drill down&amp;quot; into the subcategories or just expand/collapse as needed.&lt;br /&gt;
&lt;br /&gt;
'''Example Image Of Tree Display:&lt;br /&gt;
'''&lt;br /&gt;
[[File:Expertiza.PNG ]]&lt;br /&gt;
&lt;br /&gt;
=Refactoring TreeDisplayController Tasks=&lt;br /&gt;
&lt;br /&gt;
As part of the refactoring task, we had to address the following issues for enhancing code readability and maintainability. The tasks include-&lt;br /&gt;
#Changing List to Index using a [http://www.restapitutorial.com/lessons/whatisrest.html RESTful] approach.&lt;br /&gt;
#Use of routing helpers&lt;br /&gt;
#Use {} and [] instead of Hash.new and Array.new&lt;br /&gt;
#Ensuring that instantiation of instance variables is minimized.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Changing List to Index==&lt;br /&gt;
All our code changes can be checked out at our [https://github.com/Druotic/expertiza/pull/1/files Git project repository]. It can be seen that we have replaced all the controller action redirections with a tree_display_index_path which enormously reduces the code content and as well as provides an organized approach to action redirections. &lt;br /&gt;
&lt;br /&gt;
[[File:List to Index.png]&lt;br /&gt;
&lt;br /&gt;
combined all of the goto methods&lt;br /&gt;
&lt;br /&gt;
==Use Routing Helpers==&lt;br /&gt;
We refactored the treedisplay controller class to use route helpers rather than calling &amp;quot;:action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&amp;quot;, or something similar. This involved many edits in the tree_display_controller.rb file and related controller and view files. Our [https://github.com/Druotic/expertiza Github repo] shows all the changes made.&lt;br /&gt;
&lt;br /&gt;
Example -- Route helpers added to breadcrumbs view file:&lt;br /&gt;
[[File:routehelpers.PNG ]]&lt;br /&gt;
&lt;br /&gt;
==only use 1 instance variable in list method==&lt;br /&gt;
&lt;br /&gt;
==look at the rest of the methods==&lt;br /&gt;
&lt;br /&gt;
=Summary and Conclusions=&lt;br /&gt;
=Future Work=&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:List_to_Index.png&amp;diff=91367</id>
		<title>File:List to Index.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:List_to_Index.png&amp;diff=91367"/>
		<updated>2014-11-03T12:13:08Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: A brief screen of the Git repo diff page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A brief screen of the Git repo diff page.&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91366</id>
		<title>CSC/ECE 517 Fall 2014/oss E1463 vpd</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1463_vpd&amp;diff=91366"/>
		<updated>2014-11-03T12:11:36Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Refactoring TreeDisplayController Tasks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''E1463: Refactoring TreeDisplayController''' =&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Project Links=&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Our Expertiza Fork on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/Druotic/expertiza Github Repo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://ec2-54-186-80-176.us-west-2.compute.amazonaws.com:3000/ Project Running on AWS]&amp;lt;br&amp;gt;&lt;br /&gt;
Admin Account: &amp;lt;br&amp;gt;&lt;br /&gt;
Username: user2 &amp;lt;br&amp;gt;&lt;br /&gt;
Password: password&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Project Description=&lt;br /&gt;
&lt;br /&gt;
For this project, our team refactored the TreeDisplayController class in the [http://expertiza.ncsu.edu/ Expertiza] OSS project. This class provides access to questionnaires, review rubrics, author feedback, courses, assignments, and course evaluations. The tree display lists all of these categories with the ability for the user to &amp;quot;drill down&amp;quot; into the subcategories or just expand/collapse as needed.&lt;br /&gt;
&lt;br /&gt;
'''Example Image Of Tree Display:&lt;br /&gt;
'''&lt;br /&gt;
[[File:Expertiza.PNG ]]&lt;br /&gt;
&lt;br /&gt;
=Refactoring TreeDisplayController Tasks=&lt;br /&gt;
&lt;br /&gt;
As part of the refactoring task, we had to address the following issues for enhancing code readability and maintainability. The tasks include-&lt;br /&gt;
#Changing List to Index using a [http://www.restapitutorial.com/lessons/whatisrest.html RESTful] approach.&lt;br /&gt;
#Use of routing helpers&lt;br /&gt;
#Use {} and [] instead of Hash.new and Array.new&lt;br /&gt;
#Ensuring that instantiation of instance variables is minimized.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Changing List to Index==&lt;br /&gt;
All our code changes can be checked out at our [https://github.com/Druotic/expertiza/pull/1/files Git project repository]. It can be seen that we have replaced all the controller action redirections with a tree_display_index_path which enormously reduces the code content and as well as provides an organized approach to action redirections. &lt;br /&gt;
&lt;br /&gt;
[[File:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
combined all of the goto methods&lt;br /&gt;
&lt;br /&gt;
==Use Routing Helpers==&lt;br /&gt;
We refactored the treedisplay controller class to use route helpers rather than calling &amp;quot;:action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&amp;quot;, or something similar. This involved many edits in the tree_display_controller.rb file and related controller and view files. Our [https://github.com/Druotic/expertiza Github repo] shows all the changes made.&lt;br /&gt;
&lt;br /&gt;
Example -- Route helpers added to breadcrumbs view file:&lt;br /&gt;
[[File:routehelpers.PNG ]]&lt;br /&gt;
&lt;br /&gt;
==only use 1 instance variable in list method==&lt;br /&gt;
&lt;br /&gt;
==look at the rest of the methods==&lt;br /&gt;
&lt;br /&gt;
=Summary and Conclusions=&lt;br /&gt;
=Future Work=&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014&amp;diff=90198</id>
		<title>CSC/ECE 517 Fall 2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014&amp;diff=90198"/>
		<updated>2014-10-29T00:51:43Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[CSC/ECE_517_Fall_2014/sample_page]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 22 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 19 mx]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 3 zq]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 4 lf]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 4 wl]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a a7 ch]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 rs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 jf]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 8 os]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 8 sn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 15 gs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 10 hu]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 20 kv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 21 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 24 sa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 26 sn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 6 rl]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 2 ss]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 16 av]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 1 rm]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 1 sj]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 23 ss]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 20 rn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 22 sp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss M1454 rss]]&lt;br /&gt;
&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 26 gn]]&lt;br /&gt;
&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 13 va]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 9 aa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 9 kn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 11 ap]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 ks]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 7 kz]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a_6_bn]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 10 zz]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 16 va]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a F1415 rv]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a_3_cp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1b 26 sa]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_28_cg]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b 29 ry]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b 30 cs]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_33_jy]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_27_js]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss E1463 vpd]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss E1465 oak]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_M1456_kdv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_M1453_sst]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_E1456_akk]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_M1455_asa]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1458_sst]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1457_ags]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1466_gjf]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_M1452_jns]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1462_nms]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_S1455_ajp]]&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=88647</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=88647"/>
		<updated>2014-09-26T02:31:46Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Real Power-Git Branches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png|center]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-	&lt;br /&gt;
! Author(s)&lt;br /&gt;
| Ravish Roshan, Vikas Piddempally&lt;br /&gt;
|-&lt;br /&gt;
! Initial release&lt;br /&gt;
| 7 April 2005&lt;br /&gt;
|-&lt;br /&gt;
! Written in&lt;br /&gt;
| C, Bourne Shell, Tcl, Perl&lt;br /&gt;
|-&lt;br /&gt;
! Operating Systems&lt;br /&gt;
| Linux, POSIX, Windows, OS X&lt;br /&gt;
|- &lt;br /&gt;
! Type&lt;br /&gt;
| Version Control&lt;br /&gt;
|- &lt;br /&gt;
! License&lt;br /&gt;
| GNU General Public License v2&lt;br /&gt;
|-&lt;br /&gt;
! Website&lt;br /&gt;
| [http://git-scm.com/ git-scm.com]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] originally designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005 with emphasis on managing Linux source code without requiring a central server, and has since then become the most widely adopted version control system for software development. Git facilitates a system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially&lt;br /&gt;
&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as listed below:&lt;br /&gt;
&lt;br /&gt;
*Speed&lt;br /&gt;
*Simple design&lt;br /&gt;
*Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
*Fully distributed&lt;br /&gt;
*Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-A-Short-History-of-Git Getting started a short history of Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
=== Centralized Version Control System ===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed. &amp;lt;br/&amp;gt;Most modern version control systems deal with “changesets”, which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. &amp;lt;br/&amp;gt;For example: a change to a C header file and the corresponding .c file should always be kept together. &amp;lt;br/&amp;gt;Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly. &amp;lt;br/&amp;gt;Some of the most popular centralized version control systems are [http://www.nongnu.org/cvs/ CVS], [https://subversion.apache.org/ Subversion (or SVN)] and [http://www.perforce.com/ Perforce].&lt;br /&gt;
&lt;br /&gt;
=== Distributed Version Control System ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control System (DRCS)] takes a [https://en.wikipedia.org/wiki/Peer-to-peer peer-to-peer] approach, as opposed to the [https://en.wikipedia.org/wiki/Client%E2%80%93server_model client-server] approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&amp;lt;ref&amp;gt;[http://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of Revision Control Software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why use Git? &amp;lt;ref&amp;gt;[http://thkoch2001.github.io/whygitisbetter/ Why Git is better than X]&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
=== Branching Model ===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&amp;lt;ref&amp;gt;[https://www.atlassian.com/git/articles/simple-git-workflow-is-simple/ Git workflow is simple]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Git_(software)#Characteristics Git Characteristics]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:Git-3.png|center]]&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository Git Basics Chapter 1]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-Git-Basics Git Basics Chapter 2]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[http://code.tutsplus.com/tutorials/easy-version-control-with-git--net-7449 Easy Version Control System with Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Real Power-Git Branches==&lt;br /&gt;
Branches allow to diverge from the main line of development. This allows developers to work on bug fixes and new features without interfering with the main (live) branch (master). Later you can merge branches with each other or with the master branch. The basics are quite simple:&lt;br /&gt;
&lt;br /&gt;
Open up a new branch: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git checkout -b &amp;lt;branchname&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To list all the branches,a user can use the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt; git branch &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To merge a branch into the main branch (commonly refered as master),one can use the below command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 git merge &amp;lt;branch name&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the branch is not needed anymore, delete it using the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 git branch -d testing&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the easiest example of branching, there are more advanced options possible like 3-way merging (merging various branches at once) and rebasing.&lt;br /&gt;
&amp;lt;ref&amp;gt;[http://git-scm.com/book/ch3-6.html Git Rebasing]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Merging &amp;amp; Branching in a Nut Shell'''&lt;br /&gt;
&lt;br /&gt;
In a nutshell you can create a branch with git branch (branchname), switch into that context with git checkout (branchname), record commit snapshots while in that context, then can switch back and forth easily. When you switch branches, Git replaces your working directory with the snapshot of the latest commit on that branch so you don't have to have multiple directories for multiple branches. You merge branches together with git merge. You can easily merge multiple times from the same branch over time, or alternately you can choose to delete a branch immediately after merging it.&lt;br /&gt;
&lt;br /&gt;
== Comparison of various Version Control Softwares ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: center; width: auto;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Software&lt;br /&gt;
! Programming language&lt;br /&gt;
! Storage method&lt;br /&gt;
! Scope of change&lt;br /&gt;
! #Revision IDs|Revision IDs&lt;br /&gt;
! Protocol (computing)|Network protocols&lt;br /&gt;
! Source code size	&lt;br /&gt;
|-	&lt;br /&gt;
! [http://bazaar.canonical.com/en/ GNU Bazaar]&lt;br /&gt;
| Python, Pyrex , C&lt;br /&gt;
| Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| Pseudorandom&lt;br /&gt;
| custom&lt;br /&gt;
| 4.1 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.bitkeeper.com/ BitKeeper]&lt;br /&gt;
| C (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Changeset keys, numbers&lt;br /&gt;
| custom, Hypertext Transfer Protocol, Remote Shell, secure shell, email&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www-03.ibm.com/software/products/en/clearcase ClearCase]&lt;br /&gt;
| C (programming language)|C, Java (programming language), Perl&lt;br /&gt;
| Changeset&lt;br /&gt;
| File and Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom (CCFS), custom (MultiVersion File System|MVFS filesystem driver), Hypertext Transfer Protocol&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.relisoft.com/co_op/ Code Co-op]&lt;br /&gt;
| C++&lt;br /&gt;
| Changeset&lt;br /&gt;
| Unknown&lt;br /&gt;
| User ID-Ordinal&lt;br /&gt;
| e-mail (Messaging Application Programming Interface|MAPI, SMTP/POP3, Gmail), Local area network&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.nongnu.org/cvs/ CVS]&lt;br /&gt;
| C (programming language)|C&lt;br /&gt;
| Changeset&lt;br /&gt;
| File&lt;br /&gt;
| Numbers&lt;br /&gt;
| pserver, Secure Shell|ssh&lt;br /&gt;
| 3.3 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git]&lt;br /&gt;
| C (programming language)|C, shell scripts, Perl&lt;br /&gt;
| Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| SHA-1 hashes&lt;br /&gt;
| custom (''git''), custom over Secure Shell, Hypertext Transfer Protocol, rsync, email, bundles&lt;br /&gt;
| 10.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [https://www.gnu.org/software/gnu-arch/ GNU arch]&lt;br /&gt;
| C (programming language), shell scripts&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| Hypertext Transfer Protocol, WebDAV&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://dev.libresource.org/ LibreSource Synchronizer]&lt;br /&gt;
| Java (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Unknown&lt;br /&gt;
| Timestamps&lt;br /&gt;
| Hypertext Transfer Protocol, File-System&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| Python (programming language)|Python, C (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom over secure shell, Hypertext Transfer Protocol&lt;br /&gt;
| 1.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.perforce.com Perforce]&lt;br /&gt;
| C++, C (programming language)|C&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ Subversion]&lt;br /&gt;
| C (programming language)|C&lt;br /&gt;
| Changeset and Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom over Secure Shell, Hypertext Transfer Protocol&lt;br /&gt;
| 5.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://msdn.microsoft.com/en-us/vstudio/ff637362.aspx Team Foundation Server]&lt;br /&gt;
| C++ and C Sharp (programming language)|C#&lt;br /&gt;
| Changeset&lt;br /&gt;
| File and Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| SOAP over HTTP or HTTPS&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
|}&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of revision control software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=88646</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=88646"/>
		<updated>2014-09-26T02:30:19Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Real Power-Git Branches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png|center]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-	&lt;br /&gt;
! Author(s)&lt;br /&gt;
| Ravish Roshan, Vikas Piddempally&lt;br /&gt;
|-&lt;br /&gt;
! Initial release&lt;br /&gt;
| 7 April 2005&lt;br /&gt;
|-&lt;br /&gt;
! Written in&lt;br /&gt;
| C, Bourne Shell, Tcl, Perl&lt;br /&gt;
|-&lt;br /&gt;
! Operating Systems&lt;br /&gt;
| Linux, POSIX, Windows, OS X&lt;br /&gt;
|- &lt;br /&gt;
! Type&lt;br /&gt;
| Version Control&lt;br /&gt;
|- &lt;br /&gt;
! License&lt;br /&gt;
| GNU General Public License v2&lt;br /&gt;
|-&lt;br /&gt;
! Website&lt;br /&gt;
| [http://git-scm.com/ git-scm.com]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] originally designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005 with emphasis on managing Linux source code without requiring a central server, and has since then become the most widely adopted version control system for software development. Git facilitates a system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially&lt;br /&gt;
&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as listed below:&lt;br /&gt;
&lt;br /&gt;
*Speed&lt;br /&gt;
*Simple design&lt;br /&gt;
*Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
*Fully distributed&lt;br /&gt;
*Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-A-Short-History-of-Git Getting started a short history of Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
=== Centralized Version Control System ===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed. &amp;lt;br/&amp;gt;Most modern version control systems deal with “changesets”, which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. &amp;lt;br/&amp;gt;For example: a change to a C header file and the corresponding .c file should always be kept together. &amp;lt;br/&amp;gt;Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly. &amp;lt;br/&amp;gt;Some of the most popular centralized version control systems are [http://www.nongnu.org/cvs/ CVS], [https://subversion.apache.org/ Subversion (or SVN)] and [http://www.perforce.com/ Perforce].&lt;br /&gt;
&lt;br /&gt;
=== Distributed Version Control System ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control System (DRCS)] takes a [https://en.wikipedia.org/wiki/Peer-to-peer peer-to-peer] approach, as opposed to the [https://en.wikipedia.org/wiki/Client%E2%80%93server_model client-server] approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&amp;lt;ref&amp;gt;[http://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of Revision Control Software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why use Git? &amp;lt;ref&amp;gt;[http://thkoch2001.github.io/whygitisbetter/ Why Git is better than X]&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
=== Branching Model ===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&amp;lt;ref&amp;gt;[https://www.atlassian.com/git/articles/simple-git-workflow-is-simple/ Git workflow is simple]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Git_(software)#Characteristics Git Characteristics]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:Git-3.png|center]]&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository Git Basics Chapter 1]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-Git-Basics Git Basics Chapter 2]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[http://code.tutsplus.com/tutorials/easy-version-control-with-git--net-7449 Easy Version Control System with Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Real Power-Git Branches==&lt;br /&gt;
Branches allow to diverge from the main line of development. This allows developers to work on bug fixes and new features without interfering with the main (live) branch (master). Later you can merge branches with each other or with the master branch. The basics are quite simple:&lt;br /&gt;
&lt;br /&gt;
Open up a new branch: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git checkout -b &amp;lt;branchname&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To list all the branches,a user can use the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt; git branch &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To merge a branch into the main branch (commonly refered as master),one can use the below command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 git merge &amp;lt;branch name&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the branch is not needed anymore, delete it using the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 git branch -d testing&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the easiest example of branching, there are more advanced options possible like 3-way merging (merging various branches at once) and rebasing.&lt;br /&gt;
&amp;lt;ref&amp;gt;[http://git-scm.com/book/ch3-6.html]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Merging &amp;amp; Branching in a Nut Shell'''&lt;br /&gt;
&lt;br /&gt;
In a nutshell you can create a branch with git branch (branchname), switch into that context with git checkout (branchname), record commit snapshots while in that context, then can switch back and forth easily. When you switch branches, Git replaces your working directory with the snapshot of the latest commit on that branch so you don't have to have multiple directories for multiple branches. You merge branches together with git merge. You can easily merge multiple times from the same branch over time, or alternately you can choose to delete a branch immediately after merging it.&lt;br /&gt;
&lt;br /&gt;
== Comparison of various Version Control Softwares ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: center; width: auto;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Software&lt;br /&gt;
! Programming language&lt;br /&gt;
! Storage method&lt;br /&gt;
! Scope of change&lt;br /&gt;
! #Revision IDs|Revision IDs&lt;br /&gt;
! Protocol (computing)|Network protocols&lt;br /&gt;
! Source code size	&lt;br /&gt;
|-	&lt;br /&gt;
! [http://bazaar.canonical.com/en/ GNU Bazaar]&lt;br /&gt;
| Python, Pyrex , C&lt;br /&gt;
| Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| Pseudorandom&lt;br /&gt;
| custom&lt;br /&gt;
| 4.1 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.bitkeeper.com/ BitKeeper]&lt;br /&gt;
| C (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Changeset keys, numbers&lt;br /&gt;
| custom, Hypertext Transfer Protocol, Remote Shell, secure shell, email&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www-03.ibm.com/software/products/en/clearcase ClearCase]&lt;br /&gt;
| C (programming language)|C, Java (programming language), Perl&lt;br /&gt;
| Changeset&lt;br /&gt;
| File and Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom (CCFS), custom (MultiVersion File System|MVFS filesystem driver), Hypertext Transfer Protocol&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.relisoft.com/co_op/ Code Co-op]&lt;br /&gt;
| C++&lt;br /&gt;
| Changeset&lt;br /&gt;
| Unknown&lt;br /&gt;
| User ID-Ordinal&lt;br /&gt;
| e-mail (Messaging Application Programming Interface|MAPI, SMTP/POP3, Gmail), Local area network&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.nongnu.org/cvs/ CVS]&lt;br /&gt;
| C (programming language)|C&lt;br /&gt;
| Changeset&lt;br /&gt;
| File&lt;br /&gt;
| Numbers&lt;br /&gt;
| pserver, Secure Shell|ssh&lt;br /&gt;
| 3.3 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git]&lt;br /&gt;
| C (programming language)|C, shell scripts, Perl&lt;br /&gt;
| Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| SHA-1 hashes&lt;br /&gt;
| custom (''git''), custom over Secure Shell, Hypertext Transfer Protocol, rsync, email, bundles&lt;br /&gt;
| 10.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [https://www.gnu.org/software/gnu-arch/ GNU arch]&lt;br /&gt;
| C (programming language), shell scripts&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| Hypertext Transfer Protocol, WebDAV&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://dev.libresource.org/ LibreSource Synchronizer]&lt;br /&gt;
| Java (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Unknown&lt;br /&gt;
| Timestamps&lt;br /&gt;
| Hypertext Transfer Protocol, File-System&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| Python (programming language)|Python, C (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom over secure shell, Hypertext Transfer Protocol&lt;br /&gt;
| 1.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.perforce.com Perforce]&lt;br /&gt;
| C++, C (programming language)|C&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ Subversion]&lt;br /&gt;
| C (programming language)|C&lt;br /&gt;
| Changeset and Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom over Secure Shell, Hypertext Transfer Protocol&lt;br /&gt;
| 5.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://msdn.microsoft.com/en-us/vstudio/ff637362.aspx Team Foundation Server]&lt;br /&gt;
| C++ and C Sharp (programming language)|C#&lt;br /&gt;
| Changeset&lt;br /&gt;
| File and Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| SOAP over HTTP or HTTPS&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
|}&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of revision control software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=88641</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=88641"/>
		<updated>2014-09-26T02:27:34Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png|center]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-	&lt;br /&gt;
! Author(s)&lt;br /&gt;
| Ravish Roshan, Vikas Piddempally&lt;br /&gt;
|-&lt;br /&gt;
! Initial release&lt;br /&gt;
| 7 April 2005&lt;br /&gt;
|-&lt;br /&gt;
! Written in&lt;br /&gt;
| C, Bourne Shell, Tcl, Perl&lt;br /&gt;
|-&lt;br /&gt;
! Operating Systems&lt;br /&gt;
| Linux, POSIX, Windows, OS X&lt;br /&gt;
|- &lt;br /&gt;
! Type&lt;br /&gt;
| Version Control&lt;br /&gt;
|- &lt;br /&gt;
! License&lt;br /&gt;
| GNU General Public License v2&lt;br /&gt;
|-&lt;br /&gt;
! Website&lt;br /&gt;
| [http://git-scm.com/ git-scm.com]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] originally designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005 with emphasis on managing Linux source code without requiring a central server, and has since then become the most widely adopted version control system for software development. Git facilitates a system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially&lt;br /&gt;
&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as listed below:&lt;br /&gt;
&lt;br /&gt;
*Speed&lt;br /&gt;
*Simple design&lt;br /&gt;
*Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
*Fully distributed&lt;br /&gt;
*Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-A-Short-History-of-Git Getting started a short history of Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
=== Centralized Version Control System ===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed. &amp;lt;br/&amp;gt;Most modern version control systems deal with “changesets”, which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. &amp;lt;br/&amp;gt;For example: a change to a C header file and the corresponding .c file should always be kept together. &amp;lt;br/&amp;gt;Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly. &amp;lt;br/&amp;gt;Some of the most popular centralized version control systems are [http://www.nongnu.org/cvs/ CVS], [https://subversion.apache.org/ Subversion (or SVN)] and [http://www.perforce.com/ Perforce].&lt;br /&gt;
&lt;br /&gt;
=== Distributed Version Control System ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control System (DRCS)] takes a [https://en.wikipedia.org/wiki/Peer-to-peer peer-to-peer] approach, as opposed to the [https://en.wikipedia.org/wiki/Client%E2%80%93server_model client-server] approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&amp;lt;ref&amp;gt;[http://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of Revision Control Software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why use Git? &amp;lt;ref&amp;gt;[http://thkoch2001.github.io/whygitisbetter/ Why Git is better than X]&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
=== Branching Model ===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&amp;lt;ref&amp;gt;[https://www.atlassian.com/git/articles/simple-git-workflow-is-simple/ Git workflow is simple]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Git_(software)#Characteristics Git Characteristics]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:Git-3.png|center]]&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository Git Basics Chapter 1]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-Git-Basics Git Basics Chapter 2]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[http://code.tutsplus.com/tutorials/easy-version-control-with-git--net-7449 Easy Version Control System with Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Real Power-Git Branches==&lt;br /&gt;
Branches allow to diverge from the main line of development. This allows developers to work on bug fixes and new features without interfering with the main (live) branch (master). Later you can merge branches with each other or with the master branch. The basics are quite simple:&lt;br /&gt;
&lt;br /&gt;
Open up a new branch: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git checkout -b &amp;lt;branchname&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To list all the branches,a user can use the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt; git branch &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To merge a branch into the main branch (commonly refered as master),one can use the below command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 git merge &amp;lt;branch name&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the branch is not needed anymore, delete it using the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 git branch -d testing&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the easiest example of branching, there are more advanced options possible like 3-way merging (merging various branches at once) and rebasing.&lt;br /&gt;
&lt;br /&gt;
'''Merging &amp;amp; Branching in a Nut Shell'''&lt;br /&gt;
&lt;br /&gt;
In a nutshell you can create a branch with git branch (branchname), switch into that context with git checkout (branchname), record commit snapshots while in that context, then can switch back and forth easily. When you switch branches, Git replaces your working directory with the snapshot of the latest commit on that branch so you don't have to have multiple directories for multiple branches. You merge branches together with git merge. You can easily merge multiple times from the same branch over time, or alternately you can choose to delete a branch immediately after merging it.&lt;br /&gt;
&lt;br /&gt;
== Comparison of various Version Control Softwares ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: center; width: auto;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Software&lt;br /&gt;
! Programming language&lt;br /&gt;
! Storage method&lt;br /&gt;
! Scope of change&lt;br /&gt;
! #Revision IDs|Revision IDs&lt;br /&gt;
! Protocol (computing)|Network protocols&lt;br /&gt;
! Source code size	&lt;br /&gt;
|-	&lt;br /&gt;
! [http://bazaar.canonical.com/en/ GNU Bazaar]&lt;br /&gt;
| Python, Pyrex , C&lt;br /&gt;
| Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| Pseudorandom&lt;br /&gt;
| custom&lt;br /&gt;
| 4.1 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.bitkeeper.com/ BitKeeper]&lt;br /&gt;
| C (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Changeset keys, numbers&lt;br /&gt;
| custom, Hypertext Transfer Protocol, Remote Shell, secure shell, email&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www-03.ibm.com/software/products/en/clearcase ClearCase]&lt;br /&gt;
| C (programming language)|C, Java (programming language), Perl&lt;br /&gt;
| Changeset&lt;br /&gt;
| File and Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom (CCFS), custom (MultiVersion File System|MVFS filesystem driver), Hypertext Transfer Protocol&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.relisoft.com/co_op/ Code Co-op]&lt;br /&gt;
| C++&lt;br /&gt;
| Changeset&lt;br /&gt;
| Unknown&lt;br /&gt;
| User ID-Ordinal&lt;br /&gt;
| e-mail (Messaging Application Programming Interface|MAPI, SMTP/POP3, Gmail), Local area network&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.nongnu.org/cvs/ CVS]&lt;br /&gt;
| C (programming language)|C&lt;br /&gt;
| Changeset&lt;br /&gt;
| File&lt;br /&gt;
| Numbers&lt;br /&gt;
| pserver, Secure Shell|ssh&lt;br /&gt;
| 3.3 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git]&lt;br /&gt;
| C (programming language)|C, shell scripts, Perl&lt;br /&gt;
| Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| SHA-1 hashes&lt;br /&gt;
| custom (''git''), custom over Secure Shell, Hypertext Transfer Protocol, rsync, email, bundles&lt;br /&gt;
| 10.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [https://www.gnu.org/software/gnu-arch/ GNU arch]&lt;br /&gt;
| C (programming language), shell scripts&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| Hypertext Transfer Protocol, WebDAV&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://dev.libresource.org/ LibreSource Synchronizer]&lt;br /&gt;
| Java (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Unknown&lt;br /&gt;
| Timestamps&lt;br /&gt;
| Hypertext Transfer Protocol, File-System&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| Python (programming language)|Python, C (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom over secure shell, Hypertext Transfer Protocol&lt;br /&gt;
| 1.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.perforce.com Perforce]&lt;br /&gt;
| C++, C (programming language)|C&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ Subversion]&lt;br /&gt;
| C (programming language)|C&lt;br /&gt;
| Changeset and Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom over Secure Shell, Hypertext Transfer Protocol&lt;br /&gt;
| 5.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://msdn.microsoft.com/en-us/vstudio/ff637362.aspx Team Foundation Server]&lt;br /&gt;
| C++ and C Sharp (programming language)|C#&lt;br /&gt;
| Changeset&lt;br /&gt;
| File and Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| SOAP over HTTP or HTTPS&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
|}&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of revision control software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=88635</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=88635"/>
		<updated>2014-09-26T02:19:50Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* How do I use Git? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png|center]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-	&lt;br /&gt;
! Author(s)&lt;br /&gt;
| Ravish Roshan, Vikas Piddempally&lt;br /&gt;
|-&lt;br /&gt;
! Initial release&lt;br /&gt;
| 7 April 2005&lt;br /&gt;
|-&lt;br /&gt;
! Written in&lt;br /&gt;
| C, Bourne Shell, Tcl, Perl&lt;br /&gt;
|-&lt;br /&gt;
! Operating Systems&lt;br /&gt;
| Linux, POSIX, Windows, OS X&lt;br /&gt;
|- &lt;br /&gt;
! Type&lt;br /&gt;
| Version Control&lt;br /&gt;
|- &lt;br /&gt;
! License&lt;br /&gt;
| GNU General Public License v2&lt;br /&gt;
|-&lt;br /&gt;
! Website&lt;br /&gt;
| [http://git-scm.com/ git-scm.com]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development.&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as follows:&lt;br /&gt;
&lt;br /&gt;
*Speed&lt;br /&gt;
*Simple design&lt;br /&gt;
*Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
*Fully distributed&lt;br /&gt;
*Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-A-Short-History-of-Git Getting started a short history of Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
=== Centralized Version Control System ===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed. &amp;lt;br/&amp;gt;Most modern version control systems deal with “changesets”, which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. &amp;lt;br/&amp;gt;For example: a change to a C header file and the corresponding .c file should always be kept together. &amp;lt;br/&amp;gt;Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly. &amp;lt;br/&amp;gt;Some of the most popular centralized version control systems are [http://www.nongnu.org/cvs/ CVS], [https://subversion.apache.org/ Subversion (or SVN)] and [http://www.perforce.com/ Perforce].&lt;br /&gt;
&lt;br /&gt;
=== Distributed Version Control System ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control System (DRCS)] takes a [https://en.wikipedia.org/wiki/Peer-to-peer peer-to-peer] approach, as opposed to the [https://en.wikipedia.org/wiki/Client%E2%80%93server_model client-server] approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&amp;lt;ref&amp;gt;[http://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of Revision Control Software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why use Git? &amp;lt;ref&amp;gt;[http://thkoch2001.github.io/whygitisbetter/ Why Git is better than X]&amp;lt;/ref&amp;gt; ==&lt;br /&gt;
=== Branching Model ===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&amp;lt;ref&amp;gt;[https://www.atlassian.com/git/articles/simple-git-workflow-is-simple/ Git workflow is simple]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Git_(software)#Characteristics Git Characteristics]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:Git-3.png|center]]&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository Git Basics Chapter 1]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-Git-Basics Git Basics Chapter 2]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[http://code.tutsplus.com/tutorials/easy-version-control-with-git--net-7449 Easy Version Control System with Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Real Power-Git Branches==&lt;br /&gt;
Branches allow to diverge from the main line of development. This allows developers to work on bug fixes and new features without interfering with the main (live) branch (master). Later you can merge branches with each other or with the master branch. The basics are quite simple:&lt;br /&gt;
&lt;br /&gt;
Open up a new branch: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git checkout -b &amp;lt;branchname&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To list all the branches,a user can use the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt; git branch &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To merge a branch into the main branch (commonly refered as master),one can use the below command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 git merge &amp;lt;branch name&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the branch is not needed anymore, delete it using the following command.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 git branch -d testing&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the easiest example of branching, there are more advanced options possible like 3-way merging (merging various branches at once) and rebasing.&lt;br /&gt;
&lt;br /&gt;
'''Merging &amp;amp; Branching in a Nut Shell'''&lt;br /&gt;
&lt;br /&gt;
In a nutshell you can create a branch with git branch (branchname), switch into that context with git checkout (branchname), record commit snapshots while in that context, then can switch back and forth easily. When you switch branches, Git replaces your working directory with the snapshot of the latest commit on that branch so you don't have to have multiple directories for multiple branches. You merge branches together with git merge. You can easily merge multiple times from the same branch over time, or alternately you can choose to delete a branch immediately after merging it.&lt;br /&gt;
&lt;br /&gt;
== Comparison of various Version Control Softwares ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align: center; width: auto;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Software&lt;br /&gt;
! Programming language&lt;br /&gt;
! Storage method&lt;br /&gt;
! Scope of change&lt;br /&gt;
! #Revision IDs|Revision IDs&lt;br /&gt;
! Protocol (computing)|Network protocols&lt;br /&gt;
! Source code size	&lt;br /&gt;
|-	&lt;br /&gt;
! [http://bazaar.canonical.com/en/ GNU Bazaar]&lt;br /&gt;
| Python, Pyrex , C&lt;br /&gt;
| Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| Pseudorandom&lt;br /&gt;
| custom&lt;br /&gt;
| 4.1 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.bitkeeper.com/ BitKeeper]&lt;br /&gt;
| C (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Changeset keys, numbers&lt;br /&gt;
| custom, Hypertext Transfer Protocol, Remote Shell, secure shell, email&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www-03.ibm.com/software/products/en/clearcase ClearCase]&lt;br /&gt;
| C (programming language)|C, Java (programming language), Perl&lt;br /&gt;
| Changeset&lt;br /&gt;
| File and Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom (CCFS), custom (MultiVersion File System|MVFS filesystem driver), Hypertext Transfer Protocol&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.relisoft.com/co_op/ Code Co-op]&lt;br /&gt;
| C++&lt;br /&gt;
| Changeset&lt;br /&gt;
| Unknown&lt;br /&gt;
| User ID-Ordinal&lt;br /&gt;
| e-mail (Messaging Application Programming Interface|MAPI, SMTP/POP3, Gmail), Local area network&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.nongnu.org/cvs/ CVS]&lt;br /&gt;
| C (programming language)|C&lt;br /&gt;
| Changeset&lt;br /&gt;
| File&lt;br /&gt;
| Numbers&lt;br /&gt;
| pserver, Secure Shell|ssh&lt;br /&gt;
| 3.3 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git]&lt;br /&gt;
| C (programming language)|C, shell scripts, Perl&lt;br /&gt;
| Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| SHA-1 hashes&lt;br /&gt;
| custom (''git''), custom over Secure Shell, Hypertext Transfer Protocol, rsync, email, bundles&lt;br /&gt;
| 10.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [https://www.gnu.org/software/gnu-arch/ GNU arch]&lt;br /&gt;
| C (programming language), shell scripts&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| Hypertext Transfer Protocol, WebDAV&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://dev.libresource.org/ LibreSource Synchronizer]&lt;br /&gt;
| Java (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Unknown&lt;br /&gt;
| Timestamps&lt;br /&gt;
| Hypertext Transfer Protocol, File-System&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| Python (programming language)|Python, C (programming language)&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom over secure shell, Hypertext Transfer Protocol&lt;br /&gt;
| 1.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://www.perforce.com Perforce]&lt;br /&gt;
| C++, C (programming language)|C&lt;br /&gt;
| Changeset&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ Subversion]&lt;br /&gt;
| C (programming language)|C&lt;br /&gt;
| Changeset and Snapshot&lt;br /&gt;
| Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| custom over Secure Shell, Hypertext Transfer Protocol&lt;br /&gt;
| 5.2 MB&lt;br /&gt;
|-&lt;br /&gt;
! [http://msdn.microsoft.com/en-us/vstudio/ff637362.aspx Team Foundation Server]&lt;br /&gt;
| C++ and C Sharp (programming language)|C#&lt;br /&gt;
| Changeset&lt;br /&gt;
| File and Tree&lt;br /&gt;
| Numbers&lt;br /&gt;
| SOAP over HTTP or HTTPS&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
|}&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of revision control software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Git-3.png&amp;diff=88624</id>
		<title>File:Git-3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Git-3.png&amp;diff=88624"/>
		<updated>2014-09-26T02:01:56Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: Git Hub Data Flow&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git Hub Data Flow&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87707</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87707"/>
		<updated>2014-09-20T02:53:04Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* How do I use Git? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development.&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as follows:&lt;br /&gt;
&lt;br /&gt;
*Speed&lt;br /&gt;
*Simple design&lt;br /&gt;
*Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
*Fully distributed&lt;br /&gt;
*Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-A-Short-History-of-Git Getting started a short history of Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
=== Centralized Version Control System ===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed. &amp;lt;br/&amp;gt;Most modern version control systems deal with “changesets”, which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. &amp;lt;br/&amp;gt;For example: a change to a C header file and the corresponding .c file should always be kept together. &amp;lt;br/&amp;gt;Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly. &amp;lt;br/&amp;gt;Some of the most popular centralized version control systems are [http://www.nongnu.org/cvs/ CVS], [https://subversion.apache.org/ Subversion (or SVN)] and [http://www.perforce.com/ Perforce].&lt;br /&gt;
&lt;br /&gt;
=== Distributed Version Control System ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control System (DRCS)] takes a [https://en.wikipedia.org/wiki/Peer-to-peer peer-to-peer] approach, as opposed to the [https://en.wikipedia.org/wiki/Client%E2%80%93server_model client-server] approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&amp;lt;ref&amp;gt;[http://en.wikipedia.org/wiki/Comparison_of_revision_control_software Comparison of Revision Control Software]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
=== Branching Model===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comparison of various Version Control Softwares ==&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87673</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87673"/>
		<updated>2014-09-20T02:43:58Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* How do I use Git? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development.&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as follows:&lt;br /&gt;
&lt;br /&gt;
*Speed&lt;br /&gt;
*Simple design&lt;br /&gt;
*Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
*Fully distributed&lt;br /&gt;
*Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-A-Short-History-of-Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
===Centralized Version Control System===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed.&lt;br /&gt;
&lt;br /&gt;
Most modern version control systems deal with “changesets,” which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. For example: a change to a C header file and the corresponding .c file should always be kept together.&lt;br /&gt;
&lt;br /&gt;
Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly.&lt;br /&gt;
&lt;br /&gt;
Some of the most popular centralized version control systems are CVS, Subversion (or SVN) and Perforce.&lt;br /&gt;
&lt;br /&gt;
===Distributed Version Control System===&lt;br /&gt;
&lt;br /&gt;
DRCS take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
=== Branching Model===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:GitThreeStates.png&amp;diff=87666</id>
		<title>File:GitThreeStates.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:GitThreeStates.png&amp;diff=87666"/>
		<updated>2014-09-20T02:42:24Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: uploaded a new version of &amp;amp;quot;File:GitThreeStates.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This represents the 3 states of Git.&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87663</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87663"/>
		<updated>2014-09-20T02:41:33Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Developments and Feature Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development.&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as follows:&lt;br /&gt;
&lt;br /&gt;
*Speed&lt;br /&gt;
*Simple design&lt;br /&gt;
*Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
*Fully distributed&lt;br /&gt;
*Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&amp;lt;ref&amp;gt;[http://git-scm.com/book/en/Getting-Started-A-Short-History-of-Git]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
===Centralized Version Control System===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed.&lt;br /&gt;
&lt;br /&gt;
Most modern version control systems deal with “changesets,” which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. For example: a change to a C header file and the corresponding .c file should always be kept together.&lt;br /&gt;
&lt;br /&gt;
Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly.&lt;br /&gt;
&lt;br /&gt;
Some of the most popular centralized version control systems are CVS, Subversion (or SVN) and Perforce.&lt;br /&gt;
&lt;br /&gt;
===Distributed Version Control System===&lt;br /&gt;
&lt;br /&gt;
DRCS take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
=== Branching Model===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87625</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87625"/>
		<updated>2014-09-20T02:23:09Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development.&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as follows:&lt;br /&gt;
&lt;br /&gt;
*Speed&lt;br /&gt;
*Simple design&lt;br /&gt;
*Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
*Fully distributed&lt;br /&gt;
*Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
===Centralized Version Control System===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed.&lt;br /&gt;
&lt;br /&gt;
Most modern version control systems deal with “changesets,” which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. For example: a change to a C header file and the corresponding .c file should always be kept together.&lt;br /&gt;
&lt;br /&gt;
Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly.&lt;br /&gt;
&lt;br /&gt;
Some of the most popular centralized version control systems are CVS, Subversion (or SVN) and Perforce.&lt;br /&gt;
&lt;br /&gt;
===Distributed Version Control System===&lt;br /&gt;
&lt;br /&gt;
DRCS take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
=== Branching Model===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based [https://github.com/ Github] GUI and has successfully incorporated the following robust features which makes the job of Collaborative code management a breeze. These include the following:&lt;br /&gt;
&lt;br /&gt;
*;Integrated issue tracking: A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
*;Collaborative code review: Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch. &amp;lt;br/&amp;gt;Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Pull Request = Code + Issue + Code Comments&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. Henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
*;Text entry with understated power; Rather than dozens of buttons, [https://github.com/ Github] relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect [https://en.wikipedia.org/wiki/Emoji Emoji].&lt;br /&gt;
&lt;br /&gt;
*;Syntax highlighted code &amp;amp; rendered data: [https://github.com/ Github's] highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
*;On the desktop and in your pocket:&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;br /&gt;
&lt;br /&gt;
*;Integration and Add-Ons:&lt;br /&gt;
Great software begins with great design. These integrators specialize in helping you explore and visualize ideas, design UI and workflows, and track your progress.&lt;br /&gt;
*Amazon Web Services&lt;br /&gt;
*Google Cloud Platform&lt;br /&gt;
*Heroku&lt;br /&gt;
*Windows Azure&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87624</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87624"/>
		<updated>2014-09-20T02:22:20Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development.&lt;br /&gt;
In 2005, the relationship between the community that developed the Linux kernel and the commercial company that developed BitKeeper broke down, and the tool’s free-of-charge status was revoked. This prompted the Linux development community (and in particular Linus Torvalds, the creator of Linux) to develop their own tool based on some of the lessons they learned while using BitKeeper. Some of the goals of the new system were as follows:&lt;br /&gt;
Speed&lt;br /&gt;
Simple design&lt;br /&gt;
Strong support for non-linear development (thousands of parallel branches)&lt;br /&gt;
Fully distributed&lt;br /&gt;
Able to handle large projects like the Linux kernel efficiently (speed and data size)&lt;br /&gt;
Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. It’s incredibly fast, it’s very efficient with large projects, and it has an incredible branching system for non-linear development.&lt;br /&gt;
Further, [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
===Centralized Version Control System===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed.&lt;br /&gt;
&lt;br /&gt;
Most modern version control systems deal with “changesets,” which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. For example: a change to a C header file and the corresponding .c file should always be kept together.&lt;br /&gt;
&lt;br /&gt;
Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly.&lt;br /&gt;
&lt;br /&gt;
Some of the most popular centralized version control systems are CVS, Subversion (or SVN) and Perforce.&lt;br /&gt;
&lt;br /&gt;
===Distributed Version Control System===&lt;br /&gt;
&lt;br /&gt;
DRCS take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
=== Branching Model===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based [https://github.com/ Github] GUI and has successfully incorporated the following robust features which makes the job of Collaborative code management a breeze. These include the following:&lt;br /&gt;
&lt;br /&gt;
*;Integrated issue tracking: A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
*;Collaborative code review: Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch. &amp;lt;br/&amp;gt;Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Pull Request = Code + Issue + Code Comments&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. Henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
*;Text entry with understated power; Rather than dozens of buttons, [https://github.com/ Github] relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect [https://en.wikipedia.org/wiki/Emoji Emoji].&lt;br /&gt;
&lt;br /&gt;
*;Syntax highlighted code &amp;amp; rendered data: [https://github.com/ Github's] highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
*;On the desktop and in your pocket:&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;br /&gt;
&lt;br /&gt;
*;Integration and Add-Ons:&lt;br /&gt;
Great software begins with great design. These integrators specialize in helping you explore and visualize ideas, design UI and workflows, and track your progress.&lt;br /&gt;
*Amazon Web Services&lt;br /&gt;
*Google Cloud Platform&lt;br /&gt;
*Heroku&lt;br /&gt;
*Windows Azure&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87608</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87608"/>
		<updated>2014-09-20T02:10:58Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Centralized Vs Distributed Version Control System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development. [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
===Centralized Version Control System===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed.&lt;br /&gt;
&lt;br /&gt;
Most modern version control systems deal with “changesets,” which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. For example: a change to a C header file and the corresponding .c file should always be kept together.&lt;br /&gt;
&lt;br /&gt;
Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly.&lt;br /&gt;
&lt;br /&gt;
Some of the most popular centralized version control systems are CVS, Subversion (or SVN) and Perforce.&lt;br /&gt;
&lt;br /&gt;
===Distributed Version Control System===&lt;br /&gt;
&lt;br /&gt;
DRCS take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
=== Branching Model===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based Git-hub GUI and has successfully incorporated the following robust features which make the job of Collaborative code management a breeze. These include :&lt;br /&gt;
&lt;br /&gt;
'''Integrated issue tracking.'''&lt;br /&gt;
A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
'''Collaborative code review.'''&lt;br /&gt;
Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch.&lt;br /&gt;
&lt;br /&gt;
Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
  Pull Request = Code + Issue + Code Comments&lt;br /&gt;
Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
'''Text entry with understated power.'''&lt;br /&gt;
Rather than dozens of buttons, GitHub relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect Emoji. zap&lt;br /&gt;
Adding images is as simple as dragging and dropping from your desktop. For an even more distraction-free writing experience, you can use the fullscreen Zen Mode.&lt;br /&gt;
&lt;br /&gt;
Syntax highlighted code &amp;amp; rendered data.&lt;br /&gt;
Git-hub's highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
'''On the desktop and in your pocket.'''&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;br /&gt;
&lt;br /&gt;
'''Integration and Add-Ons'''&lt;br /&gt;
Great software begins with great design. These integrators specialize in helping you explore and visualize ideas, design UI and workflows, and track your progress.&lt;br /&gt;
*Amazon Web Services&lt;br /&gt;
*Google Cloud Platform&lt;br /&gt;
*Heroku&lt;br /&gt;
*Windows Azure&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87607</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87607"/>
		<updated>2014-09-20T02:10:42Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Centralized Vs Distributed Version Control System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development. [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
===Centralized Version Control System===&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed.&lt;br /&gt;
&lt;br /&gt;
Most modern version control systems deal with “changesets,” which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. For example: a change to a C header file and the corresponding .c file should always be kept together.&lt;br /&gt;
&lt;br /&gt;
Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly.&lt;br /&gt;
&lt;br /&gt;
Some of the most popular centralized version control systems are CVS, Subversion (or SVN) and Perforce.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Distributed Version Control System===&lt;br /&gt;
&lt;br /&gt;
DRCS take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
=== Branching Model===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based Git-hub GUI and has successfully incorporated the following robust features which make the job of Collaborative code management a breeze. These include :&lt;br /&gt;
&lt;br /&gt;
'''Integrated issue tracking.'''&lt;br /&gt;
A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
'''Collaborative code review.'''&lt;br /&gt;
Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch.&lt;br /&gt;
&lt;br /&gt;
Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
  Pull Request = Code + Issue + Code Comments&lt;br /&gt;
Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
'''Text entry with understated power.'''&lt;br /&gt;
Rather than dozens of buttons, GitHub relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect Emoji. zap&lt;br /&gt;
Adding images is as simple as dragging and dropping from your desktop. For an even more distraction-free writing experience, you can use the fullscreen Zen Mode.&lt;br /&gt;
&lt;br /&gt;
Syntax highlighted code &amp;amp; rendered data.&lt;br /&gt;
Git-hub's highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
'''On the desktop and in your pocket.'''&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;br /&gt;
&lt;br /&gt;
'''Integration and Add-Ons'''&lt;br /&gt;
Great software begins with great design. These integrators specialize in helping you explore and visualize ideas, design UI and workflows, and track your progress.&lt;br /&gt;
*Amazon Web Services&lt;br /&gt;
*Google Cloud Platform&lt;br /&gt;
*Heroku&lt;br /&gt;
*Windows Azure&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87606</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87606"/>
		<updated>2014-09-20T02:10:18Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Why use Git? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development. [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
'''Centralized Version Control System'''&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed.&lt;br /&gt;
&lt;br /&gt;
Most modern version control systems deal with “changesets,” which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. For example: a change to a C header file and the corresponding .c file should always be kept together.&lt;br /&gt;
&lt;br /&gt;
Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly.&lt;br /&gt;
&lt;br /&gt;
Some of the most popular centralized version control systems are CVS, Subversion (or SVN) and Perforce.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Distributed Version Control System'''&lt;br /&gt;
&lt;br /&gt;
DRCS take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
=== Branching Model===&lt;br /&gt;
Git's most compelling feature is that, it really makes it stand apart from nearly every other SCM out there is its [http://nvie.com/posts/a-successful-git-branching-model/ branching model]. Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds. &amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
=== Everything is Local===&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk. This not only makes most operations much faster than anyone may be used to, but it also allows you to work on stuff offline. Being able to branch, merge, commit and browse history of one's project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
===Git is Fast===&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt;Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
===Git is Small===&lt;br /&gt;
Git is really good at conserving disk space. A Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt;The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk-space Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===The Staging Area=== &lt;br /&gt;
Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt;The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
===Distributed===&lt;br /&gt;
One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that were tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Any Workflow=== &lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the [http://www.linux.org/ Linux] kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based Git-hub GUI and has successfully incorporated the following robust features which make the job of Collaborative code management a breeze. These include :&lt;br /&gt;
&lt;br /&gt;
'''Integrated issue tracking.'''&lt;br /&gt;
A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
'''Collaborative code review.'''&lt;br /&gt;
Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch.&lt;br /&gt;
&lt;br /&gt;
Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
  Pull Request = Code + Issue + Code Comments&lt;br /&gt;
Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
'''Text entry with understated power.'''&lt;br /&gt;
Rather than dozens of buttons, GitHub relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect Emoji. zap&lt;br /&gt;
Adding images is as simple as dragging and dropping from your desktop. For an even more distraction-free writing experience, you can use the fullscreen Zen Mode.&lt;br /&gt;
&lt;br /&gt;
Syntax highlighted code &amp;amp; rendered data.&lt;br /&gt;
Git-hub's highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
'''On the desktop and in your pocket.'''&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;br /&gt;
&lt;br /&gt;
'''Integration and Add-Ons'''&lt;br /&gt;
Great software begins with great design. These integrators specialize in helping you explore and visualize ideas, design UI and workflows, and track your progress.&lt;br /&gt;
*Amazon Web Services&lt;br /&gt;
*Google Cloud Platform&lt;br /&gt;
*Heroku&lt;br /&gt;
*Windows Azure&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87555</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87555"/>
		<updated>2014-09-20T01:43:53Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Centralized Vs Distributed Version Control System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development. [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Centralized Vs Distributed Version Control System ==&lt;br /&gt;
&lt;br /&gt;
'''Centralized Version Control System'''&lt;br /&gt;
&lt;br /&gt;
Centralized version control systems are based on the idea that there is a single “central” copy of your project somewhere (probably on a server), and programmers will “commit” their changes to this central copy.&lt;br /&gt;
&lt;br /&gt;
“Committing” a change simply means recording the change in the central system. Other programmers can then see this change. They can also pull down the change, and the version control tool will automatically update the contents of any files that were changed.&lt;br /&gt;
&lt;br /&gt;
Most modern version control systems deal with “changesets,” which simply are a groups of changes (possibly to many files) that should be treated as a cohesive whole. For example: a change to a C header file and the corresponding .c file should always be kept together.&lt;br /&gt;
&lt;br /&gt;
Programmers no longer have to keep many copies of files on their hard drives manually, because the version control tool can talk to the central copy and retrieve any version they need on the fly.&lt;br /&gt;
&lt;br /&gt;
Some of the most popular centralized version control systems are CVS, Subversion (or SVN) and Perforce.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Distributed Version Control System'''&lt;br /&gt;
&lt;br /&gt;
DRCS take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
;Branching Model: Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
;Everything is Local: There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
;Git is Fast: Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt; Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
;Git is Small: Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt; The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;The Staging Area: Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt; The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
;Distributed: One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] I tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Any Workflow: One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based Git-hub GUI and has successfully incorporated the following robust features which make the job of Collaborative code management a breeze. These include :&lt;br /&gt;
&lt;br /&gt;
'''Integrated issue tracking.'''&lt;br /&gt;
A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
'''Collaborative code review.'''&lt;br /&gt;
Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch.&lt;br /&gt;
&lt;br /&gt;
Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
  Pull Request = Code + Issue + Code Comments&lt;br /&gt;
Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
'''Text entry with understated power.'''&lt;br /&gt;
Rather than dozens of buttons, GitHub relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect Emoji. zap&lt;br /&gt;
Adding images is as simple as dragging and dropping from your desktop. For an even more distraction-free writing experience, you can use the fullscreen Zen Mode.&lt;br /&gt;
&lt;br /&gt;
Syntax highlighted code &amp;amp; rendered data.&lt;br /&gt;
Git-hub's highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
'''On the desktop and in your pocket.'''&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;br /&gt;
&lt;br /&gt;
'''Integration and Add-Ons'''&lt;br /&gt;
Great software begins with great design. These integrators specialize in helping you explore and visualize ideas, design UI and workflows, and track your progress.&lt;br /&gt;
*Amazon Web Services&lt;br /&gt;
*Google Cloud Platform&lt;br /&gt;
*Heroku&lt;br /&gt;
*Windows Azure&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87526</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87526"/>
		<updated>2014-09-20T01:33:12Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Developments and Feature Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
= Background =&lt;br /&gt;
&lt;br /&gt;
== What is Git? ==&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development. [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
== Why use Distributed Version Control System? ==&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
== Why use Git? ==&lt;br /&gt;
;Branching Model: Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
;Everything is Local: There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
;Git is Fast: Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt; Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
;Git is Small: Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt; The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;The Staging Area: Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt; The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
;Distributed: One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] I tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Any Workflow: One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based Git-hub GUI and has successfully incorporated the following robust features which make the job of Collaborative code management a breeze. These include :&lt;br /&gt;
&lt;br /&gt;
'''Integrated issue tracking.'''&lt;br /&gt;
A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
'''Collaborative code review.'''&lt;br /&gt;
Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch.&lt;br /&gt;
&lt;br /&gt;
Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
  Pull Request = Code + Issue + Code Comments&lt;br /&gt;
Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
'''Text entry with understated power.'''&lt;br /&gt;
Rather than dozens of buttons, GitHub relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect Emoji. zap&lt;br /&gt;
Adding images is as simple as dragging and dropping from your desktop. For an even more distraction-free writing experience, you can use the fullscreen Zen Mode.&lt;br /&gt;
&lt;br /&gt;
Syntax highlighted code &amp;amp; rendered data.&lt;br /&gt;
Git-hub's highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
'''On the desktop and in your pocket.'''&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;br /&gt;
&lt;br /&gt;
'''Integration and Add-Ons'''&lt;br /&gt;
Great software begins with great design. These integrators specialize in helping you explore and visualize ideas, design UI and workflows, and track your progress.&lt;br /&gt;
*Amazon Web Services&lt;br /&gt;
*Google Cloud Platform&lt;br /&gt;
*Heroku&lt;br /&gt;
*Windows Azure&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87523</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87523"/>
		<updated>2014-09-20T01:31:23Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Developments and Feature Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
[http://git-scm.com/ Git] (/ɡɪt/) is a locally enabled distributed revision control and [https://en.wikipedia.org/wiki/Revision_control source code management (SCM)] system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by [https://en.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds] for [http://www.linux.org/ Linux] kernel development in 2005, and has since become the most widely adopted version control system for software development. [https://github.com/ Github], a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
&lt;br /&gt;
Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why use Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why use Git? ===&lt;br /&gt;
;Branching Model: Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
;Everything is Local: There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
;Git is Fast: Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt; Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
;Git is Small: Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt; The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;The Staging Area: Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt; The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
;Distributed: One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] I tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Any Workflow: One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based Git-hub GUI and has successfully incorporated the following robust features which make the job of Collaborative code management a breeze. These include :&lt;br /&gt;
&lt;br /&gt;
'''Integrated issue tracking.'''&lt;br /&gt;
A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
'''Collaborative code review.'''&lt;br /&gt;
Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch.&lt;br /&gt;
&lt;br /&gt;
Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
  Pull Request = Code + Issue + Code Comments&lt;br /&gt;
Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
'''Text entry with understated power.'''&lt;br /&gt;
Rather than dozens of buttons, GitHub relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect Emoji. zap&lt;br /&gt;
Adding images is as simple as dragging and dropping from your desktop. For an even more distraction-free writing experience, you can use the fullscreen Zen Mode.&lt;br /&gt;
&lt;br /&gt;
Syntax highlighted code &amp;amp; rendered data.&lt;br /&gt;
Git-hub's highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
'''On the desktop and in your pocket.'''&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87498</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87498"/>
		<updated>2014-09-20T01:23:53Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Developments and Feature Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
;Branching Model: Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
;Everything is Local: There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
;Git is Fast: Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt; Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
;Git is Small: Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt; The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;The Staging Area: Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt; The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
;Distributed: One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] I tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Any Workflow: One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png|frame]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Remote repository: A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
;Local repository: A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
;Index (cache) - Staging: When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
;Working directory: A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;br /&gt;
&lt;br /&gt;
Git Revision control System has come a long way with its Web based Git-hub GUI and has successfully incorporated the following robust features which make the job of Collaborative code management a breeze. These include :&lt;br /&gt;
&lt;br /&gt;
'''Integrated issue tracking.'''&lt;br /&gt;
A flexible issue tracker lets you stay on top of bugs and focus on features.&lt;br /&gt;
&lt;br /&gt;
'''Collaborative code review.'''&lt;br /&gt;
Code review is an essential part of the GitHub workflow. After creating a branch and making one or more commits, a Pull Request starts the conversation around the proposed changes. Additional commits are commonly added based on feedback before merging the branch.&lt;br /&gt;
&lt;br /&gt;
Pull Requests are living conversations that streamline the process of discussing, reviewing, and managing changes to code.&lt;br /&gt;
  Pull Request = Code + Issue + Code Comments&lt;br /&gt;
Each Pull Request takes into account not only what you would like pulled, but also where you intend those changes to be applied. henceforth, a team can discuss the changes as a whole, individual parts, or even specific lines. Later commits addressing concerns or ideas appear as part of the conversation.&lt;br /&gt;
&lt;br /&gt;
'''Text entry with understated power.'''&lt;br /&gt;
Rather than dozens of buttons, GitHub relies on the simplicity of GitHub Flavored Markdown for formatting text. The autocompleter makes quick work of mentioning people and teams, creating links to other issues, and adding the perfect Emoji. zap&lt;br /&gt;
Adding images is as simple as dragging and dropping from your desktop. For an even more distraction-free writing experience, you can use the fullscreen Zen Mode.&lt;br /&gt;
&lt;br /&gt;
Syntax highlighted code &amp;amp; rendered data.&lt;br /&gt;
Git-hub's highlighting currently supports over 200 programming languages. Data is as important to us as code, so we're always looking for new ways to render formats like STL 3D models, CSV files, and GeoJSON maps in the browser.&lt;br /&gt;
&lt;br /&gt;
'''On the desktop and in your pocket.'''&lt;br /&gt;
Native GitHub applications for Windows and Mac make sharing code simple. You can use them to clone repositories, create branches, browse history, and commit changes with a friendly interface. Our Android app and mobile web views let you keep track of your projects on the go.&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87469</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87469"/>
		<updated>2014-09-20T01:14:26Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* How do I use Git? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository. Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
;Branching Model: Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&amp;lt;br/&amp;gt;This means that you can do things like: &lt;br /&gt;
:* Create experimental branches.&lt;br /&gt;
:* Clear cut Branch delineation into Production, Development, Testing, Fixes, Patches, etc.&lt;br /&gt;
:* Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
:* Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
:* Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
;Everything is Local: There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
&lt;br /&gt;
;Git is Fast: Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on [https://subversion.apache.org/ SVN] and [http://www.perforce.com/ Perforce], both of which require network access for certain operations. However, even compared to the other [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] that also perform operations locally, Git is pretty fast. &amp;lt;br/&amp;gt; Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, [http://git-scm.com/ Git] is written in [https://en.wikipedia.org/wiki/C_(programming_language) C], reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
;Git is Small: Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an [https://subversion.apache.org/ SVN] checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs). &amp;lt;br /&amp;gt; The following numbers were taken from clones of the [https://www.djangoproject.com/ Django] project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
|+ Disk Usage&lt;br /&gt;
!&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
|-&lt;br /&gt;
! Repo Alone&lt;br /&gt;
| 24M&lt;br /&gt;
| 34M&lt;br /&gt;
| 45M&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
! Entire Directory&lt;br /&gt;
| 43M&lt;br /&gt;
| 53M&lt;br /&gt;
| 64M&lt;br /&gt;
| 61M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;The Staging Area: Unlike the other systems, Git has what it calls the '''&amp;quot;staging area&amp;quot;''' or '''&amp;quot;index&amp;quot;'''. This is an intermediate area that you can setup what you want your commit to look like before you commit it. &amp;lt;br /&amp;gt; The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory.&lt;br /&gt;
&lt;br /&gt;
;Distributed: One of the coolest features of any of the [https://en.wikipedia.org/wiki/Distributed_revision_control Distributed SCMs], Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository. &amp;lt;br/&amp;gt; This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point. &amp;lt;br /&amp;gt;This does not slow things down much, either. On average, an [https://subversion.apache.org/ SVN] checkout is only marginally faster than any of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs]. Of the [https://en.wikipedia.org/wiki/Distributed_revision_control DSCMs] I tested, Git was the fastest.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 200px;&amp;quot;&lt;br /&gt;
|+ Cloning Benchmarks&lt;br /&gt;
|-&lt;br /&gt;
! [http://git-scm.com/ Git ]&lt;br /&gt;
| 1m 59s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Mercurial]&lt;br /&gt;
| 2m 24s&lt;br /&gt;
|-&lt;br /&gt;
! [http://mercurial.selenic.com/ Bazaar]&lt;br /&gt;
| 5m 11s&lt;br /&gt;
|-&lt;br /&gt;
! [https://subversion.apache.org/ SVN]&lt;br /&gt;
| 1m 4s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Any Workflow: One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
&lt;br /&gt;
:*;Subversion-Style Workflow: A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
&lt;br /&gt;
:*;Integration Manager Workflow: Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or [https://github.com/ GitHub] repositories.&lt;br /&gt;
&lt;br /&gt;
:*;Dictator and Lieutenants Workflow: For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
							&amp;lt;h2&amp;gt;Commands&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;For a list of command line commands, please go to [Git-Reference]&amp;lt;/p&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
							&amp;lt;table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;th width=&amp;quot;120px&amp;quot;&amp;gt;Term&amp;lt;/th&amp;gt;&lt;br /&gt;
									&amp;lt;th&amp;gt;Explanation&amp;lt;/th&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;branches&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;It allows you to create a separate working copy of your code and develop it in  a&lt;br /&gt;
									new way wihtout affect the original code.  So its like creating a new project (branch) based on the original, the original&lt;br /&gt;
									is usually called the Master.  The branch is completely independent of the Master and you can develop both the Master and&lt;br /&gt;
									branch at the same time.  You can also have multiple branches and you can &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; any of these together.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;clone&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Clone is a copy of a repository.  Clone is used when you copy from the remote repository to your local repository.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;collaborator&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Collaborators are other GitHub users that you’ve given write access to one or more of your repositories.&lt;br /&gt;
										Collaborators may fork any private repository you’ve added them to without their own paid plan. Their forks do not count against your private repository quota.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&lt;br /&gt;
										&amp;lt;em&amp;gt;This was taken from github.com&amp;lt;/em&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;commit&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A commit is like a bookmark/milestone that is recorded in the repository.  It creates a revision that you can view and &lt;br /&gt;
									revert back to at anytime.  When using Git, you are encourge to do many small commits since all of these commits are done &lt;br /&gt;
									on your computer. When you update (push) to the remote repository to backup or share with other developers all the commits will&lt;br /&gt;
									be viewable.&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									In projects with multiple developers, doing many small commits and updating the remote repository many times a day will allow your coworkers&lt;br /&gt;
									to merge your changes into their code and thus resolving discrepancies early which is much easier to resolve than waiting&lt;br /&gt;
									and doing a massive merge. &lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									A commit will always contain the author and committer.  Author is usually the creator/owner&lt;br /&gt;
									of the project and a committer can be a collaborator or the author.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fetch&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fetch is a command in Git or command, you use fetch to synchronize your local repository with the remote repository.  Its important to know that&lt;br /&gt;
										fetch does not merge any new changes to your source code (local repository).  New changes from the fetch will be considered a &amp;amp;quot;remote branches&amp;amp;quot;, &lt;br /&gt;
										you can combine new changes to your code by using the &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; command.&lt;br /&gt;
										  &lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the changes with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.  So you are making sure your local repository is up-to-date with the remote repository&lt;br /&gt;
											and if new code is downloaded, then you can check out what is new.  You will also need to do a &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										Note: fetch is not a clone, clone is a new copy down from the repository, fetch is to update your local repository. &lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fork&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fork is NOT a Git term, its a term born from the community.  Forking is similar to branching in that you copy the origin &lt;br /&gt;
										(Master) to your account.  The difference is that you are copying the source code from the author (owner) to your &lt;br /&gt;
										account.  Branching is copying within the same account.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										So when does this happen? Forking usually happens for 2 reasons:&lt;br /&gt;
										&amp;lt;ol&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork it to take the project in a new direction.  Obviously you can only do this with open source projects&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork the project to add to the project and request a merge back to the origin/master.  You as a independent &lt;br /&gt;
											developer want to contribute to the code.&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ol&amp;gt;&lt;br /&gt;
										Branching, cloning and forking is sometimes confused.&lt;br /&gt;
																	&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;merge&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A merge is combining branches with your Master (origin).  When to you do &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt; a fetch and merge will be done to update your local repository.&lt;br /&gt;
										When merging two code sets together, if a conflict were to occur, it will be up to you to resolve it.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;pull&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A pull is basically 2 command execute together.  Pull will do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; on your local repository.&lt;br /&gt;
										When using the GitHub Windows Client, you will usually do a pull.&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the change with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.   So you are making sure your local repository is up-to-date with the remote repository and you can&lt;br /&gt;
											test you code with any new code committed to the remote repository.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;push&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Push is the command to upload your local repository to the remote repository.  Any changes that you want to push to the remote repository, you &lt;br /&gt;
										will need to &amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt; on those changes on your local repository.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;repository&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Contains all the history... like commits, branches, tags and your source code.  Repository can be remote which is a central&lt;br /&gt;
									storage for repository.  Local repository would be what the user/deverloper works with (make changes to).&lt;br /&gt;
									Remote repository is a centralize repository for sharing projects.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;revision&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Revisions represents a version of the source code. Git identifies revisions with SHA1 ids. SHA1 ids are 160 bits long and are represented &lt;br /&gt;
										in hexadecimal. The latest version can be addressed via &amp;quot;HEAD&amp;quot;, the version before that via &amp;quot;HEAD~1&amp;quot; and so on.&lt;br /&gt;
										&lt;br /&gt;
										A revision is created when you do a commit.  So a commit is a command and a revision is like the bookmark... so when you hear someone&lt;br /&gt;
										say &amp;amp;quot;revert back to the last commit&amp;amp;quot;... technically they should say, &amp;amp;quot;revert back to the last revision&amp;amp;quot;.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;tags&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A tag is like a commit, it allows you to permanantly mark a point in your project.  A common use of tags is to mark the &lt;br /&gt;
									application version number.  This version number is the same displayed in the help/about.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;URL&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Used to tell Git where the remote repository is.  &lt;br /&gt;
										&amp;lt;br /&amp;gt;There is more than one type of URL&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;HTTP: Should be a https (secure) https://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;GIT: Uses git communication git://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;SSH: Uses SSH git@github.com:&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Developments and Feature Enhancements ==&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Git_data_flow_simplified.svg.png&amp;diff=87460</id>
		<title>File:Git data flow simplified.svg.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Git_data_flow_simplified.svg.png&amp;diff=87460"/>
		<updated>2014-09-20T01:11:30Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: uploaded a new version of &amp;amp;quot;File:Git data flow simplified.svg.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git Revision Control-Data Flow&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87413</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87413"/>
		<updated>2014-09-20T00:55:58Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow Terminology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
							&amp;lt;h2&amp;gt;Commands&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;For a list of command line commands, please go to [Git-Reference]&amp;lt;/p&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
							&amp;lt;table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;th width=&amp;quot;120px&amp;quot;&amp;gt;Term&amp;lt;/th&amp;gt;&lt;br /&gt;
									&amp;lt;th&amp;gt;Explanation&amp;lt;/th&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;branches&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;It allows you to create a separate working copy of your code and develop it in  a&lt;br /&gt;
									new way wihtout affect the original code.  So its like creating a new project (branch) based on the original, the original&lt;br /&gt;
									is usually called the Master.  The branch is completely independent of the Master and you can develop both the Master and&lt;br /&gt;
									branch at the same time.  You can also have multiple branches and you can &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; any of these together.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;clone&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Clone is a copy of a repository.  Clone is used when you copy from the remote repository to your local repository.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;collaborator&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Collaborators are other GitHub users that you’ve given write access to one or more of your repositories.&lt;br /&gt;
										Collaborators may fork any private repository you’ve added them to without their own paid plan. Their forks do not count against your private repository quota.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&lt;br /&gt;
										&amp;lt;em&amp;gt;This was taken from github.com&amp;lt;/em&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;commit&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A commit is like a bookmark/milestone that is recorded in the repository.  It creates a revision that you can view and &lt;br /&gt;
									revert back to at anytime.  When using Git, you are encourge to do many small commits since all of these commits are done &lt;br /&gt;
									on your computer. When you update (push) to the remote repository to backup or share with other developers all the commits will&lt;br /&gt;
									be viewable.&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									In projects with multiple developers, doing many small commits and updating the remote repository many times a day will allow your coworkers&lt;br /&gt;
									to merge your changes into their code and thus resolving discrepancies early which is much easier to resolve than waiting&lt;br /&gt;
									and doing a massive merge. &lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									A commit will always contain the author and committer.  Author is usually the creator/owner&lt;br /&gt;
									of the project and a committer can be a collaborator or the author.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fetch&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fetch is a command in Git or command, you use fetch to synchronize your local repository with the remote repository.  Its important to know that&lt;br /&gt;
										fetch does not merge any new changes to your source code (local repository).  New changes from the fetch will be considered a &amp;amp;quot;remote branches&amp;amp;quot;, &lt;br /&gt;
										you can combine new changes to your code by using the &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; command.&lt;br /&gt;
										  &lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the changes with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.  So you are making sure your local repository is up-to-date with the remote repository&lt;br /&gt;
											and if new code is downloaded, then you can check out what is new.  You will also need to do a &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										Note: fetch is not a clone, clone is a new copy down from the repository, fetch is to update your local repository. &lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fork&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fork is NOT a Git term, its a term born from the community.  Forking is similar to branching in that you copy the origin &lt;br /&gt;
										(Master) to your account.  The difference is that you are copying the source code from the author (owner) to your &lt;br /&gt;
										account.  Branching is copying within the same account.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										So when does this happen? Forking usually happens for 2 reasons:&lt;br /&gt;
										&amp;lt;ol&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork it to take the project in a new direction.  Obviously you can only do this with open source projects&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork the project to add to the project and request a merge back to the origin/master.  You as a independent &lt;br /&gt;
											developer want to contribute to the code.&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ol&amp;gt;&lt;br /&gt;
										Branching, cloning and forking is sometimes confused.&lt;br /&gt;
																	&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;merge&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A merge is combining branches with your Master (origin).  When to you do &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt; a fetch and merge will be done to update your local repository.&lt;br /&gt;
										When merging two code sets together, if a conflict were to occur, it will be up to you to resolve it.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;pull&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A pull is basically 2 command execute together.  Pull will do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; on your local repository.&lt;br /&gt;
										When using the GitHub Windows Client, you will usually do a pull.&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the change with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.   So you are making sure your local repository is up-to-date with the remote repository and you can&lt;br /&gt;
											test you code with any new code committed to the remote repository.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;push&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Push is the command to upload your local repository to the remote repository.  Any changes that you want to push to the remote repository, you &lt;br /&gt;
										will need to &amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt; on those changes on your local repository.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;repository&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Contains all the history... like commits, branches, tags and your source code.  Repository can be remote which is a central&lt;br /&gt;
									storage for repository.  Local repository would be what the user/deverloper works with (make changes to).&lt;br /&gt;
									Remote repository is a centralize repository for sharing projects.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;revision&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Revisions represents a version of the source code. Git identifies revisions with SHA1 ids. SHA1 ids are 160 bits long and are represented &lt;br /&gt;
										in hexadecimal. The latest version can be addressed via &amp;quot;HEAD&amp;quot;, the version before that via &amp;quot;HEAD~1&amp;quot; and so on.&lt;br /&gt;
										&lt;br /&gt;
										A revision is created when you do a commit.  So a commit is a command and a revision is like the bookmark... so when you hear someone&lt;br /&gt;
										say &amp;amp;quot;revert back to the last commit&amp;amp;quot;... technically they should say, &amp;amp;quot;revert back to the last revision&amp;amp;quot;.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;tags&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A tag is like a commit, it allows you to permanantly mark a point in your project.  A common use of tags is to mark the &lt;br /&gt;
									application version number.  This version number is the same displayed in the help/about.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;URL&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Used to tell Git where the remote repository is.  &lt;br /&gt;
										&amp;lt;br /&amp;gt;There is more than one type of URL&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;HTTP: Should be a https (secure) https://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;GIT: Uses git communication git://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;SSH: Uses SSH git@github.com:&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87411</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87411"/>
		<updated>2014-09-20T00:55:29Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow Terminology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
							&amp;lt;h2&amp;gt;Commands&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;For a list of command line commands, please go to [Git-Reference]&amp;lt;/p&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
							{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;th width=&amp;quot;120px&amp;quot;&amp;gt;Term&amp;lt;/th&amp;gt;&lt;br /&gt;
									&amp;lt;th&amp;gt;Explanation&amp;lt;/th&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;branches&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;It allows you to create a separate working copy of your code and develop it in  a&lt;br /&gt;
									new way wihtout affect the original code.  So its like creating a new project (branch) based on the original, the original&lt;br /&gt;
									is usually called the Master.  The branch is completely independent of the Master and you can develop both the Master and&lt;br /&gt;
									branch at the same time.  You can also have multiple branches and you can &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; any of these together.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;clone&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Clone is a copy of a repository.  Clone is used when you copy from the remote repository to your local repository.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;collaborator&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Collaborators are other GitHub users that you’ve given write access to one or more of your repositories.&lt;br /&gt;
										Collaborators may fork any private repository you’ve added them to without their own paid plan. Their forks do not count against your private repository quota.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&lt;br /&gt;
										&amp;lt;em&amp;gt;This was taken from github.com&amp;lt;/em&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;commit&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A commit is like a bookmark/milestone that is recorded in the repository.  It creates a revision that you can view and &lt;br /&gt;
									revert back to at anytime.  When using Git, you are encourge to do many small commits since all of these commits are done &lt;br /&gt;
									on your computer. When you update (push) to the remote repository to backup or share with other developers all the commits will&lt;br /&gt;
									be viewable.&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									In projects with multiple developers, doing many small commits and updating the remote repository many times a day will allow your coworkers&lt;br /&gt;
									to merge your changes into their code and thus resolving discrepancies early which is much easier to resolve than waiting&lt;br /&gt;
									and doing a massive merge. &lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									A commit will always contain the author and committer.  Author is usually the creator/owner&lt;br /&gt;
									of the project and a committer can be a collaborator or the author.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fetch&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fetch is a command in Git or command, you use fetch to synchronize your local repository with the remote repository.  Its important to know that&lt;br /&gt;
										fetch does not merge any new changes to your source code (local repository).  New changes from the fetch will be considered a &amp;amp;quot;remote branches&amp;amp;quot;, &lt;br /&gt;
										you can combine new changes to your code by using the &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; command.&lt;br /&gt;
										  &lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the changes with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.  So you are making sure your local repository is up-to-date with the remote repository&lt;br /&gt;
											and if new code is downloaded, then you can check out what is new.  You will also need to do a &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										Note: fetch is not a clone, clone is a new copy down from the repository, fetch is to update your local repository. &lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fork&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fork is NOT a Git term, its a term born from the community.  Forking is similar to branching in that you copy the origin &lt;br /&gt;
										(Master) to your account.  The difference is that you are copying the source code from the author (owner) to your &lt;br /&gt;
										account.  Branching is copying within the same account.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										So when does this happen? Forking usually happens for 2 reasons:&lt;br /&gt;
										&amp;lt;ol&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork it to take the project in a new direction.  Obviously you can only do this with open source projects&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork the project to add to the project and request a merge back to the origin/master.  You as a independent &lt;br /&gt;
											developer want to contribute to the code.&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ol&amp;gt;&lt;br /&gt;
										Branching, cloning and forking is sometimes confused.&lt;br /&gt;
																	&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;merge&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A merge is combining branches with your Master (origin).  When to you do &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt; a fetch and merge will be done to update your local repository.&lt;br /&gt;
										When merging two code sets together, if a conflict were to occur, it will be up to you to resolve it.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;pull&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A pull is basically 2 command execute together.  Pull will do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; on your local repository.&lt;br /&gt;
										When using the GitHub Windows Client, you will usually do a pull.&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the change with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.   So you are making sure your local repository is up-to-date with the remote repository and you can&lt;br /&gt;
											test you code with any new code committed to the remote repository.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;push&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Push is the command to upload your local repository to the remote repository.  Any changes that you want to push to the remote repository, you &lt;br /&gt;
										will need to &amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt; on those changes on your local repository.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;repository&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Contains all the history... like commits, branches, tags and your source code.  Repository can be remote which is a central&lt;br /&gt;
									storage for repository.  Local repository would be what the user/deverloper works with (make changes to).&lt;br /&gt;
									Remote repository is a centralize repository for sharing projects.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;revision&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Revisions represents a version of the source code. Git identifies revisions with SHA1 ids. SHA1 ids are 160 bits long and are represented &lt;br /&gt;
										in hexadecimal. The latest version can be addressed via &amp;quot;HEAD&amp;quot;, the version before that via &amp;quot;HEAD~1&amp;quot; and so on.&lt;br /&gt;
										&lt;br /&gt;
										A revision is created when you do a commit.  So a commit is a command and a revision is like the bookmark... so when you hear someone&lt;br /&gt;
										say &amp;amp;quot;revert back to the last commit&amp;amp;quot;... technically they should say, &amp;amp;quot;revert back to the last revision&amp;amp;quot;.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;tags&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A tag is like a commit, it allows you to permanantly mark a point in your project.  A common use of tags is to mark the &lt;br /&gt;
									application version number.  This version number is the same displayed in the help/about.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;URL&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Used to tell Git where the remote repository is.  &lt;br /&gt;
										&amp;lt;br /&amp;gt;There is more than one type of URL&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;HTTP: Should be a https (secure) https://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;GIT: Uses git communication git://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;SSH: Uses SSH git@github.com:&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
							|}&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87404</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87404"/>
		<updated>2014-09-20T00:53:50Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow Terminology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
							&amp;lt;h2&amp;gt;Commands&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;For a list of command line commands, please go to [Git-Reference]&amp;lt;/p&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
							&amp;lt;table&amp;gt;&lt;br /&gt;
								&amp;lt;tbody&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;th width=&amp;quot;120px&amp;quot;&amp;gt;Term&amp;lt;/th&amp;gt;&lt;br /&gt;
									&amp;lt;th&amp;gt;Explanation&amp;lt;/th&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;branches&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;It allows you to create a separate working copy of your code and develop it in  a&lt;br /&gt;
									new way wihtout affect the original code.  So its like creating a new project (branch) based on the original, the original&lt;br /&gt;
									is usually called the Master.  The branch is completely independent of the Master and you can develop both the Master and&lt;br /&gt;
									branch at the same time.  You can also have multiple branches and you can &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; any of these together.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;clone&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Clone is a copy of a repository.  Clone is used when you copy from the remote repository to your local repository.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;collaborator&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Collaborators are other GitHub users that you’ve given write access to one or more of your repositories.&lt;br /&gt;
										Collaborators may fork any private repository you’ve added them to without their own paid plan. Their forks do not count against your private repository quota.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&lt;br /&gt;
										&amp;lt;em&amp;gt;This was taken from github.com&amp;lt;/em&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;commit&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A commit is like a bookmark/milestone that is recorded in the repository.  It creates a revision that you can view and &lt;br /&gt;
									revert back to at anytime.  When using Git, you are encourge to do many small commits since all of these commits are done &lt;br /&gt;
									on your computer. When you update (push) to the remote repository to backup or share with other developers all the commits will&lt;br /&gt;
									be viewable.&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									In projects with multiple developers, doing many small commits and updating the remote repository many times a day will allow your coworkers&lt;br /&gt;
									to merge your changes into their code and thus resolving discrepancies early which is much easier to resolve than waiting&lt;br /&gt;
									and doing a massive merge. &lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									A commit will always contain the author and committer.  Author is usually the creator/owner&lt;br /&gt;
									of the project and a committer can be a collaborator or the author.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fetch&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fetch is a command in Git or command, you use fetch to synchronize your local repository with the remote repository.  Its important to know that&lt;br /&gt;
										fetch does not merge any new changes to your source code (local repository).  New changes from the fetch will be considered a &amp;amp;quot;remote branches&amp;amp;quot;, &lt;br /&gt;
										you can combine new changes to your code by using the &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; command.&lt;br /&gt;
										  &lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the changes with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.  So you are making sure your local repository is up-to-date with the remote repository&lt;br /&gt;
											and if new code is downloaded, then you can check out what is new.  You will also need to do a &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										Note: fetch is not a clone, clone is a new copy down from the repository, fetch is to update your local repository. &lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fork&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fork is NOT a Git term, its a term born from the community.  Forking is similar to branching in that you copy the origin &lt;br /&gt;
										(Master) to your account.  The difference is that you are copying the source code from the author (owner) to your &lt;br /&gt;
										account.  Branching is copying within the same account.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										So when does this happen? Forking usually happens for 2 reasons:&lt;br /&gt;
										&amp;lt;ol&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork it to take the project in a new direction.  Obviously you can only do this with open source projects&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork the project to add to the project and request a merge back to the origin/master.  You as a independent &lt;br /&gt;
											developer want to contribute to the code.&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ol&amp;gt;&lt;br /&gt;
										Branching, cloning and forking is sometimes confused.&lt;br /&gt;
																	&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;merge&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A merge is combining branches with your Master (origin).  When to you do &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt; a fetch and merge will be done to update your local repository.&lt;br /&gt;
										When merging two code sets together, if a conflict were to occur, it will be up to you to resolve it.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;pull&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A pull is basically 2 command execute together.  Pull will do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; on your local repository.&lt;br /&gt;
										When using the GitHub Windows Client, you will usually do a pull.&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the change with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.   So you are making sure your local repository is up-to-date with the remote repository and you can&lt;br /&gt;
											test you code with any new code committed to the remote repository.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;push&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Push is the command to upload your local repository to the remote repository.  Any changes that you want to push to the remote repository, you &lt;br /&gt;
										will need to &amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt; on those changes on your local repository.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;repository&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Contains all the history... like commits, branches, tags and your source code.  Repository can be remote which is a central&lt;br /&gt;
									storage for repository.  Local repository would be what the user/deverloper works with (make changes to).&lt;br /&gt;
									Remote repository is a centralize repository for sharing projects.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;revision&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Revisions represents a version of the source code. Git identifies revisions with SHA1 ids. SHA1 ids are 160 bits long and are represented &lt;br /&gt;
										in hexadecimal. The latest version can be addressed via &amp;quot;HEAD&amp;quot;, the version before that via &amp;quot;HEAD~1&amp;quot; and so on.&lt;br /&gt;
										&lt;br /&gt;
										A revision is created when you do a commit.  So a commit is a command and a revision is like the bookmark... so when you hear someone&lt;br /&gt;
										say &amp;amp;quot;revert back to the last commit&amp;amp;quot;... technically they should say, &amp;amp;quot;revert back to the last revision&amp;amp;quot;.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;tags&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A tag is like a commit, it allows you to permanantly mark a point in your project.  A common use of tags is to mark the &lt;br /&gt;
									application version number.  This version number is the same displayed in the help/about.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;URL&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Used to tell Git where the remote repository is.  &lt;br /&gt;
										&amp;lt;br /&amp;gt;There is more than one type of URL&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;HTTP: Should be a https (secure) https://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;GIT: Uses git communication git://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;SSH: Uses SSH git@github.com:&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;/tbody&amp;gt;&lt;br /&gt;
							&amp;lt;/table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87401</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87401"/>
		<updated>2014-09-20T00:52:38Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow Terminology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
							&amp;lt;h2&amp;gt;Commands&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;For a list of command line commands, please go to [Git-Reference]&amp;lt;/p&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
							&amp;lt;table class=&amp;quot;table table-striped&amp;quot;&amp;gt;&lt;br /&gt;
								&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;th width=&amp;quot;120px&amp;quot;&amp;gt;Term&amp;lt;/th&amp;gt;&lt;br /&gt;
									&amp;lt;th&amp;gt;Explanation&amp;lt;/th&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;branches&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;It allows you to create a separate working copy of your code and develop it in  a&lt;br /&gt;
									new way wihtout affect the original code.  So its like creating a new project (branch) based on the original, the original&lt;br /&gt;
									is usually called the Master.  The branch is completely independent of the Master and you can develop both the Master and&lt;br /&gt;
									branch at the same time.  You can also have multiple branches and you can &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; any of these together.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;clone&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Clone is a copy of a repository.  Clone is used when you copy from the remote repository to your local repository.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;collaborator&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Collaborators are other GitHub users that you’ve given write access to one or more of your repositories.&lt;br /&gt;
										Collaborators may fork any private repository you’ve added them to without their own paid plan. Their forks do not count against your private repository quota.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&lt;br /&gt;
										&amp;lt;em&amp;gt;This was taken from github.com&amp;lt;/em&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;commit&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A commit is like a bookmark/milestone that is recorded in the repository.  It creates a revision that you can view and &lt;br /&gt;
									revert back to at anytime.  When using Git, you are encourge to do many small commits since all of these commits are done &lt;br /&gt;
									on your computer. When you update (push) to the remote repository to backup or share with other developers all the commits will&lt;br /&gt;
									be viewable.&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									In projects with multiple developers, doing many small commits and updating the remote repository many times a day will allow your coworkers&lt;br /&gt;
									to merge your changes into their code and thus resolving discrepancies early which is much easier to resolve than waiting&lt;br /&gt;
									and doing a massive merge. &lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									A commit will always contain the author and committer.  Author is usually the creator/owner&lt;br /&gt;
									of the project and a committer can be a collaborator or the author.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fetch&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fetch is a command in Git or command, you use fetch to synchronize your local repository with the remote repository.  Its important to know that&lt;br /&gt;
										fetch does not merge any new changes to your source code (local repository).  New changes from the fetch will be considered a &amp;amp;quot;remote branches&amp;amp;quot;, &lt;br /&gt;
										you can combine new changes to your code by using the &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; command.&lt;br /&gt;
										  &lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the changes with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.  So you are making sure your local repository is up-to-date with the remote repository&lt;br /&gt;
											and if new code is downloaded, then you can check out what is new.  You will also need to do a &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										Note: fetch is not a clone, clone is a new copy down from the repository, fetch is to update your local repository. &lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fork&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fork is NOT a Git term, its a term born from the community.  Forking is similar to branching in that you copy the origin &lt;br /&gt;
										(Master) to your account.  The difference is that you are copying the source code from the author (owner) to your &lt;br /&gt;
										account.  Branching is copying within the same account.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										So when does this happen? Forking usually happens for 2 reasons:&lt;br /&gt;
										&amp;lt;ol&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork it to take the project in a new direction.  Obviously you can only do this with open source projects&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork the project to add to the project and request a merge back to the origin/master.  You as a independent &lt;br /&gt;
											developer want to contribute to the code.&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ol&amp;gt;&lt;br /&gt;
										Branching, cloning and forking is sometimes confused.&lt;br /&gt;
																	&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;merge&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A merge is combining branches with your Master (origin).  When to you do &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt; a fetch and merge will be done to update your local repository.&lt;br /&gt;
										When merging two code sets together, if a conflict were to occur, it will be up to you to resolve it.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;pull&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A pull is basically 2 command execute together.  Pull will do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; on your local repository.&lt;br /&gt;
										When using the GitHub Windows Client, you will usually do a pull.&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the change with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.   So you are making sure your local repository is up-to-date with the remote repository and you can&lt;br /&gt;
											test you code with any new code committed to the remote repository.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;push&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Push is the command to upload your local repository to the remote repository.  Any changes that you want to push to the remote repository, you &lt;br /&gt;
										will need to &amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt; on those changes on your local repository.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;repository&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Contains all the history... like commits, branches, tags and your source code.  Repository can be remote which is a central&lt;br /&gt;
									storage for repository.  Local repository would be what the user/deverloper works with (make changes to).&lt;br /&gt;
									Remote repository is a centralize repository for sharing projects.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;revision&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Revisions represents a version of the source code. Git identifies revisions with SHA1 ids. SHA1 ids are 160 bits long and are represented &lt;br /&gt;
										in hexadecimal. The latest version can be addressed via &amp;quot;HEAD&amp;quot;, the version before that via &amp;quot;HEAD~1&amp;quot; and so on.&lt;br /&gt;
										&lt;br /&gt;
										A revision is created when you do a commit.  So a commit is a command and a revision is like the bookmark... so when you hear someone&lt;br /&gt;
										say &amp;amp;quot;revert back to the last commit&amp;amp;quot;... technically they should say, &amp;amp;quot;revert back to the last revision&amp;amp;quot;.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;tags&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A tag is like a commit, it allows you to permanantly mark a point in your project.  A common use of tags is to mark the &lt;br /&gt;
									application version number.  This version number is the same displayed in the help/about.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;URL&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Used to tell Git where the remote repository is.  &lt;br /&gt;
										&amp;lt;br /&amp;gt;There is more than one type of URL&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;HTTP: Should be a https (secure) https://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;GIT: Uses git communication git://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;SSH: Uses SSH git@github.com:&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;/tbody&amp;gt;&lt;br /&gt;
							&amp;lt;/table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87385</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87385"/>
		<updated>2014-09-20T00:46:04Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow Terminology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
							&amp;lt;h2&amp;gt;Commands&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;For a list of command line commands, please go to [Git-Reference]&amp;lt;/p&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
							&amp;lt;table class=&amp;quot;table table-striped&amp;quot;&amp;gt;&lt;br /&gt;
								&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;th width=&amp;quot;120px&amp;quot;&amp;gt;Term&amp;lt;/th&amp;gt;&lt;br /&gt;
									&amp;lt;th&amp;gt;Explanation&amp;lt;/th&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;branches&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;It allows you to create a separate working copy of your code and develop it in  a&lt;br /&gt;
									new way wihtout affect the original code.  So its like creating a new project (branch) based on the original, the original&lt;br /&gt;
									is usually called the Master.  The branch is completely independent of the Master and you can develop both the Master and&lt;br /&gt;
									branch at the same time.  You can also have multiple branches and you can &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; any of these together.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&amp;lt;br /&amp;gt;Good discussion on &amp;lt;a href=&amp;quot;http://stackoverflow.com/questions/3329943/what-is-the-difference-between-branch-fork-and-clone-in-git&amp;quot;&amp;gt;stackoverflow.com&amp;lt;/a&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;clone&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Clone is a copy of a repository.  Clone is used when you copy from the remote repository to your local repository.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&amp;lt;br /&amp;gt;Good discussion on &amp;lt;a href=&amp;quot;http://stackoverflow.com/questions/3329943/what-is-the-difference-between-branch-fork-and-clone-in-git&amp;quot;&amp;gt;stackoverflow.com&amp;lt;/a&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;collaborator&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Collaborators are other GitHub users that you’ve given write access to one or more of your repositories.&lt;br /&gt;
										Collaborators may fork any private repository you’ve added them to without their own paid plan. Their forks do not count against your private repository quota.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&lt;br /&gt;
										&amp;lt;em&amp;gt;This was taken from github.com&amp;lt;/em&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;commit&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A commit is like a bookmark/milestone that is recorded in the repository.  It creates a revision that you can view and &lt;br /&gt;
									revert back to at anytime.  When using Git, you are encourge to do many small commits since all of these commits are done &lt;br /&gt;
									on your computer. When you update (push) to the remote repository to backup or share with other developers all the commits will&lt;br /&gt;
									be viewable.&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									In projects with multiple developers, doing many small commits and updating the remote repository many times a day will allow your coworkers&lt;br /&gt;
									to merge your changes into their code and thus resolving discrepancies early which is much easier to resolve than waiting&lt;br /&gt;
									and doing a massive merge. &lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									A commit will always contain the author and committer.  Author is usually the creator/owner&lt;br /&gt;
									of the project and a committer can be a collaborator or the author.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fetch&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fetch is a command in Git or command, you use fetch to synchronize your local repository with the remote repository.  Its important to know that&lt;br /&gt;
										fetch does not merge any new changes to your source code (local repository).  New changes from the fetch will be considered a &amp;amp;quot;remote branches&amp;amp;quot;, &lt;br /&gt;
										you can combine new changes to your code by using the &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; command.&lt;br /&gt;
										  &lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the changes with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.  So you are making sure your local repository is up-to-date with the remote repository&lt;br /&gt;
											and if new code is downloaded, then you can check out what is new.  You will also need to do a &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										Note: fetch is not a clone, clone is a new copy down from the repository, fetch is to update your local repository. &lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fork&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fork is NOT a Git term, its a term born from the community.  Forking is similar to branching in that you copy the origin &lt;br /&gt;
										(Master) to your account.  The difference is that you are copying the source code from the author (owner) to your &lt;br /&gt;
										account.  Branching is copying within the same account.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										So when does this happen? Forking usually happens for 2 reasons:&lt;br /&gt;
										&amp;lt;ol&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork it to take the project in a new direction.  Obviously you can only do this with open source projects&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork the project to add to the project and request a merge back to the origin/master.  You as a independent &lt;br /&gt;
											developer want to contribute to the code.&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ol&amp;gt;&lt;br /&gt;
										Branching, cloning and forking is sometimes confused.&lt;br /&gt;
																	&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;merge&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A merge is combining branches with your Master (origin).  When to you do &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt; a fetch and merge will be done to update your local repository.&lt;br /&gt;
										When merging two code sets together, if a conflict were to occur, it will be up to you to resolve it.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;pull&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A pull is basically 2 command execute together.  Pull will do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; on your local repository.&lt;br /&gt;
										When using the GitHub Windows Client, you will usually do a pull.&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the change with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.   So you are making sure your local repository is up-to-date with the remote repository and you can&lt;br /&gt;
											test you code with any new code committed to the remote repository.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;push&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Push is the command to upload your local repository to the remote repository.  Any changes that you want to push to the remote repository, you &lt;br /&gt;
										will need to &amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt; on those changes on your local repository.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;repository&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Contains all the history... like commits, branches, tags and your source code.  Repository can be remote which is a central&lt;br /&gt;
									storage for repository.  Local repository would be what the user/deverloper works with (make changes to).&lt;br /&gt;
									Remote repository is a centralize repository for sharing projects.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;revision&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Revisions represents a version of the source code. Git identifies revisions with SHA1 ids. SHA1 ids are 160 bits long and are represented &lt;br /&gt;
										in hexadecimal. The latest version can be addressed via &amp;quot;HEAD&amp;quot;, the version before that via &amp;quot;HEAD~1&amp;quot; and so on.&lt;br /&gt;
										&lt;br /&gt;
										A revision is created when you do a commit.  So a commit is a command and a revision is like the bookmark... so when you hear someone&lt;br /&gt;
										say &amp;amp;quot;revert back to the last commit&amp;amp;quot;... technically they should say, &amp;amp;quot;revert back to the last revision&amp;amp;quot;.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;tags&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A tag is like a commit, it allows you to permanantly mark a point in your project.  A common use of tags is to mark the &lt;br /&gt;
									application version number.  This version number is the same displayed in the help/about.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;URL&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Used to tell Git where the remote repository is.  &lt;br /&gt;
										&amp;lt;br /&amp;gt;There is more than one type of URL&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;HTTP: Should be a https (secure) https://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;GIT: Uses git communication git://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;SSH: Uses SSH git@github.com:&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;/tbody&amp;gt;&lt;br /&gt;
							&amp;lt;/table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87378</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87378"/>
		<updated>2014-09-20T00:42:52Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow Terminology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
							&amp;lt;h2&amp;gt;Commands&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;For a list of command line commands, please go to [Git-Reference]&amp;lt;/p&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
							&amp;lt;table class=&amp;quot;table table-striped&amp;quot;&amp;gt;&lt;br /&gt;
								&amp;lt;tbody&amp;gt;&lt;br /&gt;
								&amp;lt;thead&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;th width=&amp;quot;120px&amp;quot;&amp;gt;Term&amp;lt;/th&amp;gt;&lt;br /&gt;
									&amp;lt;th&amp;gt;Explanation&amp;lt;/th&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;/thead&amp;gt;&lt;br /&gt;
								&amp;lt;tbody&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;branches&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;It allows you to create a separate working copy of your code and develop it in  a&lt;br /&gt;
									new way wihtout affect the original code.  So its like creating a new project (branch) based on the original, the original&lt;br /&gt;
									is usually called the Master.  The branch is completely independent of the Master and you can develop both the Master and&lt;br /&gt;
									branch at the same time.  You can also have multiple branches and you can &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; any of these together.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&amp;lt;br /&amp;gt;Good discussion on &amp;lt;a href=&amp;quot;http://stackoverflow.com/questions/3329943/what-is-the-difference-between-branch-fork-and-clone-in-git&amp;quot;&amp;gt;stackoverflow.com&amp;lt;/a&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;clone&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Clone is a copy of a repository.  Clone is used when you copy from the remote repository to your local repository.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&amp;lt;br /&amp;gt;Good discussion on &amp;lt;a href=&amp;quot;http://stackoverflow.com/questions/3329943/what-is-the-difference-between-branch-fork-and-clone-in-git&amp;quot;&amp;gt;stackoverflow.com&amp;lt;/a&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;collaborator&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Collaborators are other GitHub users that you’ve given write access to one or more of your repositories.&lt;br /&gt;
										Collaborators may fork any private repository you’ve added them to without their own paid plan. Their forks do not count against your private repository quota.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&lt;br /&gt;
										&amp;lt;em&amp;gt;This was taken from github.com&amp;lt;/em&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;commit&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A commit is like a bookmark/milestone that is recorded in the repository.  It creates a revision that you can view and &lt;br /&gt;
									revert back to at anytime.  When using Git, you are encourge to do many small commits since all of these commits are done &lt;br /&gt;
									on your computer. When you update (push) to the remote repository to backup or share with other developers all the commits will&lt;br /&gt;
									be viewable.&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									In projects with multiple developers, doing many small commits and updating the remote repository many times a day will allow your coworkers&lt;br /&gt;
									to merge your changes into their code and thus resolving discrepancies early which is much easier to resolve than waiting&lt;br /&gt;
									and doing a massive merge. &lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									A commit will always contain the author and committer.  Author is usually the creator/owner&lt;br /&gt;
									of the project and a committer can be a collaborator or the author.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fetch&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fetch is a command in Git or command, you use fetch to synchronize your local repository with the remote repository.  Its important to know that&lt;br /&gt;
										fetch does not merge any new changes to your source code (local repository).  New changes from the fetch will be considered a &amp;amp;quot;remote branches&amp;amp;quot;, &lt;br /&gt;
										you can combine new changes to your code by using the &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; command.&lt;br /&gt;
										  &lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the changes with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.  So you are making sure your local repository is up-to-date with the remote repository&lt;br /&gt;
											and if new code is downloaded, then you can check out what is new.  You will also need to do a &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										Note: fetch is not a clone, clone is a new copy down from the repository, fetch is to update your local repository. &lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fork&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fork is NOT a Git term, its a term born from the community.  Forking is similar to branching in that you copy the origin &lt;br /&gt;
										(Master) to your account.  The difference is that you are copying the source code from the author (owner) to your &lt;br /&gt;
										account.  Branching is copying within the same account.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										So when does this happen? Forking usually happens for 2 reasons:&lt;br /&gt;
										&amp;lt;ol&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork it to take the project in a new direction.  Obviously you can only do this with open source projects&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork the project to add to the project and request a merge back to the origin/master.  You as a independent &lt;br /&gt;
											developer want to contribute to the code.&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ol&amp;gt;&lt;br /&gt;
										Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&amp;lt;br /&amp;gt;Good discussion on &amp;lt;a href=&amp;quot;http://stackoverflow.com/questions/3329943/what-is-the-difference-between-branch-fork-and-clone-in-git&amp;quot;&amp;gt;stackoverflow.com&amp;lt;/a&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;merge&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A merge is combining branches with your Master (origin).  When to you do &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt; a fetch and merge will be done to update your local repository.&lt;br /&gt;
										When merging two code sets together, if a conflict were to occur, it will be up to you to resolve it.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;pull&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A pull is basically 2 command execute together.  Pull will do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; on your local repository.&lt;br /&gt;
										When using the GitHub Windows Client, you will usually do a pull.&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the change with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.   So you are making sure your local repository is up-to-date with the remote repository and you can&lt;br /&gt;
											test you code with any new code committed to the remote repository.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;push&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Push is the command to upload your local repository to the remote repository.  Any changes that you want to push to the remote repository, you &lt;br /&gt;
										will need to &amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt; on those changes on your local repository.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;repository&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Contains all the history... like commits, branches, tags and your source code.  Repository can be remote which is a central&lt;br /&gt;
									storage for repository.  Local repository would be what the user/deverloper works with (make changes to).&lt;br /&gt;
									Remote repository is a centralize repository for sharing projects.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;revision&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Revisions represents a version of the source code. Git identifies revisions with SHA1 ids. SHA1 ids are 160 bits long and are represented &lt;br /&gt;
										in hexadecimal. The latest version can be addressed via &amp;quot;HEAD&amp;quot;, the version before that via &amp;quot;HEAD~1&amp;quot; and so on.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;em&amp;gt;This was taken from &amp;lt;a href=&amp;quot;http://www.vogella.com/articles/Git/article.html&amp;quot;&amp;gt;vogella.com&amp;lt;/a&amp;gt;&amp;lt;/em&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										A revision is created when you do a commit.  So a commit is a command and a revision is like the bookmark... so when you hear someone&lt;br /&gt;
										say &amp;amp;quot;revert back to the last commit&amp;amp;quot;... technically they should say, &amp;amp;quot;revert back to the last revision&amp;amp;quot;.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;tags&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A tag is like a commit, it allows you to permanantly mark a point in your project.  A common use of tags is to mark the &lt;br /&gt;
									application version number.  This version number is the same displayed in the help/about.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;URL&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Used to tell Git where the remote repository is.  &lt;br /&gt;
										&amp;lt;br /&amp;gt;There is more than one type of URL&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;HTTP: Should be a https (secure) https://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;GIT: Uses git communication git://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;SSH: Uses SSH git@github.com:&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;/tbody&amp;gt;&lt;br /&gt;
							&amp;lt;/table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87372</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87372"/>
		<updated>2014-09-20T00:40:58Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow Terminology ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tab-pane&amp;quot; id=&amp;quot;lC&amp;quot;&amp;gt;&lt;br /&gt;
							&amp;lt;h2&amp;gt;Commands&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;For a list of command line commands, please go to &amp;lt;a href=&amp;quot;http://gitref.org/&amp;quot;&amp;gt;gitref.org&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
							&amp;lt;h2&amp;gt;Definitions&amp;lt;/h2&amp;gt;&lt;br /&gt;
							&amp;lt;p&amp;gt;This is not a complete list, it ones that I think are important.&amp;lt;/p&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
							&amp;lt;table class=&amp;quot;table table-striped&amp;quot;&amp;gt;&lt;br /&gt;
								&amp;lt;tbody&amp;gt;&lt;br /&gt;
								&amp;lt;thead&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;th width=&amp;quot;120px&amp;quot;&amp;gt;Term&amp;lt;/th&amp;gt;&lt;br /&gt;
									&amp;lt;th&amp;gt;Explanation&amp;lt;/th&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;/thead&amp;gt;&lt;br /&gt;
								&amp;lt;tbody&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;branches&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;It allows you to create a separate working copy of your code and develop it in  a&lt;br /&gt;
									new way wihtout affect the original code.  So its like creating a new project (branch) based on the original, the original&lt;br /&gt;
									is usually called the Master.  The branch is completely independent of the Master and you can develop both the Master and&lt;br /&gt;
									branch at the same time.  You can also have multiple branches and you can &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; any of these together.&lt;br /&gt;
									&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&amp;lt;br /&amp;gt;Good discussion on &amp;lt;a href=&amp;quot;http://stackoverflow.com/questions/3329943/what-is-the-difference-between-branch-fork-and-clone-in-git&amp;quot;&amp;gt;stackoverflow.com&amp;lt;/a&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;clone&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Clone is a copy of a repository.  Clone is used when you copy from the remote repository to your local repository.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&amp;lt;br /&amp;gt;Good discussion on &amp;lt;a href=&amp;quot;http://stackoverflow.com/questions/3329943/what-is-the-difference-between-branch-fork-and-clone-in-git&amp;quot;&amp;gt;stackoverflow.com&amp;lt;/a&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;collaborator&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Collaborators are other GitHub users that you’ve given write access to one or more of your repositories.&lt;br /&gt;
										Collaborators may fork any private repository you’ve added them to without their own paid plan. Their forks do not count against your private repository quota.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&lt;br /&gt;
										&amp;lt;em&amp;gt;This was taken from github.com&amp;lt;/em&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;commit&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A commit is like a bookmark/milestone that is recorded in the repository.  It creates a revision that you can view and &lt;br /&gt;
									revert back to at anytime.  When using Git, you are encourge to do many small commits since all of these commits are done &lt;br /&gt;
									on your computer. When you update (push) to the remote repository to backup or share with other developers all the commits will&lt;br /&gt;
									be viewable.&lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									In projects with multiple developers, doing many small commits and updating the remote repository many times a day will allow your coworkers&lt;br /&gt;
									to merge your changes into their code and thus resolving discrepancies early which is much easier to resolve than waiting&lt;br /&gt;
									and doing a massive merge. &lt;br /&gt;
									&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
									A commit will always contain the author and committer.  Author is usually the creator/owner&lt;br /&gt;
									of the project and a committer can be a collaborator or the author.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fetch&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fetch is a command in Git or command, you use fetch to synchronize your local repository with the remote repository.  Its important to know that&lt;br /&gt;
										fetch does not merge any new changes to your source code (local repository).  New changes from the fetch will be considered a &amp;amp;quot;remote branches&amp;amp;quot;, &lt;br /&gt;
										you can combine new changes to your code by using the &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; command.&lt;br /&gt;
										  &lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the changes with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.  So you are making sure your local repository is up-to-date with the remote repository&lt;br /&gt;
											and if new code is downloaded, then you can check out what is new.  You will also need to do a &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt;.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										Note: fetch is not a clone, clone is a new copy down from the repository, fetch is to update your local repository. &lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;fork&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Fork is NOT a Git term, its a term born from the community.  Forking is similar to branching in that you copy the origin &lt;br /&gt;
										(Master) to your account.  The difference is that you are copying the source code from the author (owner) to your &lt;br /&gt;
										account.  Branching is copying within the same account.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										So when does this happen? Forking usually happens for 2 reasons:&lt;br /&gt;
										&amp;lt;ol&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork it to take the project in a new direction.  Obviously you can only do this with open source projects&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;You fork the project to add to the project and request a merge back to the origin/master.  You as a independent &lt;br /&gt;
											developer want to contribute to the code.&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ol&amp;gt;&lt;br /&gt;
										Branching, cloning and forking is sometimes confused.&lt;br /&gt;
									&amp;lt;br /&amp;gt;Good discussion on &amp;lt;a href=&amp;quot;http://stackoverflow.com/questions/3329943/what-is-the-difference-between-branch-fork-and-clone-in-git&amp;quot;&amp;gt;stackoverflow.com&amp;lt;/a&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;merge&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A merge is combining branches with your Master (origin).  When to you do &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt; a fetch and merge will be done to update your local repository.&lt;br /&gt;
										When merging two code sets together, if a conflict were to occur, it will be up to you to resolve it.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;pull&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										A pull is basically 2 command execute together.  Pull will do a &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; on your local repository.&lt;br /&gt;
										When using the GitHub Windows Client, you will usually do a pull.&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;When will this happen?&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;When a collaborator/coworker ask you to test the change with your code&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;Before you do a push (upload to remote repository), you would want to do a &amp;lt;code&amp;gt;pull&amp;lt;/code&amp;gt;, which will synchronize your&lt;br /&gt;
											local repository to the remote repository.   So you are making sure your local repository is up-to-date with the remote repository and you can&lt;br /&gt;
											test you code with any new code committed to the remote repository.&lt;br /&gt;
											&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;push&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Push is the command to upload your local repository to the remote repository.  Any changes that you want to push to the remote repository, you &lt;br /&gt;
										will need to &amp;lt;code&amp;gt;commit&amp;lt;/code&amp;gt; on those changes on your local repository.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;repository&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Contains all the history... like commits, branches, tags and your source code.  Repository can be remote which is a central&lt;br /&gt;
									storage for repository.  Local repository would be what the user/deverloper works with (make changes to).&lt;br /&gt;
									Remote repository is a centralize repository for sharing projects.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;revision&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;&lt;br /&gt;
										Revisions represents a version of the source code. Git identifies revisions with SHA1 ids. SHA1 ids are 160 bits long and are represented &lt;br /&gt;
										in hexadecimal. The latest version can be addressed via &amp;quot;HEAD&amp;quot;, the version before that via &amp;quot;HEAD~1&amp;quot; and so on.&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;em&amp;gt;This was taken from &amp;lt;a href=&amp;quot;http://www.vogella.com/articles/Git/article.html&amp;quot;&amp;gt;vogella.com&amp;lt;/a&amp;gt;&amp;lt;/em&amp;gt;&lt;br /&gt;
										&lt;br /&gt;
										&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
										A revision is created when you do a commit.  So a commit is a command and a revision is like the bookmark... so when you hear someone&lt;br /&gt;
										say &amp;amp;quot;revert back to the last commit&amp;amp;quot;... technically they should say, &amp;amp;quot;revert back to the last revision&amp;amp;quot;.&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;tags&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;A tag is like a commit, it allows you to permanantly mark a point in your project.  A common use of tags is to mark the &lt;br /&gt;
									application version number.  This version number is the same displayed in the help/about.&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;tr&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;URL&amp;lt;/td&amp;gt;&lt;br /&gt;
									&amp;lt;td&amp;gt;Used to tell Git where the remote repository is.  &lt;br /&gt;
										&amp;lt;br /&amp;gt;There is more than one type of URL&lt;br /&gt;
										&amp;lt;ul&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;HTTP: Should be a https (secure) https://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;GIT: Uses git communication git://github.com/&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
											&amp;lt;li&amp;gt;SSH: Uses SSH git@github.com:&amp;amp;lt;user&amp;amp;gt;/&amp;amp;lt;git_project&amp;amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
										&amp;lt;/ul&amp;gt;&lt;br /&gt;
									&amp;lt;/td&amp;gt;&lt;br /&gt;
								&amp;lt;/tr&amp;gt;&lt;br /&gt;
								&amp;lt;/tbody&amp;gt;&lt;br /&gt;
							&amp;lt;/table&amp;gt;&lt;br /&gt;
							&lt;br /&gt;
						&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87358</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87358"/>
		<updated>2014-09-20T00:34:42Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Why Git? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87357</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87357"/>
		<updated>2014-09-20T00:34:28Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87355</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87355"/>
		<updated>2014-09-20T00:34:19Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''=Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes.The purpose of this Index (staging area) is that it allows you to control what you want to commit. Typically,any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is the current git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87352</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87352"/>
		<updated>2014-09-20T00:32:58Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''=Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
&lt;br /&gt;
'''=Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
&lt;br /&gt;
'''=Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes. What the purpose of this Index (staging area)? It allows you to control what you want to commit. So any code changes that are not complete can be left out of the commit.&lt;br /&gt;
&lt;br /&gt;
'''=Working directory'''&lt;br /&gt;
A working directory is your git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87349</id>
		<title>CSC/ECE 517 Fall 2014/ch1a F1415 rv</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/ch1a_F1415_rv&amp;diff=87349"/>
		<updated>2014-09-20T00:32:21Z</updated>

		<summary type="html">&lt;p&gt;Vpiddem: /* Git Work Flow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:git-logo.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== What is Git? ===&lt;br /&gt;
Git (/ɡɪt/) is a locally enabled distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005, and has since become the most widely adopted version control system for software development. Github, a git repository web-based hosting service is in fact the largest code host on the planet with over 15.7 million repositories. Large or small, every repository comes with the same powerful tools. These tools are open to the community for public projects and secure for private projects.&lt;br /&gt;
As with most other distributed revision control systems, and unlike most client–server systems, every Git working directory is a full-fledged repository with complete history and full version-tracking capabilities, independent of network access or a central server. Like the Linux kernel, Git is free software distributed under the terms of the GNU General Public License version 2.&lt;br /&gt;
&lt;br /&gt;
=== Why Distributed Version Control System? ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Distributed_revision_control Distributed Revision Control Systems (DRCS)] take a peer-to-peer approach, as opposed to the client-server approach of centralized systems. Rather than a single, central repository on which clients synchronize, each peer's working copy of the codebase is a bona-fide repository.Distributed revision control conducts synchronization by exchanging patches(change-sets) from peer to peer. This results in some important differences from a centralized system:&lt;br /&gt;
&lt;br /&gt;
*No canonical, reference copy of the codebase exists by default; only working copies.&lt;br /&gt;
*Common operations (such as commits, viewing history, and reverting changes) are fast, because there is no need to communicate with a central server.&lt;br /&gt;
*Rather, communication is only necessary when pushing or pulling changes to or from other peers.&lt;br /&gt;
*Each working copy effectively functions as a remote backup of the codebase and of its change-history, providing inherent protection against data loss.&lt;br /&gt;
&lt;br /&gt;
The act of cloning an entire repository gives distributed version control tools several advantages over centralized systems:&lt;br /&gt;
*Performing actions other than pushing and pulling changesets is extremely fast because the tool only needs to access the hard drive, not a remote server.&lt;br /&gt;
*Committing new changesets can be done locally without anyone else seeing them. Once you have a group of changesets ready, you can push all of them at once.&lt;br /&gt;
*Everything but pushing and pulling can be done without an internet connection. So you can work on a plane, and you won’t be forced to commit several bugfixes as one big changeset.&lt;br /&gt;
*Since each programmer has a full copy of the project repository, they can share changes with one or two other people at a time if they want to get some feedback before showing the changes to everyone.&lt;br /&gt;
&lt;br /&gt;
=== Why Git? ===&lt;br /&gt;
'''Branching Model'''&lt;br /&gt;
Git's most compelling feature that really makes it stand apart from nearly every other SCM out there is its branching model.Git will allow you to have multiple local branches that can be entirely independent of each other and the creation, merging and deletion of those lines of development take seconds.&lt;br /&gt;
This means that you can do things like:&lt;br /&gt;
 • Create experimental branches.&lt;br /&gt;
 • Clear cut Branch delineation into production,Development,Testing,Fixes,Patches,etc.&lt;br /&gt;
 • Seamless Navigation across feature branches and Code Versions.&lt;br /&gt;
 • Create and Work on your own patches, features and tests without effecting the Production/Master branch.&lt;br /&gt;
 • Independent Merging and Management of one's content changes.&lt;br /&gt;
&lt;br /&gt;
'''Everything is Local'''&lt;br /&gt;
There is very little outside of 'fetch', 'pull' and 'push' that communicates in any way with anything other than your hard disk.This not only makes most operations much faster than you may be used to, but it also allows you to work on stuff offline. That may not sound like a big deal, but I'm always amazed at how often I actually do work offline. Being able to branch, merge, commit and browse history of your project while on the plane or train is very productive.&lt;br /&gt;
local repo to remote repo flowchart.&lt;br /&gt;
Even in Mercurial, common commands like 'incoming' and 'outgoing' hit the server, whereas with Git you can 'fetch' all the servers data before going offline and do comparisons, merges and logs of data that is on the server but not in your local branches yet.&lt;br /&gt;
This means that it's very easy to have copies of not only your branches, but also of everyone's branches that are working with you in your Git repository without having to mess your own stuff up.&lt;br /&gt;
'''&lt;br /&gt;
Git is Fast'''&lt;br /&gt;
Git is fast. Everyone—even most of the hard core users of these other systems—generally give Git this title. With Git, all operations are performed locally giving it a bit of a leg up on SVN and Perforce, both of which require network access for certain operations. However, even compared to the other DSCMs that also perform operations locally, Git is pretty fast.&lt;br /&gt;
Part of this is likely because it was built to work on the Linux kernel, which means that it has had to deal effectively with large repositories from day one. Additionally, Git is written in C, reducing the overhead of runtimes associated with higher-level languages. Another reason that Git is so fast is that the primary developers have made this a design goal of the application.&lt;br /&gt;
&lt;br /&gt;
'''Git is Small'''&lt;br /&gt;
Git is really good at conserving disk space. Your Git directory will (in general) barely be larger than an SVN checkout—in some cases actually smaller (apparently a lot can go in those .svn dirs).&lt;br /&gt;
The following numbers were taken from clones of the [[Django]] [http://wiki.expertiza.ncsu.edu/index.php/CSC/ECE_517_Fall_2014/ch1a_8_os#cite_note-0]project in each of its semi-official Git mirrors at the same point in its history.&lt;br /&gt;
Git	Hg	Bzr	SVN&lt;br /&gt;
Repo Alone	24M	34M	45M	&lt;br /&gt;
Entire Directory	43M	53M	64M	61M&lt;br /&gt;
&lt;br /&gt;
'''The Staging Area'''&lt;br /&gt;
Unlike the other systems, Git has what it calls the &amp;quot;staging area&amp;quot; or &amp;quot;index&amp;quot;. This is an intermediate area that you can setup what you want your commit to look like before you commit it.&lt;br /&gt;
The cool thing about the staging area, and what sets Git apart from all these other tools, is that you can easily stage some of your files as you finish them and then commit them without committing all the modified files in your working directory, or having to list them on the command line during the commit&lt;br /&gt;
add commit workflow diagram&lt;br /&gt;
This also allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as you need.&lt;br /&gt;
Of course, Git also makes it pretty easy to ignore this feature if you don't want that kind of control—just slap a '-a' to your commit command in order to add all changes to all files to the staging area.&lt;br /&gt;
commit only workflow diagram&lt;br /&gt;
&lt;br /&gt;
'''Distributed'''&lt;br /&gt;
One of the coolest features of any of the Distributed SCMs, Git included, is that it's distributed. This means that instead of doing a &amp;quot;checkout&amp;quot; of the current tip of the source code, you do a &amp;quot;clone&amp;quot; of the entire repository.&lt;br /&gt;
This means that even if you're using a centralized workflow, every user has what is essentially a full backup of the main server, each of which could be pushed up to replace the main server in the event of a crash or corruption. There is basically no single point of failure with Git unless there is only a single point.&lt;br /&gt;
This does not slow things down much, either. On average, an SVN checkout is only marginally faster than any of the DSCMs. Of the DSCMs I tested, Git was the fastest.&lt;br /&gt;
cloning benchmarks	&lt;br /&gt;
Git	1m 59s&lt;br /&gt;
Hg	2m 24s&lt;br /&gt;
Bzr	5m 11s&lt;br /&gt;
SVN	1m 4s&lt;br /&gt;
&lt;br /&gt;
'''Any Workflow'''&lt;br /&gt;
One of the amazing things about Git is that because of its distributed nature and super branching system, you can easily implement pretty much any workflow you can think of relatively easily.&lt;br /&gt;
Subversion-Style Workflow&lt;br /&gt;
A very common Git workflow, especially from people transitioning from a centralized system, is a centralized workflow. Git will not allow you to push if someone has pushed since the last time you fetched, so a centralized model where all developers push to the same server works just fine.&lt;br /&gt;
subversion-style workflow&lt;br /&gt;
&lt;br /&gt;
'''Integration Manager Workflow'''&lt;br /&gt;
&lt;br /&gt;
Another common Git workflow is where there is an integration manager—a single person who commits to the 'blessed' repository, and then a number of developers who clone from that repository, push to their own independent repositories and ask the integrator to pull in their changes. This is the type of development model you often see with open source or GitHub repositories.&lt;br /&gt;
integration manager workflow&lt;br /&gt;
'''&lt;br /&gt;
Dictator and Lieutenants Workflow'''&lt;br /&gt;
&lt;br /&gt;
For more massive projects, you can setup your developers similar to the way the Linux kernel is run, where people are in charge of a specific subsystem of the project ('lieutenants') and merge in all changes that have to do with that subsystem. Then another integrator (the 'dictator') can pull changes from only his/her lieutenants and push those to the 'blessed' repository that everyone then clones from again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Work Flow ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Git_data_flow_simplified.svg.png]]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
'''Git Data Flow'''&lt;br /&gt;
&lt;br /&gt;
Understanding the Git and a typical Distributed VCS terminology :&lt;br /&gt;
&lt;br /&gt;
A project is the files/source code a developer is currently writing. A git-project is a project that is using git to track/manage changes to the project.&lt;br /&gt;
'''Remote repository'''&lt;br /&gt;
A centralize Git server to host all your git-projects. A central repository (repo) is not required but it is the best way to distribute (share) your git-projects to different user/developers. Most would call the remote repository (repo) the Origin and keeping it up-to-date is highly recommended. In our case, GitHub would be our remote repo. They all work together and it all one thing.&lt;br /&gt;
'''Local repository'''&lt;br /&gt;
A local repo is a git-project on your computer. If you were to have a Remote repository (GitHub), then the local repo would be a clone (exact copy) of the remote git-project. When you make changes to your local repo like adding code, you will need to update (push) the git-project to remote repo.&lt;br /&gt;
'''Index (cache) - Staging'''&lt;br /&gt;
When you make changes to your files, you can not commit (snapshot in time) until you &amp;quot;stage&amp;quot; the files. Once you stage the file, you can then commit the changes. What the purpose of this Index (staging area)? It allows you to control what you want to commit. So any code changes that are not complete can be left out of the commit.&lt;br /&gt;
'''Working directory'''&lt;br /&gt;
A working directory is your git-project, which is your source code with git files. A working directory is a local repo which you can make changes (commit, branches) to it.&lt;br /&gt;
&lt;br /&gt;
== Characteristics of Git ==&lt;br /&gt;
&lt;br /&gt;
;Strong support for non-linear development: Git supports rapid and convenient branching and merging, and includes powerful tools for visualizing and navigating a non-linear development history.&lt;br /&gt;
&lt;br /&gt;
;Distributed development: Like most other modern version control systems, Git gives each developer a local copy of the entire development history, and changes are copied from one such repository to another. These changes are imported as additional development branches, and can be merged in the same way as a locally developed branch. Repositories can be easily accessed via the efficient Git protocol (optionally wrapped in ssh for authentication and security) or simply using HTTP - you can publish your repository anywhere without any special webserver configuration required.&lt;br /&gt;
&lt;br /&gt;
;Efficient handling of large projects: Git is very fast and scales well even when working with large projects and long histories. It is commonly an order of magnitude faster than most other version control systems, and several orders of magnitude faster on some operations. It also uses an extremely efficient packed format for long-term revision storage that currently tops any other open source version control system.&lt;br /&gt;
&lt;br /&gt;
;Cryptographic authentication of history: The Git history is stored in such a way that the name of a particular revision (a &amp;quot;commit&amp;quot; in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. Also, tags can be cryptographically signed.&lt;br /&gt;
&lt;br /&gt;
;Toolkit-based design: Following the [http://www.unix.org/ Unix] tradition, Git is a collection of many small tools written in C, and a number of scripts that provide convenient wrappers. Git provides tools for both convenient human usage and easy scripting to perform new clever operations.&lt;br /&gt;
&lt;br /&gt;
== How do I use Git? ==&lt;br /&gt;
&lt;br /&gt;
Every commit that a user makes will have his/her name and email address to identify the ‘owner’ of the commit, so the user should give these values in a form of configuration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email &amp;quot;your@email.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get started with Git, a user needs to run the git init command in an empty directory; this initializes a [http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository Git repository] in that folder, adding a ''.git'' folder within it. A repository is kind of like a code history book. It will hold all the past versions of your code, as well as the current one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A project managed by Git can be considered as a tree; a user can create different features on different branches, and everything will stay separate and safe. After the user has created new files in the repository. It is time to commit these files to mark the completion of feature development and ready to push changes to remote repository. However, before that, the user needs to add the files and move it to staging area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A user can also more specifically add files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add *.js&lt;br /&gt;
git add index.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will add all the files to staging area. To stage is simply to prepare it finely for a commit. Git, with its index allows you to commit only certain parts of the changes you've done since the last commit.&lt;br /&gt;
[[File:GitThreeStates.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
After a user has staged the required files, they need to commit the files by giving a commit description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -m &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each commit should have an accompanying message, so everyone in the project knows why that code was committed. A user can also skip the command to add the files in the staging area by directly asking Git to stage and commit with a message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git commit -am &amp;quot;Commit description&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git uses the code contents of the commit to create a 40 character SHA1 hash. The neat part about this is that, since it's using the code to create the hash, no two hashes in the user's project will be the same unless the code in the commits is identical. A user can check the status of the git repository by the following command.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push the changes to a remote git repository, a user can do a git push as following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vpiddem</name></author>
	</entry>
</feed>