<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fi">
	<id>https://www.linux.fi/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Karilindgren</id>
	<title>Linux.fi - Käyttäjän muokkaukset [fi]</title>
	<link rel="self" type="application/atom+xml" href="https://www.linux.fi/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Karilindgren"/>
	<link rel="alternate" type="text/html" href="https://www.linux.fi/wiki/Toiminnot:Muokkaukset/Karilindgren"/>
	<updated>2026-04-17T04:49:50Z</updated>
	<subtitle>Käyttäjän muokkaukset</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Git&amp;diff=45283</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Git&amp;diff=45283"/>
		<updated>2016-03-17T23:17:12Z</updated>

		<summary type="html">&lt;p&gt;Karilindgren: /* Tagit ja tunnisteet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma &lt;br /&gt;
 | nimi=Git&lt;br /&gt;
 | kuva=[[Kuva:Git-logo.svg]] &lt;br /&gt;
 | kuvateksti=&lt;br /&gt;
 | lisenssi=[[GPL]]v2 &lt;br /&gt;
 | käyttöliittymä=teksti&lt;br /&gt;
 | kotisivu=[http://git-scm.com/ git-scm.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Git&#039;&#039;&#039; on hajautettu [[versionhallintajärjestelmä]], jonka kehityksen aloitti [[Linus Torvalds]] Linuxin [[ydin|ytimen]] kehitystä varten. Se korvasi ytimen kehityksessä suljetun lähdekoodin BitKeeperin.&lt;br /&gt;
&lt;br /&gt;
== Perusperiaate ==&lt;br /&gt;
Git on hajautettu versionhallintajärjestelmä mikä tarkoittaa sitä, että jokaisella käyttäjällä on käytössä paikallinen kopio versionhallinnasta. Käyttäjät tekevät omaan paikalliseen kopioonsa muutoksia ja lopulta liittävät (engl. &#039;&#039;merge&#039;&#039;) oman kehityshaaransa (engl. &#039;&#039;branch&#039;&#039;) projektin pääasialliseen versionhallintajärjestelmään.&lt;br /&gt;
&lt;br /&gt;
Gitissä eri kehityshaarojen käyttäminen (esimerkiksi luominen, vertailu ja yhdistäminen) on helppoa ja ideana on, että isommista muutoksista luodaan oma kehityshaaransa. Kehityshaaroja voidaan muokata toisistaan riippumatta, ja lopulta esimerkiksi vakaasta kehityshaarasta haarautetussa epävakaassa kehityshaarassa tehty työ voidaan liittää takaisin vakaaseen haaraan työn valmistuttua.&lt;br /&gt;
&lt;br /&gt;
Kehitystyö tapahtuu käytännössä viemällä muutoksia versionhallintaan eli tekemällä ns. &#039;&#039;commiteja&#039;&#039; (engl. &#039;&#039;commit&#039;&#039;, vakiintunutta suomennosta ei ole). Gitissä jokaiselle commitille luodaan yksilöllinen [[SHA|SHA-1]]-tunniste jolla siihen voidaan viitata. Tunnisteen avulla varmistetaan myös se, ettei tietokantaa voida vahingossa tai tahallaan korruptoida. &lt;br /&gt;
&lt;br /&gt;
== Käyttö ==&lt;br /&gt;
Seuraavassa käydään läpi Gitin peruskäyttö esimerkin avulla luomalla esimerkkiprojektille &amp;quot;hello&amp;quot; versionhallintajärjestelmä.&lt;br /&gt;
=== Versionhallinnan käyttöönotto ===&lt;br /&gt;
Luodaan ensin muutama tiedosto projektia varten:&lt;br /&gt;
hello.c ([[C]]-kielinen lähdekoodi, ohjelma tulostaa ruudulle yhden rivin tekstiä, kääntyy komennolla &amp;lt;tt&amp;gt;[[gcc]] hello.c -o hello&amp;lt;/tt&amp;gt;):&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 void main() {&lt;br /&gt;
   printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
README:&lt;br /&gt;
 Esimerkkiprojekti, jonka avulla opetellaan Gitin käyttöä&lt;br /&gt;
&lt;br /&gt;
Seuraavaksi alustetaan Git ajamalla projektin hakemistossa komento&lt;br /&gt;
 $ git init&lt;br /&gt;
 Initialized empty Git repository in .git/&lt;br /&gt;
Kuten Git ilmoittaa, komento luo työhakemistoon piilotetun alihakemiston &amp;lt;tt&amp;gt;.git&amp;lt;/tt&amp;gt; jonne Git tallentaa kaiken tarvitsemansa datan. Tämän hakemiston sisältöön ei tarvitse kiinnittää huomiota.&lt;br /&gt;
&lt;br /&gt;
=== Tiedostojen lisääminen ===&lt;br /&gt;
Seuraavaksi lisätään versionhallinnan piiriin alussa luodut tiedostot komennolla &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git add .&lt;br /&gt;
Piste tarkoittaa, että versionhallinnan piiriin lisätään kaikki hakemistossa olevat tiedostot. Yksittäisten tiedostojen lisääminen on myös mahdollista:&lt;br /&gt;
 $ git add hello.c README&lt;br /&gt;
Nyt kun Git tietää, että tällaisia tiedostoja on muokattu, on aika tehdä ensimmäinen &amp;quot;commit&amp;quot;, eli siirretään tiedostojen uusin tila versionhallintaan yhdeksi commitiksi:&lt;br /&gt;
 $ git commit&lt;br /&gt;
Komento avaa [[ympäristömuuttuja]]ssa EDITOR määritettyyn tekstieditoriin tiedoston, jossa #-merkeillä alkavilla riveillä lyhyesti kuvattu tehtävät muutokset. Tässä tapauksessa ilmoitetaan uusista tiedostoista &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt;. Tiedostoon voidaan kirjoittaa lyhyehkö lokiin tallentuva kuvaus tehdyistä muutoksista. Risuaidalla alkavat rivit eivät päädy kommenttiin. Kun kommentti on kirjoitettu suljetaan tekstieditori, jolloin muutokset viedään versionhalintaan eli tapahtuu commit:&lt;br /&gt;
 Created initial commit 9c5cc04: Ensimmäinen commit&lt;br /&gt;
 2 files changed, 5 insertions(+), 0 deletions(-)&lt;br /&gt;
 create mode 100644 README&lt;br /&gt;
 create mode 100644 hello.c&lt;br /&gt;
&lt;br /&gt;
Nyt lokista nähdään, että projektiin on tehty yksi muokkaus:&lt;br /&gt;
 $ git log&lt;br /&gt;
 commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:39:56 2009 +0300&lt;br /&gt;
&lt;br /&gt;
    Ensimmäinen commit&lt;br /&gt;
Lokiin ilmestyvä nimi ja sähköpostiosoite voidaan asettaa komennoilla&lt;br /&gt;
 $ git config --global user.name &amp;quot;Oma Nimi&amp;quot;&lt;br /&gt;
 $ git config --global user.email oma@sähköposti.osoite&lt;br /&gt;
&lt;br /&gt;
=== Tiedostojen muokkaaminen ===&lt;br /&gt;
Nyt kun ensimmäinen commit on tehty voidaan alkaa kehittämään projektia jolloin näemme, miten Gitin kanssa toimitaan tiedostojen muuttuessa. Tiedosto &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; ei ole standardin mukainen eikä se [[kääntäminen|käänny]] suoritettavaksi ohjelmaksi. Korjataan tämä ongelma muuttamalla tiedosto &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; muotoon&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 int main() {&lt;br /&gt;
   printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Tässä on siis muutettu toisella rivillä esiintyvä &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; muotoon &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; ja lisätty loppuun rivi &amp;lt;tt&amp;gt;return 0;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nyt tehdyt, vielä commit&#039;oimattomat muutokset nähdään komennolla &lt;br /&gt;
 $ git status&lt;br /&gt;
 # On branch master&lt;br /&gt;
 # Changed but not updated:&lt;br /&gt;
 #   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)&lt;br /&gt;
 #&lt;br /&gt;
 #  	modified:   hello.c&lt;br /&gt;
Eli huomataan, että tiedostoa &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; on muokattu mutta ei vielä commitoitu. Commit tehdään kertomalla Gitille ensin, että tiedostoa on muokattu, komennolla &lt;br /&gt;
 $ git add hello.c&lt;br /&gt;
ja tekemällä commit tämän jälkeen kuten aluksi&lt;br /&gt;
 $ git commit&lt;br /&gt;
Edellä olevat vaiheet voi myös yhdistää ja suorittaa yhdellä komennolla&lt;br /&gt;
 $ git commit -a&lt;br /&gt;
joka commitoi kaikkiin tiedostoihin tehdyt muutokset.&lt;br /&gt;
&lt;br /&gt;
=== Muokkaushistoria ===&lt;br /&gt;
Muiden versionhallintaohjelmien tapaan Git mahdollistaa projektin etenemisen tutkimisen helposti monilla eri tavoilla. Jokaisesta commitista tehdään merkintä lokiin, joka näkyy komennolla&lt;br /&gt;
 $ git log&lt;br /&gt;
 commit 770194dd647d7f7ab11a96cfd47ea6cd42c19f3a&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:51:59 2009 +0300&lt;br /&gt;
 &lt;br /&gt;
    Korjaus&lt;br /&gt;
&lt;br /&gt;
 commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:39:56 2009 +0300&lt;br /&gt;
&lt;br /&gt;
    Ensimmäinen commit&lt;br /&gt;
Lokissa näkyy jokaiselle commitille yksilöllinen tunnistenumero, commitin tekijä, kellonaika jolloin commit tehtiin ja commitiin liittyvä kommentti. Jos loki on pitkä sitä voi selata nuolinäppäimillä tai näppäimillä j ja k ja selaamistilasta voi siirtyä takaisin komentoriville painamalla q-näppäintä. Käyttämällä valitsinta &amp;lt;tt&amp;gt;-p&amp;lt;/tt&amp;gt; Git näyttää myös versioiden välillä tapahtuneet [[diff|muutokset]]:&lt;br /&gt;
 $ git log -p&lt;br /&gt;
 -- (osa tulosteesta poistettu)&lt;br /&gt;
 diff --git a/hello.c b/hello.c&lt;br /&gt;
 index d1788b8..f4e5959 100644&lt;br /&gt;
 --- a/hello.c&lt;br /&gt;
 +++ b/hello.c&lt;br /&gt;
 @@ -1,4 +1,5 @@&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 -void main() {&lt;br /&gt;
 +int main() {&lt;br /&gt;
    printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
 +  return 0;&lt;br /&gt;
  }&lt;br /&gt;
Muutokset näytetään käyttäen [[diff]]-komennosta tuttua syntaksia.&lt;br /&gt;
&lt;br /&gt;
Jokaisesta commitista on nähtävissä myös tarkempi yhteenveto komennolla&lt;br /&gt;
 $ git log --stat --summary&lt;br /&gt;
&lt;br /&gt;
Lokin voi katsoa myös esimerkiksi viimeisen kahden viikon ajalta komennolla &lt;br /&gt;
 $ git log --since=&amp;quot;2 weeks ago&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Haarat ===&lt;br /&gt;
Haarat (engl. &#039;&#039;branch&#039;&#039;) ovat erillisinä kehityshaaroina eteneviä kehityspolkuja jotka lähtevät yhdestä tietystä commitista. Esimerkiksi ohjelmaa kehitettäessä voidaan luoda kokeellinen haara jossa tehdään radikaaleja muutoksia samalla kun ohjelman pääasialliseen kehityshaaraan tehdään maltillisempia muutoksia. Kun uudet muutokset on saatu onnistuneesti tehtyä valmiiksi kokeellisessa haarassa voidaan ne liittää (engl. &#039;&#039;merge&#039;&#039;) päähaaraan (tai johonkin toiseen haaraan). Git mahdollistaa eri haarojen monipuolisen käytön ja niitä voi huoletta käyttää runsaastikin.&lt;br /&gt;
&lt;br /&gt;
Luodaan esimerkkiohjelmastamme uusi kokeellinen kehityshaara nimeltään testailu:&lt;br /&gt;
 $ git branch testailu&lt;br /&gt;
Katsotaan tämän jälkeen, mitä haaroja on käytettävissä:&lt;br /&gt;
 $ git branch&lt;br /&gt;
  * master&lt;br /&gt;
    testailu&lt;br /&gt;
Tähdellä (*) on merkattu tällä hetkellä aktiivisena oleva kehityshaara. &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haara luodaan aina automaattisesti oletuksena.&lt;br /&gt;
&lt;br /&gt;
Siirrytään nyt uuteen kehityshaaraan komennolla&lt;br /&gt;
 $ git checkout testailu&lt;br /&gt;
 Switched to branch &amp;quot;testailu&amp;quot;&lt;br /&gt;
Tehdään tässä nyt radikaaleja muutoksia ohjelmaamme:&lt;br /&gt;
&amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
  printf(&amp;quot;Päivää, maailma!!!!!111111\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
README:&lt;br /&gt;
 Upea esimerkkiohjelma&lt;br /&gt;
 v. 2.0!&lt;br /&gt;
&lt;br /&gt;
Ja tehdään muutoksista uusi commit:&lt;br /&gt;
 $ git commit -a -m &amp;quot;Ohjelman versio 2.0&amp;quot;&lt;br /&gt;
Huomaa, että tässä on käytetty valitsinta &amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; jolloin erillistä &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt; -komentoa ei tarvita. Lisäksi valitsimella &amp;lt;tt&amp;gt;-m&amp;lt;/tt&amp;gt; asetetaan kommentti jolloin sitä ei kysytä erikseen.&lt;br /&gt;
&lt;br /&gt;
Siirrytään seuraavaksi takaisin &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaraan:&lt;br /&gt;
 $ git checkout master&lt;br /&gt;
 Switched to branch &amp;quot;master&amp;quot;&lt;br /&gt;
ja tehdään ohjelmaan pieni muutos tiedostoon &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;. Huomaa, että &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; latasi versionhallinnasta &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaran sisällön joten äsken tekemämme muokkaukset eivät näy tiedostossa. Mikäli tiedostoihin olisi tehty muutoksia joita ei vielä ole commitoitu siirtyminen ei onnistu. Jos muutokset halutaan hylätä voidaan &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; -komennolle antaa lisäksi valitsin &amp;lt;tt&amp;gt;-f&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Muutetaan tiedoston printf-rivi muotoon&lt;br /&gt;
 printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
ja commitoidaan muutokset&lt;br /&gt;
 $ git commit -a -m  &amp;quot;Hienosäädetään tekstiä&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ajatellaan nyt, että ohjelmamme on kehittynyt siihen pisteeseen että on aika ottaa kokeellisessa &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haarassa tehdyt muokkaukset käyttöön. Niiden käyttöönotto onnistuu nyt helposti, sillä Git osaa yhdistää kaksi kehityshaaraa. Yhdistetään &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haara &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaraan ajamalla komento &lt;br /&gt;
 $ git merge testailu &lt;br /&gt;
 Auto-merged hello.c&lt;br /&gt;
 CONFLICT (content): Merge conflict in hello.c&lt;br /&gt;
 Automatic merge failed; fix conflicts and then commit the result.&lt;br /&gt;
joka yhdistää &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haaran aktiivisena olevaan haaraan (nyt &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;). Git osaa automaattisesti muuttaa &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt;-tiedoston sisällön sillä siihen ei ole tehty muokkauksia &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haaran luomisen jälkeen. Sen sijaan molemmissa haaroissa on muokattu &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;-tiedostoa samasta kohdasta, joten Git ei osaa päätellä, miten muokkaukset tulisi yhdistää. Tästä syystä automaattinen yhdistäminen epäonnistuu ja yhdistäminen jätetään käyttäjän harteille. &lt;br /&gt;
&lt;br /&gt;
Yhdistäminen tapahtuu muokkaamalla nyt käsin tiedostoa &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; josta löytyy rivit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD:hello.c&lt;br /&gt;
  printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
=======&lt;br /&gt;
  printf(&amp;quot;Päivää, maailma!!!!!111111\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; testailu:hello.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Git on siis merkinnyt allekkain ristiriidassa olevan kohdan rivit ensin aktiivisesta haarasta ja tämän jälkeen liitettävästä haarasta. Toteamme, että &amp;lt;tt&amp;gt;teistailu&amp;lt;/tt&amp;gt;-haaran ensimmäinen printf-rivi on järkyttävä, joten poistamme sen. Sen sijaan jätämme tietysti jäljelle linux.fin mainoksen. Lisäksi tiedostosta poistetaan käsin Gitin lisäämät ohjausrivit (&amp;lt;tt&amp;gt;=========&amp;lt;/tt&amp;gt; yms.), jolloin tiedoston tämä osuus jää muotoon&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
 printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Siirretään muutokset versionhallintaan:&lt;br /&gt;
 $ git commit -a -m &amp;quot;Yhdistetty kokeellisesta haarasta versio 2.0&amp;quot;&lt;br /&gt;
 Created commit 82fef9e: Yhdistetty kokeellisesta haarasta versio 2.0&lt;br /&gt;
Nyt komennolla &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt; nähdään, että on kyseisen commitin yhteydessä on tapahtunut kahden haaran liittäminen, sillä commitin tunnistenumeron alapuolelle ilmestyy rivi&lt;br /&gt;
 Merge: 040c39d... b2626d8...&lt;br /&gt;
Numero- ja kirjainyhdistelmät viittaavat tiettyyn commiteihin, joiden välillä liitos tapahtui (commitin tunnistenumerosta ilmoitetaan vain alkuosa jos se riittää yksilöimään commitin).&lt;br /&gt;
&lt;br /&gt;
Kun luomallamme kehityshaaralla ei enää ole käyttöä, se voidaan poistaa komennolla&lt;br /&gt;
 $ git branch -d testailu &lt;br /&gt;
 Deleted branch testailu.&lt;br /&gt;
Komento varmistaa, että haarassa tehty kehitystyö on liitetty johonkin toiseen haaraan. Jos muualle liittämätön haara halutaan tarkoituksella hylätä käytetään valitsinta &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git branch -D testailu&lt;br /&gt;
&lt;br /&gt;
=== Tagit ja tunnisteet ===&lt;br /&gt;
Kuten aiemmin huomattiin, jokaiseen commitiin viitataan yksilöllisellä mystisellä kirjain- ja numeroyhdistelmällä. Tämän lisäksi Git mahdollistaa tiettyjen commitien nimeämisen selväkielisillä tageilla. Esimerkiksi nimetään alussa ensimmäisen korjauksen jälkeen tehty commit nimelle &amp;quot;v1.0&amp;quot;:&lt;br /&gt;
 $ git tag v1.0 770194dd647d7f&lt;br /&gt;
Tässä 770194dd647d7f on alkuosa kyseiseen muokkauksen tunniste (ja luultavasti eroaa omassa järjestelmässäsi). Aina, kun Gitissä viitataan tiettyyn muokkaukseen sen tunnisteella, riittää kun kirjoittaa tunnisteen alkuosaa niin pitkälle, että se yksilöi tunnistenumeron versiohistoriasta.&lt;br /&gt;
&lt;br /&gt;
Tagitetaan vastaavasti uusin commit versiolle 2.0:&lt;br /&gt;
 $ git tag v2.0 &lt;br /&gt;
Kaikki määritetyt tagit saa listattua komennolla &lt;br /&gt;
 $ git tag&lt;br /&gt;
 v1.0&lt;br /&gt;
 v2.0&lt;br /&gt;
&lt;br /&gt;
Nyt voidaan esimerkiksi vertailla näiden kahden commitin välillä tapahtuneita muutoksia:&lt;br /&gt;
 $ git diff v1.0 v2.0&lt;br /&gt;
Tässä voitaisiin toki käyttää tagien sijasta myös tunnisteita, mutta tagit selkeyttävät tilannetta. Nykyiseen tilanteeseen voi viitata &amp;quot;tagilla&amp;quot; HEAD, jolloin version 1.0 jälkeen tehdyt muutokset näkisi komennolla&lt;br /&gt;
 $ git diff v1.0 HEAD&lt;br /&gt;
&lt;br /&gt;
Kahden tilan välillä tapahtuneet commitit nähdään antamalla &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt; -komennolla parametrina alku- ja lopputila:&lt;br /&gt;
 $ git log v1.0..v2.0&lt;br /&gt;
näyttäisi tagilla v1.0 merkityn tilan jälkeen tapahtuneet muutokset tagiin v2.0 asti.&lt;br /&gt;
&lt;br /&gt;
Edellä esiteltiin eräänlainen tagi HEAD joka viittaa nykyiseen commitiin. Lisäksi voidaan käyttää merkintää ^, joka viittaa edeltäneeseen commitiin (esim. HEAD^ tai v1.0^), esimerkiksi &lt;br /&gt;
 $ git diff v1.0^ v1.0&lt;br /&gt;
näyttäisi erot commitin v1.0 ja sitä edeltäneen commitin välillä. Vastaavasti kaksi commitia taaksepäin on ^^ jne. Yleisemmin voidaan käyttää merkintää ~numero, esimerkiksi HEAD~4 viittaa 4 commitia taaksepäin. Liitetyille (&#039;&#039;merge&#039;&#039;) commiteille löytyy useampia edeltäjiä, jolloin niitä merkitään esimerkiksi HEAD^1 ja HEAD^2.&lt;br /&gt;
&lt;br /&gt;
Yleisesti kaikissa tapauksissa, joissa Gitille annettaisiin commitin tunniste, voidaan käyttää myös kyseiselle commitille merkattua tagia. Katsotaan esimerkiksi millaiseen commitiin asetettiin tagi v2.0:&lt;br /&gt;
 $ git show v2.0&lt;br /&gt;
&lt;br /&gt;
Tietyn tagin merkkaamasta commitista voidaan aloittaa myös uusi haara:&lt;br /&gt;
 $ git branch vakaa v1.0&lt;br /&gt;
&lt;br /&gt;
loisi uuden haaran nimellä vakaa siten, että haarasta löytyisi vain ne commitit, jotka on tehty tähän commitiin mennessä.&lt;br /&gt;
&lt;br /&gt;
Kehityshaaran sisällä voidaan palata tiettyyn vanhaan commitiin komennolla &amp;lt;tt&amp;gt;git reset&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git reset --hard v1.0&lt;br /&gt;
palaisi valitussa haarassa tagin v1.0 osoittamaan commitiin. Tämä komento poistaa kaikki tehdyt commitit viitatun commitin jälkeen ja lisäksi paikallisesti tehdyt, versionhallintaan siirtämättömät muokkaukset. Tätä ei pidä käyttää julkisesti käytössä olevassa Git-varastossa. Sen sijaan on käytettävä komentoa &amp;lt;tt&amp;gt;git revert&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== git merge ja git rebase ===&lt;br /&gt;
&lt;br /&gt;
=== Kopioiminen - Git yhteistyövälineenä ===&lt;br /&gt;
Versionhallinnasta on eniten iloa tilanteessa, jossa useampi kehittäjä toimii saman projektin kimpussa. Oletetaan nyt, että äskeinen kehitystyö tapahtui hakemistossa &amp;lt;tt&amp;gt;/home/osku/projekti&amp;lt;/tt&amp;gt;. Nyt toinen samalla koneella oleva käyttäjä haluaa osallistua kehitystyöhön. Tällöin hän voi hakea versionhallinnasta kopion itselleen komennolla &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git clone /home/osku/projekti hello&lt;br /&gt;
Komento kopioi hakemistosta &amp;lt;tt&amp;gt;/home/osku/projekti&amp;lt;/tt&amp;gt; löytyvän projektin Git-versionhallinnasta kopion hakemistoon &amp;lt;tt&amp;gt;hello&amp;lt;/tt&amp;gt;. Jos kehityshaaraa ei erikseen mainita haetaan &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haara.&lt;br /&gt;
&lt;br /&gt;
Kun toinen käyttäjä (tässä Elisa) on tehnyt haluamiaan muutoksia projektiin (commitoinut ne versionhallintaan hakemistossa &amp;lt;tt&amp;gt;/home/elisa/hello&amp;lt;/tt&amp;gt;) hän voi ilmoittaa siitä Oskulle, joka voi hakea muutokset omaan kehityshaaraansa komennolla&lt;br /&gt;
 $ git pull /home/elisa/hello master&lt;br /&gt;
Komento hakee parametrina annetusta hakemistosta löytyvästä versionhallinnasta &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-kehityshaaran sisällön ja liittää sen aktiivisena olevaan kehityshaaraan. Jos paikalliseen kehityshaaraan ja etähaaraan (eli Elisan kehityshaaraan) välillä on päällekkäisiä muokkauksia jätetään ristiriidat käyttäjän ratkaistavaksi (kuten edellä käsiteltäessä kehityshaarojen yhdistämistä). Lopuksi &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt; tekee muutoksista commitin nykyiseen haaraan.&lt;br /&gt;
&lt;br /&gt;
Yleensä ulkoisen kehityshaaran liittäminen suoraan ei ole järkevää, vaan kannattaa ensin katsoa, minkälaisia muutoksia ollaan tekemässä. Tämä onnistuu hakemalla ulkoisen kehityshaaran muutokset komennolla &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt;, eli Osku voisi ajaa komennon&lt;br /&gt;
 $ git fetch /home/elisa/hello master&lt;br /&gt;
eli &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt; -komennolle annetaan samat parametrit kuin &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt; -komennolle.&lt;br /&gt;
&lt;br /&gt;
Nyt muutokset on haettu mutta ei vielä siirretty versionhallintaan. Myöskään paikallisia tiedostoja ei ole muutettu mitenkään. Haettuun kehityshaaraan voidaan kuitenkin viitata tagilla &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;, jolloin nykyisen tilanteen (&amp;lt;tt&amp;gt;HEAD&amp;lt;/tt&amp;gt;) ja haetun tilanteen erot nähtäisiin komennolla &lt;br /&gt;
 $ git log -p HEAD..FETCH_HEAD&lt;br /&gt;
Jos muutokset näyttävät hyviltä, ne voidaan commitoida liittämällä &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;-haara aktiivisena olevaan haaraan komennolla&lt;br /&gt;
 $ git merge FETCH_HEAD&lt;br /&gt;
&lt;br /&gt;
Etäkoneilla sijaitseviin kehityshaaroihin voidaan luoda linkkejä komennolla &amp;lt;tt&amp;gt;git remote&amp;lt;/tt&amp;gt;. Esimerkiksi Osku voisi luoda Elisan haaraan linkin &amp;lt;tt&amp;gt;elisa&amp;lt;/tt&amp;gt; komennolla&lt;br /&gt;
 $ git remote add elisa /home/elisa/hello&lt;br /&gt;
Tämän jälkeen muutokset voitaisiin hakea helposti komennolla &lt;br /&gt;
 $ git fetch elisa&lt;br /&gt;
joka hakisi kaikkien Elisan kehityshaarojen sisällöt. Näihin haaroihin voitaisiin nyt viitata muodossa &amp;lt;tt&amp;gt;elisa/haaran_nimi&amp;lt;/tt&amp;gt;, esimerkiksi &amp;lt;tt&amp;gt;elisa/master&amp;lt;/tt&amp;gt;. Esimerkiksi erot nähtäisiin komennolla&lt;br /&gt;
 $ git log -p HEAD..elisa/master&lt;br /&gt;
Ja haaran liittäminen nykyiseen haaraan onnistuisi komennolla &lt;br /&gt;
 $ git merge elisa/master&lt;br /&gt;
Yksittäisen haaran (esim. &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;) voi hakea komennolla &lt;br /&gt;
 $ git fetch elisa master&lt;br /&gt;
jolloin haettuun haaraan voi viitata tagilla &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Elisa voi myös suoraan päivittää kehityshaaraansa Oskun haaraan tehdyt muutokset suoraan komennolla&lt;br /&gt;
 $ git pull&lt;br /&gt;
Komennolle ei tarvitse antaa parametreja sillä &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt; on tallentanut Gitin tietokantaan tiedon siitä, mistä alkuperäinen kopio on tehty. Jos versioiden välillä on ristiriitoja ei muutoksista tehdä commitia vaan ristiriidat jätetään käyttäjän ratkaistavaksi kuten &amp;lt;tt&amp;gt;git merge&amp;lt;/tt&amp;gt;:n kanssa huomattiin. Kun ristiriidat on korjattu viedään muutokset versionhallintaan tavalliseen tapaan &amp;lt;tt&amp;gt;git commit -a&amp;lt;/tt&amp;gt; -komennolla.&lt;br /&gt;
&lt;br /&gt;
Voit luoda projektia varten palvelimelle oman tietovaraston (engl. &#039;&#039;repository&#039;&#039;) eli hakemiston, johon kukin kehittäjä voi tehdä omat muutoksensa itsenäisesti ilman, että täytyy pyytää erikseen muita kehittäjiä hakemaan tehdyt muutokset omasta kansiostasi. Tällainen paljas (engl. &#039;&#039;bare&#039;&#039;) tietovarasto luodaan kirjautumalla ensin palvelimelle ja antamalla esimerkiksi komennot&lt;br /&gt;
 $ cd /opt/git&lt;br /&gt;
 $ mkdir project.git&lt;br /&gt;
 $ cd project.git&lt;br /&gt;
 $ git --bare init&lt;br /&gt;
Siirrytään tämän jälkeen omalle koneelle projektin työhakemistoon. Jos työhakemistossa ei ole otettu git versiohallintaa käyttöön, niin tehdään se nyt ja lisätään sinne tarvittavat tiedostot (git init; git add .; git commit; ks.yllä). Luodaan linkki palvelimella olevaan hakemistoon. Esimerkiksi&lt;br /&gt;
 $ git remote add origin ssh://user@gitserver/opt/git/project.git&lt;br /&gt;
Kaikilla kehittäjillä (user) pitää olla palvelimella (gitserver) pääsy , luku- ja kirjoitusoikeus kyseiseen hakemistoon. Tällöin kehittäjät voivat siirtää tekemänsä muutokset tietovarastoon komenolla&lt;br /&gt;
 $ git push origin master&lt;br /&gt;
Kun projekti on siirretty git push komennolla palvelimelle, voivat muut kehittäjät liittyä siihen normaalisti komennolla&lt;br /&gt;
 $ git clone ssh://user@gitserver/opt/git/project.git&lt;br /&gt;
Muiden kehittäjien ei tarvitse enää luoda linkkiä projektiin yllä olevalla tavalla koska clone luo sen origin nimellä automaattisesti. He siirtävät tekemänsä muokkaukset palvelimen tietovarastoon samalla git push komennolla.&lt;br /&gt;
Mikäli useampi kehittäjä muokkaa tietovarastoa yhtä aikaa ja toinen kehittäjä on muokannut tietovarastoa sillä välin kun olet hakenut ja tehnyt omia muutoksiasi, pitää ennen git push komentoa antaa git pull, jolloin muiden tekemät muutokset liitetään omiin muutoksiisi ja mahdolliset ristiriidat ratkaistaan (ks. git pull yllä).&lt;br /&gt;
&lt;br /&gt;
Paljas repository toimii myös projektin varmuuskopiona, mikäli oma työhakemistosi syystä tai toisesta tuhoutuu.&lt;br /&gt;
&lt;br /&gt;
== Graafisia Git-käyttöliittymiä ==&lt;br /&gt;
* [[SmartGit]] [http://www.syntevo.com/smartgit/] - kaupallinen, ilmainen ei kaupalliseen tarkoitukseen.&lt;br /&gt;
* [[git-cola]] [http://git-cola.github.io/]&lt;br /&gt;
* [[GitEye]] [http://www.collab.net/products/giteye]&lt;br /&gt;
* [[Giggle]] [https://wiki.gnome.org/Apps/giggle/]&lt;br /&gt;
* [[gitg]] [https://wiki.gnome.org/Apps/Gitg/]&lt;br /&gt;
* [[GitKraken]] [http://www.gitkraken.com/]&lt;br /&gt;
* [[GitForce]] [https://sites.google.com/site/gitforcetool/home] ([[Mono]])&lt;br /&gt;
* [[tig]] [http://jonas.nitro.dk/tig/]&lt;br /&gt;
* [[QGit]] [http://digilander.libero.it/mcostalba/]&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Bazaar]]&lt;br /&gt;
*[[CVS]]&lt;br /&gt;
*[[Darcs]]&lt;br /&gt;
*[[Mercurial]]&lt;br /&gt;
*[[Subversion]]&lt;br /&gt;
*[[GitHub]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [http://git-scm.com/ Gitin kotisivu]&lt;br /&gt;
* [http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html Git tutorial]&lt;br /&gt;
* [[wikipedia:Git (software)|Git englanninkielisessä Wikipediassa]]&lt;br /&gt;
* [http://progit.org/book/ Pro Git, professional version control] -ekirja&lt;br /&gt;
* [https://www.codecademy.com/learn/learn-git www.codecademy.com/learn/learn-git] - Codecademyn Git-kurssi&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Kehitystyökalut]]&lt;/div&gt;</summary>
		<author><name>Karilindgren</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Git&amp;diff=45282</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Git&amp;diff=45282"/>
		<updated>2016-03-17T23:15:06Z</updated>

		<summary type="html">&lt;p&gt;Karilindgren: /* Tiedostojen muokkaaminen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma &lt;br /&gt;
 | nimi=Git&lt;br /&gt;
 | kuva=[[Kuva:Git-logo.svg]] &lt;br /&gt;
 | kuvateksti=&lt;br /&gt;
 | lisenssi=[[GPL]]v2 &lt;br /&gt;
 | käyttöliittymä=teksti&lt;br /&gt;
 | kotisivu=[http://git-scm.com/ git-scm.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Git&#039;&#039;&#039; on hajautettu [[versionhallintajärjestelmä]], jonka kehityksen aloitti [[Linus Torvalds]] Linuxin [[ydin|ytimen]] kehitystä varten. Se korvasi ytimen kehityksessä suljetun lähdekoodin BitKeeperin.&lt;br /&gt;
&lt;br /&gt;
== Perusperiaate ==&lt;br /&gt;
Git on hajautettu versionhallintajärjestelmä mikä tarkoittaa sitä, että jokaisella käyttäjällä on käytössä paikallinen kopio versionhallinnasta. Käyttäjät tekevät omaan paikalliseen kopioonsa muutoksia ja lopulta liittävät (engl. &#039;&#039;merge&#039;&#039;) oman kehityshaaransa (engl. &#039;&#039;branch&#039;&#039;) projektin pääasialliseen versionhallintajärjestelmään.&lt;br /&gt;
&lt;br /&gt;
Gitissä eri kehityshaarojen käyttäminen (esimerkiksi luominen, vertailu ja yhdistäminen) on helppoa ja ideana on, että isommista muutoksista luodaan oma kehityshaaransa. Kehityshaaroja voidaan muokata toisistaan riippumatta, ja lopulta esimerkiksi vakaasta kehityshaarasta haarautetussa epävakaassa kehityshaarassa tehty työ voidaan liittää takaisin vakaaseen haaraan työn valmistuttua.&lt;br /&gt;
&lt;br /&gt;
Kehitystyö tapahtuu käytännössä viemällä muutoksia versionhallintaan eli tekemällä ns. &#039;&#039;commiteja&#039;&#039; (engl. &#039;&#039;commit&#039;&#039;, vakiintunutta suomennosta ei ole). Gitissä jokaiselle commitille luodaan yksilöllinen [[SHA|SHA-1]]-tunniste jolla siihen voidaan viitata. Tunnisteen avulla varmistetaan myös se, ettei tietokantaa voida vahingossa tai tahallaan korruptoida. &lt;br /&gt;
&lt;br /&gt;
== Käyttö ==&lt;br /&gt;
Seuraavassa käydään läpi Gitin peruskäyttö esimerkin avulla luomalla esimerkkiprojektille &amp;quot;hello&amp;quot; versionhallintajärjestelmä.&lt;br /&gt;
=== Versionhallinnan käyttöönotto ===&lt;br /&gt;
Luodaan ensin muutama tiedosto projektia varten:&lt;br /&gt;
hello.c ([[C]]-kielinen lähdekoodi, ohjelma tulostaa ruudulle yhden rivin tekstiä, kääntyy komennolla &amp;lt;tt&amp;gt;[[gcc]] hello.c -o hello&amp;lt;/tt&amp;gt;):&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 void main() {&lt;br /&gt;
   printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
README:&lt;br /&gt;
 Esimerkkiprojekti, jonka avulla opetellaan Gitin käyttöä&lt;br /&gt;
&lt;br /&gt;
Seuraavaksi alustetaan Git ajamalla projektin hakemistossa komento&lt;br /&gt;
 $ git init&lt;br /&gt;
 Initialized empty Git repository in .git/&lt;br /&gt;
Kuten Git ilmoittaa, komento luo työhakemistoon piilotetun alihakemiston &amp;lt;tt&amp;gt;.git&amp;lt;/tt&amp;gt; jonne Git tallentaa kaiken tarvitsemansa datan. Tämän hakemiston sisältöön ei tarvitse kiinnittää huomiota.&lt;br /&gt;
&lt;br /&gt;
=== Tiedostojen lisääminen ===&lt;br /&gt;
Seuraavaksi lisätään versionhallinnan piiriin alussa luodut tiedostot komennolla &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git add .&lt;br /&gt;
Piste tarkoittaa, että versionhallinnan piiriin lisätään kaikki hakemistossa olevat tiedostot. Yksittäisten tiedostojen lisääminen on myös mahdollista:&lt;br /&gt;
 $ git add hello.c README&lt;br /&gt;
Nyt kun Git tietää, että tällaisia tiedostoja on muokattu, on aika tehdä ensimmäinen &amp;quot;commit&amp;quot;, eli siirretään tiedostojen uusin tila versionhallintaan yhdeksi commitiksi:&lt;br /&gt;
 $ git commit&lt;br /&gt;
Komento avaa [[ympäristömuuttuja]]ssa EDITOR määritettyyn tekstieditoriin tiedoston, jossa #-merkeillä alkavilla riveillä lyhyesti kuvattu tehtävät muutokset. Tässä tapauksessa ilmoitetaan uusista tiedostoista &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt;. Tiedostoon voidaan kirjoittaa lyhyehkö lokiin tallentuva kuvaus tehdyistä muutoksista. Risuaidalla alkavat rivit eivät päädy kommenttiin. Kun kommentti on kirjoitettu suljetaan tekstieditori, jolloin muutokset viedään versionhalintaan eli tapahtuu commit:&lt;br /&gt;
 Created initial commit 9c5cc04: Ensimmäinen commit&lt;br /&gt;
 2 files changed, 5 insertions(+), 0 deletions(-)&lt;br /&gt;
 create mode 100644 README&lt;br /&gt;
 create mode 100644 hello.c&lt;br /&gt;
&lt;br /&gt;
Nyt lokista nähdään, että projektiin on tehty yksi muokkaus:&lt;br /&gt;
 $ git log&lt;br /&gt;
 commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:39:56 2009 +0300&lt;br /&gt;
&lt;br /&gt;
    Ensimmäinen commit&lt;br /&gt;
Lokiin ilmestyvä nimi ja sähköpostiosoite voidaan asettaa komennoilla&lt;br /&gt;
 $ git config --global user.name &amp;quot;Oma Nimi&amp;quot;&lt;br /&gt;
 $ git config --global user.email oma@sähköposti.osoite&lt;br /&gt;
&lt;br /&gt;
=== Tiedostojen muokkaaminen ===&lt;br /&gt;
Nyt kun ensimmäinen commit on tehty voidaan alkaa kehittämään projektia jolloin näemme, miten Gitin kanssa toimitaan tiedostojen muuttuessa. Tiedosto &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; ei ole standardin mukainen eikä se [[kääntäminen|käänny]] suoritettavaksi ohjelmaksi. Korjataan tämä ongelma muuttamalla tiedosto &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; muotoon&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 int main() {&lt;br /&gt;
   printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Tässä on siis muutettu toisella rivillä esiintyvä &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; muotoon &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; ja lisätty loppuun rivi &amp;lt;tt&amp;gt;return 0;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nyt tehdyt, vielä commit&#039;oimattomat muutokset nähdään komennolla &lt;br /&gt;
 $ git status&lt;br /&gt;
 # On branch master&lt;br /&gt;
 # Changed but not updated:&lt;br /&gt;
 #   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)&lt;br /&gt;
 #&lt;br /&gt;
 #  	modified:   hello.c&lt;br /&gt;
Eli huomataan, että tiedostoa &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; on muokattu mutta ei vielä commitoitu. Commit tehdään kertomalla Gitille ensin, että tiedostoa on muokattu, komennolla &lt;br /&gt;
 $ git add hello.c&lt;br /&gt;
ja tekemällä commit tämän jälkeen kuten aluksi&lt;br /&gt;
 $ git commit&lt;br /&gt;
Edellä olevat vaiheet voi myös yhdistää ja suorittaa yhdellä komennolla&lt;br /&gt;
 $ git commit -a&lt;br /&gt;
joka commitoi kaikkiin tiedostoihin tehdyt muutokset.&lt;br /&gt;
&lt;br /&gt;
=== Muokkaushistoria ===&lt;br /&gt;
Muiden versionhallintaohjelmien tapaan Git mahdollistaa projektin etenemisen tutkimisen helposti monilla eri tavoilla. Jokaisesta commitista tehdään merkintä lokiin, joka näkyy komennolla&lt;br /&gt;
 $ git log&lt;br /&gt;
 commit 770194dd647d7f7ab11a96cfd47ea6cd42c19f3a&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:51:59 2009 +0300&lt;br /&gt;
 &lt;br /&gt;
    Korjaus&lt;br /&gt;
&lt;br /&gt;
 commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:39:56 2009 +0300&lt;br /&gt;
&lt;br /&gt;
    Ensimmäinen commit&lt;br /&gt;
Lokissa näkyy jokaiselle commitille yksilöllinen tunnistenumero, commitin tekijä, kellonaika jolloin commit tehtiin ja commitiin liittyvä kommentti. Jos loki on pitkä sitä voi selata nuolinäppäimillä tai näppäimillä j ja k ja selaamistilasta voi siirtyä takaisin komentoriville painamalla q-näppäintä. Käyttämällä valitsinta &amp;lt;tt&amp;gt;-p&amp;lt;/tt&amp;gt; Git näyttää myös versioiden välillä tapahtuneet [[diff|muutokset]]:&lt;br /&gt;
 $ git log -p&lt;br /&gt;
 -- (osa tulosteesta poistettu)&lt;br /&gt;
 diff --git a/hello.c b/hello.c&lt;br /&gt;
 index d1788b8..f4e5959 100644&lt;br /&gt;
 --- a/hello.c&lt;br /&gt;
 +++ b/hello.c&lt;br /&gt;
 @@ -1,4 +1,5 @@&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 -void main() {&lt;br /&gt;
 +int main() {&lt;br /&gt;
    printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
 +  return 0;&lt;br /&gt;
  }&lt;br /&gt;
Muutokset näytetään käyttäen [[diff]]-komennosta tuttua syntaksia.&lt;br /&gt;
&lt;br /&gt;
Jokaisesta commitista on nähtävissä myös tarkempi yhteenveto komennolla&lt;br /&gt;
 $ git log --stat --summary&lt;br /&gt;
&lt;br /&gt;
Lokin voi katsoa myös esimerkiksi viimeisen kahden viikon ajalta komennolla &lt;br /&gt;
 $ git log --since=&amp;quot;2 weeks ago&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Haarat ===&lt;br /&gt;
Haarat (engl. &#039;&#039;branch&#039;&#039;) ovat erillisinä kehityshaaroina eteneviä kehityspolkuja jotka lähtevät yhdestä tietystä commitista. Esimerkiksi ohjelmaa kehitettäessä voidaan luoda kokeellinen haara jossa tehdään radikaaleja muutoksia samalla kun ohjelman pääasialliseen kehityshaaraan tehdään maltillisempia muutoksia. Kun uudet muutokset on saatu onnistuneesti tehtyä valmiiksi kokeellisessa haarassa voidaan ne liittää (engl. &#039;&#039;merge&#039;&#039;) päähaaraan (tai johonkin toiseen haaraan). Git mahdollistaa eri haarojen monipuolisen käytön ja niitä voi huoletta käyttää runsaastikin.&lt;br /&gt;
&lt;br /&gt;
Luodaan esimerkkiohjelmastamme uusi kokeellinen kehityshaara nimeltään testailu:&lt;br /&gt;
 $ git branch testailu&lt;br /&gt;
Katsotaan tämän jälkeen, mitä haaroja on käytettävissä:&lt;br /&gt;
 $ git branch&lt;br /&gt;
  * master&lt;br /&gt;
    testailu&lt;br /&gt;
Tähdellä (*) on merkattu tällä hetkellä aktiivisena oleva kehityshaara. &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haara luodaan aina automaattisesti oletuksena.&lt;br /&gt;
&lt;br /&gt;
Siirrytään nyt uuteen kehityshaaraan komennolla&lt;br /&gt;
 $ git checkout testailu&lt;br /&gt;
 Switched to branch &amp;quot;testailu&amp;quot;&lt;br /&gt;
Tehdään tässä nyt radikaaleja muutoksia ohjelmaamme:&lt;br /&gt;
&amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
  printf(&amp;quot;Päivää, maailma!!!!!111111\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
README:&lt;br /&gt;
 Upea esimerkkiohjelma&lt;br /&gt;
 v. 2.0!&lt;br /&gt;
&lt;br /&gt;
Ja tehdään muutoksista uusi commit:&lt;br /&gt;
 $ git commit -a -m &amp;quot;Ohjelman versio 2.0&amp;quot;&lt;br /&gt;
Huomaa, että tässä on käytetty valitsinta &amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; jolloin erillistä &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt; -komentoa ei tarvita. Lisäksi valitsimella &amp;lt;tt&amp;gt;-m&amp;lt;/tt&amp;gt; asetetaan kommentti jolloin sitä ei kysytä erikseen.&lt;br /&gt;
&lt;br /&gt;
Siirrytään seuraavaksi takaisin &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaraan:&lt;br /&gt;
 $ git checkout master&lt;br /&gt;
 Switched to branch &amp;quot;master&amp;quot;&lt;br /&gt;
ja tehdään ohjelmaan pieni muutos tiedostoon &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;. Huomaa, että &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; latasi versionhallinnasta &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaran sisällön joten äsken tekemämme muokkaukset eivät näy tiedostossa. Mikäli tiedostoihin olisi tehty muutoksia joita ei vielä ole commitoitu siirtyminen ei onnistu. Jos muutokset halutaan hylätä voidaan &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; -komennolle antaa lisäksi valitsin &amp;lt;tt&amp;gt;-f&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Muutetaan tiedoston printf-rivi muotoon&lt;br /&gt;
 printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
ja commitoidaan muutokset&lt;br /&gt;
 $ git commit -a -m  &amp;quot;Hienosäädetään tekstiä&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ajatellaan nyt, että ohjelmamme on kehittynyt siihen pisteeseen että on aika ottaa kokeellisessa &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haarassa tehdyt muokkaukset käyttöön. Niiden käyttöönotto onnistuu nyt helposti, sillä Git osaa yhdistää kaksi kehityshaaraa. Yhdistetään &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haara &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaraan ajamalla komento &lt;br /&gt;
 $ git merge testailu &lt;br /&gt;
 Auto-merged hello.c&lt;br /&gt;
 CONFLICT (content): Merge conflict in hello.c&lt;br /&gt;
 Automatic merge failed; fix conflicts and then commit the result.&lt;br /&gt;
joka yhdistää &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haaran aktiivisena olevaan haaraan (nyt &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;). Git osaa automaattisesti muuttaa &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt;-tiedoston sisällön sillä siihen ei ole tehty muokkauksia &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haaran luomisen jälkeen. Sen sijaan molemmissa haaroissa on muokattu &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;-tiedostoa samasta kohdasta, joten Git ei osaa päätellä, miten muokkaukset tulisi yhdistää. Tästä syystä automaattinen yhdistäminen epäonnistuu ja yhdistäminen jätetään käyttäjän harteille. &lt;br /&gt;
&lt;br /&gt;
Yhdistäminen tapahtuu muokkaamalla nyt käsin tiedostoa &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; josta löytyy rivit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD:hello.c&lt;br /&gt;
  printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
=======&lt;br /&gt;
  printf(&amp;quot;Päivää, maailma!!!!!111111\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; testailu:hello.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Git on siis merkinnyt allekkain ristiriidassa olevan kohdan rivit ensin aktiivisesta haarasta ja tämän jälkeen liitettävästä haarasta. Toteamme, että &amp;lt;tt&amp;gt;teistailu&amp;lt;/tt&amp;gt;-haaran ensimmäinen printf-rivi on järkyttävä, joten poistamme sen. Sen sijaan jätämme tietysti jäljelle linux.fin mainoksen. Lisäksi tiedostosta poistetaan käsin Gitin lisäämät ohjausrivit (&amp;lt;tt&amp;gt;=========&amp;lt;/tt&amp;gt; yms.), jolloin tiedoston tämä osuus jää muotoon&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
 printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Siirretään muutokset versionhallintaan:&lt;br /&gt;
 $ git commit -a -m &amp;quot;Yhdistetty kokeellisesta haarasta versio 2.0&amp;quot;&lt;br /&gt;
 Created commit 82fef9e: Yhdistetty kokeellisesta haarasta versio 2.0&lt;br /&gt;
Nyt komennolla &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt; nähdään, että on kyseisen commitin yhteydessä on tapahtunut kahden haaran liittäminen, sillä commitin tunnistenumeron alapuolelle ilmestyy rivi&lt;br /&gt;
 Merge: 040c39d... b2626d8...&lt;br /&gt;
Numero- ja kirjainyhdistelmät viittaavat tiettyyn commiteihin, joiden välillä liitos tapahtui (commitin tunnistenumerosta ilmoitetaan vain alkuosa jos se riittää yksilöimään commitin).&lt;br /&gt;
&lt;br /&gt;
Kun luomallamme kehityshaaralla ei enää ole käyttöä, se voidaan poistaa komennolla&lt;br /&gt;
 $ git branch -d testailu &lt;br /&gt;
 Deleted branch testailu.&lt;br /&gt;
Komento varmistaa, että haarassa tehty kehitystyö on liitetty johonkin toiseen haaraan. Jos muualle liittämätön haara halutaan tarkoituksella hylätä käytetään valitsinta &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git branch -D testailu&lt;br /&gt;
&lt;br /&gt;
=== Tagit ja tunnisteet ===&lt;br /&gt;
Kuten aiemmin huomattiin, jokaiseen commitiin viitataan yksilöllisellä mystisellä kirjain- ja numeroyhdistelmällä. Tämän lisäksi Git mahdollistaa tiettyjen commitien nimeämisen selväkielisillä tageilla. Esimerkiksi nimetään alussa ensimmäisen korjauksen jälkeen tehty commit nimelle &amp;quot;v1.0&amp;quot;:&lt;br /&gt;
 $ git tag v1.0 770194dd647d7f&lt;br /&gt;
Tässä 770194dd647d7f on alkuosa kyseiseen muokkauksen tunniste (ja luultavasti eroaa omassa järjestelmässäsi). Aina, kun Gitissä viitataan tiettyyn muokkaukseen sen tunnisteella riittää kirjoittaa tunnisteen alkuosaa niin pitkälle, että se yksilöi tietyn tunnistenumeron versiohistoriasta.&lt;br /&gt;
&lt;br /&gt;
Tagitetaan vastaavasti uusin commit versiolle 2.0:&lt;br /&gt;
 $ git tag v2.0 &lt;br /&gt;
Kaikki määritetyt tagit saa listattua komennolla &lt;br /&gt;
 $ git tag&lt;br /&gt;
 v1.0&lt;br /&gt;
 v2.0&lt;br /&gt;
&lt;br /&gt;
Nyt voidaan esimerkiksi vertailla näiden kahden commitin välillä tapahtuneita muutoksia:&lt;br /&gt;
 $ git diff v1.0 v2.0&lt;br /&gt;
Tässä voitaisiin toki käyttää tagien sijasta myös tunnisteita, mutta tagit selkeyttävät tilannetta. Nykyiseen tilanteeseen voi viitata &amp;quot;tagilla&amp;quot; HEAD, jolloin version 1.0 jälkeen tehdyt muutokset näkisi komennolla&lt;br /&gt;
 $ git diff v1.0 HEAD&lt;br /&gt;
&lt;br /&gt;
Kahden tilan välillä tapahtuneet commitit nähdään antamalla &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt; -komennolla parametrina alku- ja lopputila:&lt;br /&gt;
 $ git log v1.0..v2.0&lt;br /&gt;
näyttäisi tagilla v1.0 merkityn tilan jälkeen tapahtuneet muutokset tagiin v2.0 asti.&lt;br /&gt;
&lt;br /&gt;
Edellä esiteltiin eräänlainen tagi HEAD joka viittaa nykyiseen commitiin. Lisäksi voidaan käyttää merkintää ^, joka viittaa edeltäneeseen commitiin (esim. HEAD^ tai v1.0^), esimerkiksi &lt;br /&gt;
 $ git diff v1.0^ v1.0&lt;br /&gt;
näyttäisi erot commitin v1.0 ja sitä edeltäneen commitin välillä. Vastaavasti kaksi commitia taaksepäin on ^^ jne. Yleisemmin voidaan käyttää merkintää ~numero, esimerkiksi HEAD~4 viittaa 4 commitia taaksepäin. Liitetyille (&#039;&#039;merge&#039;&#039;) commiteille löytyy useampia edeltäjiä, jolloin niitä merkitään esimerkiksi HEAD^1 ja HEAD^2.&lt;br /&gt;
&lt;br /&gt;
Yleisesti kaikissa tapauksissa, joissa Gitille annettaisiin commitin tunniste, voidaan käyttää myös kyseiselle commitille merkattua tagia. Katsotaan esimerkiksi millaiseen commitiin asetettiin tagi v2.0:&lt;br /&gt;
 $ git show v2.0&lt;br /&gt;
&lt;br /&gt;
Tietyn tagin merkkaamasta commitista voidaan aloittaa myös uusi haara:&lt;br /&gt;
 $ git branch vakaa v1.0&lt;br /&gt;
&lt;br /&gt;
loisi uuden haaran nimellä vakaa siten, että haarasta löytyisi vain ne commitit, jotka on tehty tähän commitiin mennessä.&lt;br /&gt;
&lt;br /&gt;
Kehityshaaran sisällä voidaan palata tiettyyn vanhaan commitiin komennolla &amp;lt;tt&amp;gt;git reset&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git reset --hard v1.0&lt;br /&gt;
palaisi valitussa haarassa tagin v1.0 osoittamaan commitiin. Tämä komento poistaa kaikki tehdyt commitit viitatun commitin jälkeen ja lisäksi paikallisesti tehdyt, versionhallintaan siirtämättömät muokkaukset. Tätä ei pidä käyttää julkisesti käytössä olevassa Git-varastossa. Sen sijaan on käytettävä komentoa &amp;lt;tt&amp;gt;git revert&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== git merge ja git rebase ===&lt;br /&gt;
&lt;br /&gt;
=== Kopioiminen - Git yhteistyövälineenä ===&lt;br /&gt;
Versionhallinnasta on eniten iloa tilanteessa, jossa useampi kehittäjä toimii saman projektin kimpussa. Oletetaan nyt, että äskeinen kehitystyö tapahtui hakemistossa &amp;lt;tt&amp;gt;/home/osku/projekti&amp;lt;/tt&amp;gt;. Nyt toinen samalla koneella oleva käyttäjä haluaa osallistua kehitystyöhön. Tällöin hän voi hakea versionhallinnasta kopion itselleen komennolla &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git clone /home/osku/projekti hello&lt;br /&gt;
Komento kopioi hakemistosta &amp;lt;tt&amp;gt;/home/osku/projekti&amp;lt;/tt&amp;gt; löytyvän projektin Git-versionhallinnasta kopion hakemistoon &amp;lt;tt&amp;gt;hello&amp;lt;/tt&amp;gt;. Jos kehityshaaraa ei erikseen mainita haetaan &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haara.&lt;br /&gt;
&lt;br /&gt;
Kun toinen käyttäjä (tässä Elisa) on tehnyt haluamiaan muutoksia projektiin (commitoinut ne versionhallintaan hakemistossa &amp;lt;tt&amp;gt;/home/elisa/hello&amp;lt;/tt&amp;gt;) hän voi ilmoittaa siitä Oskulle, joka voi hakea muutokset omaan kehityshaaraansa komennolla&lt;br /&gt;
 $ git pull /home/elisa/hello master&lt;br /&gt;
Komento hakee parametrina annetusta hakemistosta löytyvästä versionhallinnasta &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-kehityshaaran sisällön ja liittää sen aktiivisena olevaan kehityshaaraan. Jos paikalliseen kehityshaaraan ja etähaaraan (eli Elisan kehityshaaraan) välillä on päällekkäisiä muokkauksia jätetään ristiriidat käyttäjän ratkaistavaksi (kuten edellä käsiteltäessä kehityshaarojen yhdistämistä). Lopuksi &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt; tekee muutoksista commitin nykyiseen haaraan.&lt;br /&gt;
&lt;br /&gt;
Yleensä ulkoisen kehityshaaran liittäminen suoraan ei ole järkevää, vaan kannattaa ensin katsoa, minkälaisia muutoksia ollaan tekemässä. Tämä onnistuu hakemalla ulkoisen kehityshaaran muutokset komennolla &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt;, eli Osku voisi ajaa komennon&lt;br /&gt;
 $ git fetch /home/elisa/hello master&lt;br /&gt;
eli &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt; -komennolle annetaan samat parametrit kuin &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt; -komennolle.&lt;br /&gt;
&lt;br /&gt;
Nyt muutokset on haettu mutta ei vielä siirretty versionhallintaan. Myöskään paikallisia tiedostoja ei ole muutettu mitenkään. Haettuun kehityshaaraan voidaan kuitenkin viitata tagilla &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;, jolloin nykyisen tilanteen (&amp;lt;tt&amp;gt;HEAD&amp;lt;/tt&amp;gt;) ja haetun tilanteen erot nähtäisiin komennolla &lt;br /&gt;
 $ git log -p HEAD..FETCH_HEAD&lt;br /&gt;
Jos muutokset näyttävät hyviltä, ne voidaan commitoida liittämällä &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;-haara aktiivisena olevaan haaraan komennolla&lt;br /&gt;
 $ git merge FETCH_HEAD&lt;br /&gt;
&lt;br /&gt;
Etäkoneilla sijaitseviin kehityshaaroihin voidaan luoda linkkejä komennolla &amp;lt;tt&amp;gt;git remote&amp;lt;/tt&amp;gt;. Esimerkiksi Osku voisi luoda Elisan haaraan linkin &amp;lt;tt&amp;gt;elisa&amp;lt;/tt&amp;gt; komennolla&lt;br /&gt;
 $ git remote add elisa /home/elisa/hello&lt;br /&gt;
Tämän jälkeen muutokset voitaisiin hakea helposti komennolla &lt;br /&gt;
 $ git fetch elisa&lt;br /&gt;
joka hakisi kaikkien Elisan kehityshaarojen sisällöt. Näihin haaroihin voitaisiin nyt viitata muodossa &amp;lt;tt&amp;gt;elisa/haaran_nimi&amp;lt;/tt&amp;gt;, esimerkiksi &amp;lt;tt&amp;gt;elisa/master&amp;lt;/tt&amp;gt;. Esimerkiksi erot nähtäisiin komennolla&lt;br /&gt;
 $ git log -p HEAD..elisa/master&lt;br /&gt;
Ja haaran liittäminen nykyiseen haaraan onnistuisi komennolla &lt;br /&gt;
 $ git merge elisa/master&lt;br /&gt;
Yksittäisen haaran (esim. &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;) voi hakea komennolla &lt;br /&gt;
 $ git fetch elisa master&lt;br /&gt;
jolloin haettuun haaraan voi viitata tagilla &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Elisa voi myös suoraan päivittää kehityshaaraansa Oskun haaraan tehdyt muutokset suoraan komennolla&lt;br /&gt;
 $ git pull&lt;br /&gt;
Komennolle ei tarvitse antaa parametreja sillä &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt; on tallentanut Gitin tietokantaan tiedon siitä, mistä alkuperäinen kopio on tehty. Jos versioiden välillä on ristiriitoja ei muutoksista tehdä commitia vaan ristiriidat jätetään käyttäjän ratkaistavaksi kuten &amp;lt;tt&amp;gt;git merge&amp;lt;/tt&amp;gt;:n kanssa huomattiin. Kun ristiriidat on korjattu viedään muutokset versionhallintaan tavalliseen tapaan &amp;lt;tt&amp;gt;git commit -a&amp;lt;/tt&amp;gt; -komennolla.&lt;br /&gt;
&lt;br /&gt;
Voit luoda projektia varten palvelimelle oman tietovaraston (engl. &#039;&#039;repository&#039;&#039;) eli hakemiston, johon kukin kehittäjä voi tehdä omat muutoksensa itsenäisesti ilman, että täytyy pyytää erikseen muita kehittäjiä hakemaan tehdyt muutokset omasta kansiostasi. Tällainen paljas (engl. &#039;&#039;bare&#039;&#039;) tietovarasto luodaan kirjautumalla ensin palvelimelle ja antamalla esimerkiksi komennot&lt;br /&gt;
 $ cd /opt/git&lt;br /&gt;
 $ mkdir project.git&lt;br /&gt;
 $ cd project.git&lt;br /&gt;
 $ git --bare init&lt;br /&gt;
Siirrytään tämän jälkeen omalle koneelle projektin työhakemistoon. Jos työhakemistossa ei ole otettu git versiohallintaa käyttöön, niin tehdään se nyt ja lisätään sinne tarvittavat tiedostot (git init; git add .; git commit; ks.yllä). Luodaan linkki palvelimella olevaan hakemistoon. Esimerkiksi&lt;br /&gt;
 $ git remote add origin ssh://user@gitserver/opt/git/project.git&lt;br /&gt;
Kaikilla kehittäjillä (user) pitää olla palvelimella (gitserver) pääsy , luku- ja kirjoitusoikeus kyseiseen hakemistoon. Tällöin kehittäjät voivat siirtää tekemänsä muutokset tietovarastoon komenolla&lt;br /&gt;
 $ git push origin master&lt;br /&gt;
Kun projekti on siirretty git push komennolla palvelimelle, voivat muut kehittäjät liittyä siihen normaalisti komennolla&lt;br /&gt;
 $ git clone ssh://user@gitserver/opt/git/project.git&lt;br /&gt;
Muiden kehittäjien ei tarvitse enää luoda linkkiä projektiin yllä olevalla tavalla koska clone luo sen origin nimellä automaattisesti. He siirtävät tekemänsä muokkaukset palvelimen tietovarastoon samalla git push komennolla.&lt;br /&gt;
Mikäli useampi kehittäjä muokkaa tietovarastoa yhtä aikaa ja toinen kehittäjä on muokannut tietovarastoa sillä välin kun olet hakenut ja tehnyt omia muutoksiasi, pitää ennen git push komentoa antaa git pull, jolloin muiden tekemät muutokset liitetään omiin muutoksiisi ja mahdolliset ristiriidat ratkaistaan (ks. git pull yllä).&lt;br /&gt;
&lt;br /&gt;
Paljas repository toimii myös projektin varmuuskopiona, mikäli oma työhakemistosi syystä tai toisesta tuhoutuu.&lt;br /&gt;
&lt;br /&gt;
== Graafisia Git-käyttöliittymiä ==&lt;br /&gt;
* [[SmartGit]] [http://www.syntevo.com/smartgit/] - kaupallinen, ilmainen ei kaupalliseen tarkoitukseen.&lt;br /&gt;
* [[git-cola]] [http://git-cola.github.io/]&lt;br /&gt;
* [[GitEye]] [http://www.collab.net/products/giteye]&lt;br /&gt;
* [[Giggle]] [https://wiki.gnome.org/Apps/giggle/]&lt;br /&gt;
* [[gitg]] [https://wiki.gnome.org/Apps/Gitg/]&lt;br /&gt;
* [[GitKraken]] [http://www.gitkraken.com/]&lt;br /&gt;
* [[GitForce]] [https://sites.google.com/site/gitforcetool/home] ([[Mono]])&lt;br /&gt;
* [[tig]] [http://jonas.nitro.dk/tig/]&lt;br /&gt;
* [[QGit]] [http://digilander.libero.it/mcostalba/]&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Bazaar]]&lt;br /&gt;
*[[CVS]]&lt;br /&gt;
*[[Darcs]]&lt;br /&gt;
*[[Mercurial]]&lt;br /&gt;
*[[Subversion]]&lt;br /&gt;
*[[GitHub]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [http://git-scm.com/ Gitin kotisivu]&lt;br /&gt;
* [http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html Git tutorial]&lt;br /&gt;
* [[wikipedia:Git (software)|Git englanninkielisessä Wikipediassa]]&lt;br /&gt;
* [http://progit.org/book/ Pro Git, professional version control] -ekirja&lt;br /&gt;
* [https://www.codecademy.com/learn/learn-git www.codecademy.com/learn/learn-git] - Codecademyn Git-kurssi&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Kehitystyökalut]]&lt;/div&gt;</summary>
		<author><name>Karilindgren</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Git&amp;diff=45281</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Git&amp;diff=45281"/>
		<updated>2016-03-17T23:14:50Z</updated>

		<summary type="html">&lt;p&gt;Karilindgren: /* Tiedostojen muokkaaminen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma &lt;br /&gt;
 | nimi=Git&lt;br /&gt;
 | kuva=[[Kuva:Git-logo.svg]] &lt;br /&gt;
 | kuvateksti=&lt;br /&gt;
 | lisenssi=[[GPL]]v2 &lt;br /&gt;
 | käyttöliittymä=teksti&lt;br /&gt;
 | kotisivu=[http://git-scm.com/ git-scm.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Git&#039;&#039;&#039; on hajautettu [[versionhallintajärjestelmä]], jonka kehityksen aloitti [[Linus Torvalds]] Linuxin [[ydin|ytimen]] kehitystä varten. Se korvasi ytimen kehityksessä suljetun lähdekoodin BitKeeperin.&lt;br /&gt;
&lt;br /&gt;
== Perusperiaate ==&lt;br /&gt;
Git on hajautettu versionhallintajärjestelmä mikä tarkoittaa sitä, että jokaisella käyttäjällä on käytössä paikallinen kopio versionhallinnasta. Käyttäjät tekevät omaan paikalliseen kopioonsa muutoksia ja lopulta liittävät (engl. &#039;&#039;merge&#039;&#039;) oman kehityshaaransa (engl. &#039;&#039;branch&#039;&#039;) projektin pääasialliseen versionhallintajärjestelmään.&lt;br /&gt;
&lt;br /&gt;
Gitissä eri kehityshaarojen käyttäminen (esimerkiksi luominen, vertailu ja yhdistäminen) on helppoa ja ideana on, että isommista muutoksista luodaan oma kehityshaaransa. Kehityshaaroja voidaan muokata toisistaan riippumatta, ja lopulta esimerkiksi vakaasta kehityshaarasta haarautetussa epävakaassa kehityshaarassa tehty työ voidaan liittää takaisin vakaaseen haaraan työn valmistuttua.&lt;br /&gt;
&lt;br /&gt;
Kehitystyö tapahtuu käytännössä viemällä muutoksia versionhallintaan eli tekemällä ns. &#039;&#039;commiteja&#039;&#039; (engl. &#039;&#039;commit&#039;&#039;, vakiintunutta suomennosta ei ole). Gitissä jokaiselle commitille luodaan yksilöllinen [[SHA|SHA-1]]-tunniste jolla siihen voidaan viitata. Tunnisteen avulla varmistetaan myös se, ettei tietokantaa voida vahingossa tai tahallaan korruptoida. &lt;br /&gt;
&lt;br /&gt;
== Käyttö ==&lt;br /&gt;
Seuraavassa käydään läpi Gitin peruskäyttö esimerkin avulla luomalla esimerkkiprojektille &amp;quot;hello&amp;quot; versionhallintajärjestelmä.&lt;br /&gt;
=== Versionhallinnan käyttöönotto ===&lt;br /&gt;
Luodaan ensin muutama tiedosto projektia varten:&lt;br /&gt;
hello.c ([[C]]-kielinen lähdekoodi, ohjelma tulostaa ruudulle yhden rivin tekstiä, kääntyy komennolla &amp;lt;tt&amp;gt;[[gcc]] hello.c -o hello&amp;lt;/tt&amp;gt;):&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 void main() {&lt;br /&gt;
   printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
README:&lt;br /&gt;
 Esimerkkiprojekti, jonka avulla opetellaan Gitin käyttöä&lt;br /&gt;
&lt;br /&gt;
Seuraavaksi alustetaan Git ajamalla projektin hakemistossa komento&lt;br /&gt;
 $ git init&lt;br /&gt;
 Initialized empty Git repository in .git/&lt;br /&gt;
Kuten Git ilmoittaa, komento luo työhakemistoon piilotetun alihakemiston &amp;lt;tt&amp;gt;.git&amp;lt;/tt&amp;gt; jonne Git tallentaa kaiken tarvitsemansa datan. Tämän hakemiston sisältöön ei tarvitse kiinnittää huomiota.&lt;br /&gt;
&lt;br /&gt;
=== Tiedostojen lisääminen ===&lt;br /&gt;
Seuraavaksi lisätään versionhallinnan piiriin alussa luodut tiedostot komennolla &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git add .&lt;br /&gt;
Piste tarkoittaa, että versionhallinnan piiriin lisätään kaikki hakemistossa olevat tiedostot. Yksittäisten tiedostojen lisääminen on myös mahdollista:&lt;br /&gt;
 $ git add hello.c README&lt;br /&gt;
Nyt kun Git tietää, että tällaisia tiedostoja on muokattu, on aika tehdä ensimmäinen &amp;quot;commit&amp;quot;, eli siirretään tiedostojen uusin tila versionhallintaan yhdeksi commitiksi:&lt;br /&gt;
 $ git commit&lt;br /&gt;
Komento avaa [[ympäristömuuttuja]]ssa EDITOR määritettyyn tekstieditoriin tiedoston, jossa #-merkeillä alkavilla riveillä lyhyesti kuvattu tehtävät muutokset. Tässä tapauksessa ilmoitetaan uusista tiedostoista &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt;. Tiedostoon voidaan kirjoittaa lyhyehkö lokiin tallentuva kuvaus tehdyistä muutoksista. Risuaidalla alkavat rivit eivät päädy kommenttiin. Kun kommentti on kirjoitettu suljetaan tekstieditori, jolloin muutokset viedään versionhalintaan eli tapahtuu commit:&lt;br /&gt;
 Created initial commit 9c5cc04: Ensimmäinen commit&lt;br /&gt;
 2 files changed, 5 insertions(+), 0 deletions(-)&lt;br /&gt;
 create mode 100644 README&lt;br /&gt;
 create mode 100644 hello.c&lt;br /&gt;
&lt;br /&gt;
Nyt lokista nähdään, että projektiin on tehty yksi muokkaus:&lt;br /&gt;
 $ git log&lt;br /&gt;
 commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:39:56 2009 +0300&lt;br /&gt;
&lt;br /&gt;
    Ensimmäinen commit&lt;br /&gt;
Lokiin ilmestyvä nimi ja sähköpostiosoite voidaan asettaa komennoilla&lt;br /&gt;
 $ git config --global user.name &amp;quot;Oma Nimi&amp;quot;&lt;br /&gt;
 $ git config --global user.email oma@sähköposti.osoite&lt;br /&gt;
&lt;br /&gt;
=== Tiedostojen muokkaaminen ===&lt;br /&gt;
Nyt kun ensimmäinen commit on tehty voidaan alkaa kehittämään projektia jolloin näemme, miten Gitin kanssa toimitaan tiedostojen muuttuessa. Tiedosto &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; ei ole standardin mukainen eikä se [[kääntäminen|käänny]] suoritettavaksi ohjelmaksi. Korjataan tämä ongelma muuttamalla tiedosto &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; muotoon&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 int main() {&lt;br /&gt;
   printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Tässä on siis muutettu toisella rivillä esiintyvä &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; muotoon &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; ja lisätty loppuun rivi &amp;lt;tt&amp;gt;return 0;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nyt tehdyt, vielä commitoimattomat muutokset nähdään komennolla &lt;br /&gt;
 $ git status&lt;br /&gt;
 # On branch master&lt;br /&gt;
 # Changed but not updated:&lt;br /&gt;
 #   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)&lt;br /&gt;
 #&lt;br /&gt;
 #  	modified:   hello.c&lt;br /&gt;
Eli huomataan, että tiedostoa &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; on muokattu mutta ei vielä commitoitu. Commit tehdään kertomalla Gitille ensin, että tiedostoa on muokattu, komennolla &lt;br /&gt;
 $ git add hello.c&lt;br /&gt;
ja tekemällä commit tämän jälkeen kuten aluksi&lt;br /&gt;
 $ git commit&lt;br /&gt;
Edellä olevat vaiheet voi myös yhdistää ja suorittaa yhdellä komennolla&lt;br /&gt;
 $ git commit -a&lt;br /&gt;
joka commitoi kaikkiin tiedostoihin tehdyt muutokset.&lt;br /&gt;
&lt;br /&gt;
=== Muokkaushistoria ===&lt;br /&gt;
Muiden versionhallintaohjelmien tapaan Git mahdollistaa projektin etenemisen tutkimisen helposti monilla eri tavoilla. Jokaisesta commitista tehdään merkintä lokiin, joka näkyy komennolla&lt;br /&gt;
 $ git log&lt;br /&gt;
 commit 770194dd647d7f7ab11a96cfd47ea6cd42c19f3a&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:51:59 2009 +0300&lt;br /&gt;
 &lt;br /&gt;
    Korjaus&lt;br /&gt;
&lt;br /&gt;
 commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:39:56 2009 +0300&lt;br /&gt;
&lt;br /&gt;
    Ensimmäinen commit&lt;br /&gt;
Lokissa näkyy jokaiselle commitille yksilöllinen tunnistenumero, commitin tekijä, kellonaika jolloin commit tehtiin ja commitiin liittyvä kommentti. Jos loki on pitkä sitä voi selata nuolinäppäimillä tai näppäimillä j ja k ja selaamistilasta voi siirtyä takaisin komentoriville painamalla q-näppäintä. Käyttämällä valitsinta &amp;lt;tt&amp;gt;-p&amp;lt;/tt&amp;gt; Git näyttää myös versioiden välillä tapahtuneet [[diff|muutokset]]:&lt;br /&gt;
 $ git log -p&lt;br /&gt;
 -- (osa tulosteesta poistettu)&lt;br /&gt;
 diff --git a/hello.c b/hello.c&lt;br /&gt;
 index d1788b8..f4e5959 100644&lt;br /&gt;
 --- a/hello.c&lt;br /&gt;
 +++ b/hello.c&lt;br /&gt;
 @@ -1,4 +1,5 @@&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 -void main() {&lt;br /&gt;
 +int main() {&lt;br /&gt;
    printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
 +  return 0;&lt;br /&gt;
  }&lt;br /&gt;
Muutokset näytetään käyttäen [[diff]]-komennosta tuttua syntaksia.&lt;br /&gt;
&lt;br /&gt;
Jokaisesta commitista on nähtävissä myös tarkempi yhteenveto komennolla&lt;br /&gt;
 $ git log --stat --summary&lt;br /&gt;
&lt;br /&gt;
Lokin voi katsoa myös esimerkiksi viimeisen kahden viikon ajalta komennolla &lt;br /&gt;
 $ git log --since=&amp;quot;2 weeks ago&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Haarat ===&lt;br /&gt;
Haarat (engl. &#039;&#039;branch&#039;&#039;) ovat erillisinä kehityshaaroina eteneviä kehityspolkuja jotka lähtevät yhdestä tietystä commitista. Esimerkiksi ohjelmaa kehitettäessä voidaan luoda kokeellinen haara jossa tehdään radikaaleja muutoksia samalla kun ohjelman pääasialliseen kehityshaaraan tehdään maltillisempia muutoksia. Kun uudet muutokset on saatu onnistuneesti tehtyä valmiiksi kokeellisessa haarassa voidaan ne liittää (engl. &#039;&#039;merge&#039;&#039;) päähaaraan (tai johonkin toiseen haaraan). Git mahdollistaa eri haarojen monipuolisen käytön ja niitä voi huoletta käyttää runsaastikin.&lt;br /&gt;
&lt;br /&gt;
Luodaan esimerkkiohjelmastamme uusi kokeellinen kehityshaara nimeltään testailu:&lt;br /&gt;
 $ git branch testailu&lt;br /&gt;
Katsotaan tämän jälkeen, mitä haaroja on käytettävissä:&lt;br /&gt;
 $ git branch&lt;br /&gt;
  * master&lt;br /&gt;
    testailu&lt;br /&gt;
Tähdellä (*) on merkattu tällä hetkellä aktiivisena oleva kehityshaara. &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haara luodaan aina automaattisesti oletuksena.&lt;br /&gt;
&lt;br /&gt;
Siirrytään nyt uuteen kehityshaaraan komennolla&lt;br /&gt;
 $ git checkout testailu&lt;br /&gt;
 Switched to branch &amp;quot;testailu&amp;quot;&lt;br /&gt;
Tehdään tässä nyt radikaaleja muutoksia ohjelmaamme:&lt;br /&gt;
&amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
  printf(&amp;quot;Päivää, maailma!!!!!111111\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
README:&lt;br /&gt;
 Upea esimerkkiohjelma&lt;br /&gt;
 v. 2.0!&lt;br /&gt;
&lt;br /&gt;
Ja tehdään muutoksista uusi commit:&lt;br /&gt;
 $ git commit -a -m &amp;quot;Ohjelman versio 2.0&amp;quot;&lt;br /&gt;
Huomaa, että tässä on käytetty valitsinta &amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; jolloin erillistä &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt; -komentoa ei tarvita. Lisäksi valitsimella &amp;lt;tt&amp;gt;-m&amp;lt;/tt&amp;gt; asetetaan kommentti jolloin sitä ei kysytä erikseen.&lt;br /&gt;
&lt;br /&gt;
Siirrytään seuraavaksi takaisin &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaraan:&lt;br /&gt;
 $ git checkout master&lt;br /&gt;
 Switched to branch &amp;quot;master&amp;quot;&lt;br /&gt;
ja tehdään ohjelmaan pieni muutos tiedostoon &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;. Huomaa, että &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; latasi versionhallinnasta &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaran sisällön joten äsken tekemämme muokkaukset eivät näy tiedostossa. Mikäli tiedostoihin olisi tehty muutoksia joita ei vielä ole commitoitu siirtyminen ei onnistu. Jos muutokset halutaan hylätä voidaan &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; -komennolle antaa lisäksi valitsin &amp;lt;tt&amp;gt;-f&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Muutetaan tiedoston printf-rivi muotoon&lt;br /&gt;
 printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
ja commitoidaan muutokset&lt;br /&gt;
 $ git commit -a -m  &amp;quot;Hienosäädetään tekstiä&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ajatellaan nyt, että ohjelmamme on kehittynyt siihen pisteeseen että on aika ottaa kokeellisessa &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haarassa tehdyt muokkaukset käyttöön. Niiden käyttöönotto onnistuu nyt helposti, sillä Git osaa yhdistää kaksi kehityshaaraa. Yhdistetään &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haara &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaraan ajamalla komento &lt;br /&gt;
 $ git merge testailu &lt;br /&gt;
 Auto-merged hello.c&lt;br /&gt;
 CONFLICT (content): Merge conflict in hello.c&lt;br /&gt;
 Automatic merge failed; fix conflicts and then commit the result.&lt;br /&gt;
joka yhdistää &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haaran aktiivisena olevaan haaraan (nyt &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;). Git osaa automaattisesti muuttaa &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt;-tiedoston sisällön sillä siihen ei ole tehty muokkauksia &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haaran luomisen jälkeen. Sen sijaan molemmissa haaroissa on muokattu &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;-tiedostoa samasta kohdasta, joten Git ei osaa päätellä, miten muokkaukset tulisi yhdistää. Tästä syystä automaattinen yhdistäminen epäonnistuu ja yhdistäminen jätetään käyttäjän harteille. &lt;br /&gt;
&lt;br /&gt;
Yhdistäminen tapahtuu muokkaamalla nyt käsin tiedostoa &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; josta löytyy rivit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD:hello.c&lt;br /&gt;
  printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
=======&lt;br /&gt;
  printf(&amp;quot;Päivää, maailma!!!!!111111\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; testailu:hello.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Git on siis merkinnyt allekkain ristiriidassa olevan kohdan rivit ensin aktiivisesta haarasta ja tämän jälkeen liitettävästä haarasta. Toteamme, että &amp;lt;tt&amp;gt;teistailu&amp;lt;/tt&amp;gt;-haaran ensimmäinen printf-rivi on järkyttävä, joten poistamme sen. Sen sijaan jätämme tietysti jäljelle linux.fin mainoksen. Lisäksi tiedostosta poistetaan käsin Gitin lisäämät ohjausrivit (&amp;lt;tt&amp;gt;=========&amp;lt;/tt&amp;gt; yms.), jolloin tiedoston tämä osuus jää muotoon&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
 printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Siirretään muutokset versionhallintaan:&lt;br /&gt;
 $ git commit -a -m &amp;quot;Yhdistetty kokeellisesta haarasta versio 2.0&amp;quot;&lt;br /&gt;
 Created commit 82fef9e: Yhdistetty kokeellisesta haarasta versio 2.0&lt;br /&gt;
Nyt komennolla &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt; nähdään, että on kyseisen commitin yhteydessä on tapahtunut kahden haaran liittäminen, sillä commitin tunnistenumeron alapuolelle ilmestyy rivi&lt;br /&gt;
 Merge: 040c39d... b2626d8...&lt;br /&gt;
Numero- ja kirjainyhdistelmät viittaavat tiettyyn commiteihin, joiden välillä liitos tapahtui (commitin tunnistenumerosta ilmoitetaan vain alkuosa jos se riittää yksilöimään commitin).&lt;br /&gt;
&lt;br /&gt;
Kun luomallamme kehityshaaralla ei enää ole käyttöä, se voidaan poistaa komennolla&lt;br /&gt;
 $ git branch -d testailu &lt;br /&gt;
 Deleted branch testailu.&lt;br /&gt;
Komento varmistaa, että haarassa tehty kehitystyö on liitetty johonkin toiseen haaraan. Jos muualle liittämätön haara halutaan tarkoituksella hylätä käytetään valitsinta &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git branch -D testailu&lt;br /&gt;
&lt;br /&gt;
=== Tagit ja tunnisteet ===&lt;br /&gt;
Kuten aiemmin huomattiin, jokaiseen commitiin viitataan yksilöllisellä mystisellä kirjain- ja numeroyhdistelmällä. Tämän lisäksi Git mahdollistaa tiettyjen commitien nimeämisen selväkielisillä tageilla. Esimerkiksi nimetään alussa ensimmäisen korjauksen jälkeen tehty commit nimelle &amp;quot;v1.0&amp;quot;:&lt;br /&gt;
 $ git tag v1.0 770194dd647d7f&lt;br /&gt;
Tässä 770194dd647d7f on alkuosa kyseiseen muokkauksen tunniste (ja luultavasti eroaa omassa järjestelmässäsi). Aina, kun Gitissä viitataan tiettyyn muokkaukseen sen tunnisteella riittää kirjoittaa tunnisteen alkuosaa niin pitkälle, että se yksilöi tietyn tunnistenumeron versiohistoriasta.&lt;br /&gt;
&lt;br /&gt;
Tagitetaan vastaavasti uusin commit versiolle 2.0:&lt;br /&gt;
 $ git tag v2.0 &lt;br /&gt;
Kaikki määritetyt tagit saa listattua komennolla &lt;br /&gt;
 $ git tag&lt;br /&gt;
 v1.0&lt;br /&gt;
 v2.0&lt;br /&gt;
&lt;br /&gt;
Nyt voidaan esimerkiksi vertailla näiden kahden commitin välillä tapahtuneita muutoksia:&lt;br /&gt;
 $ git diff v1.0 v2.0&lt;br /&gt;
Tässä voitaisiin toki käyttää tagien sijasta myös tunnisteita, mutta tagit selkeyttävät tilannetta. Nykyiseen tilanteeseen voi viitata &amp;quot;tagilla&amp;quot; HEAD, jolloin version 1.0 jälkeen tehdyt muutokset näkisi komennolla&lt;br /&gt;
 $ git diff v1.0 HEAD&lt;br /&gt;
&lt;br /&gt;
Kahden tilan välillä tapahtuneet commitit nähdään antamalla &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt; -komennolla parametrina alku- ja lopputila:&lt;br /&gt;
 $ git log v1.0..v2.0&lt;br /&gt;
näyttäisi tagilla v1.0 merkityn tilan jälkeen tapahtuneet muutokset tagiin v2.0 asti.&lt;br /&gt;
&lt;br /&gt;
Edellä esiteltiin eräänlainen tagi HEAD joka viittaa nykyiseen commitiin. Lisäksi voidaan käyttää merkintää ^, joka viittaa edeltäneeseen commitiin (esim. HEAD^ tai v1.0^), esimerkiksi &lt;br /&gt;
 $ git diff v1.0^ v1.0&lt;br /&gt;
näyttäisi erot commitin v1.0 ja sitä edeltäneen commitin välillä. Vastaavasti kaksi commitia taaksepäin on ^^ jne. Yleisemmin voidaan käyttää merkintää ~numero, esimerkiksi HEAD~4 viittaa 4 commitia taaksepäin. Liitetyille (&#039;&#039;merge&#039;&#039;) commiteille löytyy useampia edeltäjiä, jolloin niitä merkitään esimerkiksi HEAD^1 ja HEAD^2.&lt;br /&gt;
&lt;br /&gt;
Yleisesti kaikissa tapauksissa, joissa Gitille annettaisiin commitin tunniste, voidaan käyttää myös kyseiselle commitille merkattua tagia. Katsotaan esimerkiksi millaiseen commitiin asetettiin tagi v2.0:&lt;br /&gt;
 $ git show v2.0&lt;br /&gt;
&lt;br /&gt;
Tietyn tagin merkkaamasta commitista voidaan aloittaa myös uusi haara:&lt;br /&gt;
 $ git branch vakaa v1.0&lt;br /&gt;
&lt;br /&gt;
loisi uuden haaran nimellä vakaa siten, että haarasta löytyisi vain ne commitit, jotka on tehty tähän commitiin mennessä.&lt;br /&gt;
&lt;br /&gt;
Kehityshaaran sisällä voidaan palata tiettyyn vanhaan commitiin komennolla &amp;lt;tt&amp;gt;git reset&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git reset --hard v1.0&lt;br /&gt;
palaisi valitussa haarassa tagin v1.0 osoittamaan commitiin. Tämä komento poistaa kaikki tehdyt commitit viitatun commitin jälkeen ja lisäksi paikallisesti tehdyt, versionhallintaan siirtämättömät muokkaukset. Tätä ei pidä käyttää julkisesti käytössä olevassa Git-varastossa. Sen sijaan on käytettävä komentoa &amp;lt;tt&amp;gt;git revert&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== git merge ja git rebase ===&lt;br /&gt;
&lt;br /&gt;
=== Kopioiminen - Git yhteistyövälineenä ===&lt;br /&gt;
Versionhallinnasta on eniten iloa tilanteessa, jossa useampi kehittäjä toimii saman projektin kimpussa. Oletetaan nyt, että äskeinen kehitystyö tapahtui hakemistossa &amp;lt;tt&amp;gt;/home/osku/projekti&amp;lt;/tt&amp;gt;. Nyt toinen samalla koneella oleva käyttäjä haluaa osallistua kehitystyöhön. Tällöin hän voi hakea versionhallinnasta kopion itselleen komennolla &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git clone /home/osku/projekti hello&lt;br /&gt;
Komento kopioi hakemistosta &amp;lt;tt&amp;gt;/home/osku/projekti&amp;lt;/tt&amp;gt; löytyvän projektin Git-versionhallinnasta kopion hakemistoon &amp;lt;tt&amp;gt;hello&amp;lt;/tt&amp;gt;. Jos kehityshaaraa ei erikseen mainita haetaan &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haara.&lt;br /&gt;
&lt;br /&gt;
Kun toinen käyttäjä (tässä Elisa) on tehnyt haluamiaan muutoksia projektiin (commitoinut ne versionhallintaan hakemistossa &amp;lt;tt&amp;gt;/home/elisa/hello&amp;lt;/tt&amp;gt;) hän voi ilmoittaa siitä Oskulle, joka voi hakea muutokset omaan kehityshaaraansa komennolla&lt;br /&gt;
 $ git pull /home/elisa/hello master&lt;br /&gt;
Komento hakee parametrina annetusta hakemistosta löytyvästä versionhallinnasta &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-kehityshaaran sisällön ja liittää sen aktiivisena olevaan kehityshaaraan. Jos paikalliseen kehityshaaraan ja etähaaraan (eli Elisan kehityshaaraan) välillä on päällekkäisiä muokkauksia jätetään ristiriidat käyttäjän ratkaistavaksi (kuten edellä käsiteltäessä kehityshaarojen yhdistämistä). Lopuksi &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt; tekee muutoksista commitin nykyiseen haaraan.&lt;br /&gt;
&lt;br /&gt;
Yleensä ulkoisen kehityshaaran liittäminen suoraan ei ole järkevää, vaan kannattaa ensin katsoa, minkälaisia muutoksia ollaan tekemässä. Tämä onnistuu hakemalla ulkoisen kehityshaaran muutokset komennolla &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt;, eli Osku voisi ajaa komennon&lt;br /&gt;
 $ git fetch /home/elisa/hello master&lt;br /&gt;
eli &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt; -komennolle annetaan samat parametrit kuin &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt; -komennolle.&lt;br /&gt;
&lt;br /&gt;
Nyt muutokset on haettu mutta ei vielä siirretty versionhallintaan. Myöskään paikallisia tiedostoja ei ole muutettu mitenkään. Haettuun kehityshaaraan voidaan kuitenkin viitata tagilla &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;, jolloin nykyisen tilanteen (&amp;lt;tt&amp;gt;HEAD&amp;lt;/tt&amp;gt;) ja haetun tilanteen erot nähtäisiin komennolla &lt;br /&gt;
 $ git log -p HEAD..FETCH_HEAD&lt;br /&gt;
Jos muutokset näyttävät hyviltä, ne voidaan commitoida liittämällä &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;-haara aktiivisena olevaan haaraan komennolla&lt;br /&gt;
 $ git merge FETCH_HEAD&lt;br /&gt;
&lt;br /&gt;
Etäkoneilla sijaitseviin kehityshaaroihin voidaan luoda linkkejä komennolla &amp;lt;tt&amp;gt;git remote&amp;lt;/tt&amp;gt;. Esimerkiksi Osku voisi luoda Elisan haaraan linkin &amp;lt;tt&amp;gt;elisa&amp;lt;/tt&amp;gt; komennolla&lt;br /&gt;
 $ git remote add elisa /home/elisa/hello&lt;br /&gt;
Tämän jälkeen muutokset voitaisiin hakea helposti komennolla &lt;br /&gt;
 $ git fetch elisa&lt;br /&gt;
joka hakisi kaikkien Elisan kehityshaarojen sisällöt. Näihin haaroihin voitaisiin nyt viitata muodossa &amp;lt;tt&amp;gt;elisa/haaran_nimi&amp;lt;/tt&amp;gt;, esimerkiksi &amp;lt;tt&amp;gt;elisa/master&amp;lt;/tt&amp;gt;. Esimerkiksi erot nähtäisiin komennolla&lt;br /&gt;
 $ git log -p HEAD..elisa/master&lt;br /&gt;
Ja haaran liittäminen nykyiseen haaraan onnistuisi komennolla &lt;br /&gt;
 $ git merge elisa/master&lt;br /&gt;
Yksittäisen haaran (esim. &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;) voi hakea komennolla &lt;br /&gt;
 $ git fetch elisa master&lt;br /&gt;
jolloin haettuun haaraan voi viitata tagilla &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Elisa voi myös suoraan päivittää kehityshaaraansa Oskun haaraan tehdyt muutokset suoraan komennolla&lt;br /&gt;
 $ git pull&lt;br /&gt;
Komennolle ei tarvitse antaa parametreja sillä &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt; on tallentanut Gitin tietokantaan tiedon siitä, mistä alkuperäinen kopio on tehty. Jos versioiden välillä on ristiriitoja ei muutoksista tehdä commitia vaan ristiriidat jätetään käyttäjän ratkaistavaksi kuten &amp;lt;tt&amp;gt;git merge&amp;lt;/tt&amp;gt;:n kanssa huomattiin. Kun ristiriidat on korjattu viedään muutokset versionhallintaan tavalliseen tapaan &amp;lt;tt&amp;gt;git commit -a&amp;lt;/tt&amp;gt; -komennolla.&lt;br /&gt;
&lt;br /&gt;
Voit luoda projektia varten palvelimelle oman tietovaraston (engl. &#039;&#039;repository&#039;&#039;) eli hakemiston, johon kukin kehittäjä voi tehdä omat muutoksensa itsenäisesti ilman, että täytyy pyytää erikseen muita kehittäjiä hakemaan tehdyt muutokset omasta kansiostasi. Tällainen paljas (engl. &#039;&#039;bare&#039;&#039;) tietovarasto luodaan kirjautumalla ensin palvelimelle ja antamalla esimerkiksi komennot&lt;br /&gt;
 $ cd /opt/git&lt;br /&gt;
 $ mkdir project.git&lt;br /&gt;
 $ cd project.git&lt;br /&gt;
 $ git --bare init&lt;br /&gt;
Siirrytään tämän jälkeen omalle koneelle projektin työhakemistoon. Jos työhakemistossa ei ole otettu git versiohallintaa käyttöön, niin tehdään se nyt ja lisätään sinne tarvittavat tiedostot (git init; git add .; git commit; ks.yllä). Luodaan linkki palvelimella olevaan hakemistoon. Esimerkiksi&lt;br /&gt;
 $ git remote add origin ssh://user@gitserver/opt/git/project.git&lt;br /&gt;
Kaikilla kehittäjillä (user) pitää olla palvelimella (gitserver) pääsy , luku- ja kirjoitusoikeus kyseiseen hakemistoon. Tällöin kehittäjät voivat siirtää tekemänsä muutokset tietovarastoon komenolla&lt;br /&gt;
 $ git push origin master&lt;br /&gt;
Kun projekti on siirretty git push komennolla palvelimelle, voivat muut kehittäjät liittyä siihen normaalisti komennolla&lt;br /&gt;
 $ git clone ssh://user@gitserver/opt/git/project.git&lt;br /&gt;
Muiden kehittäjien ei tarvitse enää luoda linkkiä projektiin yllä olevalla tavalla koska clone luo sen origin nimellä automaattisesti. He siirtävät tekemänsä muokkaukset palvelimen tietovarastoon samalla git push komennolla.&lt;br /&gt;
Mikäli useampi kehittäjä muokkaa tietovarastoa yhtä aikaa ja toinen kehittäjä on muokannut tietovarastoa sillä välin kun olet hakenut ja tehnyt omia muutoksiasi, pitää ennen git push komentoa antaa git pull, jolloin muiden tekemät muutokset liitetään omiin muutoksiisi ja mahdolliset ristiriidat ratkaistaan (ks. git pull yllä).&lt;br /&gt;
&lt;br /&gt;
Paljas repository toimii myös projektin varmuuskopiona, mikäli oma työhakemistosi syystä tai toisesta tuhoutuu.&lt;br /&gt;
&lt;br /&gt;
== Graafisia Git-käyttöliittymiä ==&lt;br /&gt;
* [[SmartGit]] [http://www.syntevo.com/smartgit/] - kaupallinen, ilmainen ei kaupalliseen tarkoitukseen.&lt;br /&gt;
* [[git-cola]] [http://git-cola.github.io/]&lt;br /&gt;
* [[GitEye]] [http://www.collab.net/products/giteye]&lt;br /&gt;
* [[Giggle]] [https://wiki.gnome.org/Apps/giggle/]&lt;br /&gt;
* [[gitg]] [https://wiki.gnome.org/Apps/Gitg/]&lt;br /&gt;
* [[GitKraken]] [http://www.gitkraken.com/]&lt;br /&gt;
* [[GitForce]] [https://sites.google.com/site/gitforcetool/home] ([[Mono]])&lt;br /&gt;
* [[tig]] [http://jonas.nitro.dk/tig/]&lt;br /&gt;
* [[QGit]] [http://digilander.libero.it/mcostalba/]&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Bazaar]]&lt;br /&gt;
*[[CVS]]&lt;br /&gt;
*[[Darcs]]&lt;br /&gt;
*[[Mercurial]]&lt;br /&gt;
*[[Subversion]]&lt;br /&gt;
*[[GitHub]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [http://git-scm.com/ Gitin kotisivu]&lt;br /&gt;
* [http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html Git tutorial]&lt;br /&gt;
* [[wikipedia:Git (software)|Git englanninkielisessä Wikipediassa]]&lt;br /&gt;
* [http://progit.org/book/ Pro Git, professional version control] -ekirja&lt;br /&gt;
* [https://www.codecademy.com/learn/learn-git www.codecademy.com/learn/learn-git] - Codecademyn Git-kurssi&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Kehitystyökalut]]&lt;/div&gt;</summary>
		<author><name>Karilindgren</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Git&amp;diff=45280</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Git&amp;diff=45280"/>
		<updated>2016-03-17T23:14:04Z</updated>

		<summary type="html">&lt;p&gt;Karilindgren: /* Tiedostojen muokkaaminen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma &lt;br /&gt;
 | nimi=Git&lt;br /&gt;
 | kuva=[[Kuva:Git-logo.svg]] &lt;br /&gt;
 | kuvateksti=&lt;br /&gt;
 | lisenssi=[[GPL]]v2 &lt;br /&gt;
 | käyttöliittymä=teksti&lt;br /&gt;
 | kotisivu=[http://git-scm.com/ git-scm.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Git&#039;&#039;&#039; on hajautettu [[versionhallintajärjestelmä]], jonka kehityksen aloitti [[Linus Torvalds]] Linuxin [[ydin|ytimen]] kehitystä varten. Se korvasi ytimen kehityksessä suljetun lähdekoodin BitKeeperin.&lt;br /&gt;
&lt;br /&gt;
== Perusperiaate ==&lt;br /&gt;
Git on hajautettu versionhallintajärjestelmä mikä tarkoittaa sitä, että jokaisella käyttäjällä on käytössä paikallinen kopio versionhallinnasta. Käyttäjät tekevät omaan paikalliseen kopioonsa muutoksia ja lopulta liittävät (engl. &#039;&#039;merge&#039;&#039;) oman kehityshaaransa (engl. &#039;&#039;branch&#039;&#039;) projektin pääasialliseen versionhallintajärjestelmään.&lt;br /&gt;
&lt;br /&gt;
Gitissä eri kehityshaarojen käyttäminen (esimerkiksi luominen, vertailu ja yhdistäminen) on helppoa ja ideana on, että isommista muutoksista luodaan oma kehityshaaransa. Kehityshaaroja voidaan muokata toisistaan riippumatta, ja lopulta esimerkiksi vakaasta kehityshaarasta haarautetussa epävakaassa kehityshaarassa tehty työ voidaan liittää takaisin vakaaseen haaraan työn valmistuttua.&lt;br /&gt;
&lt;br /&gt;
Kehitystyö tapahtuu käytännössä viemällä muutoksia versionhallintaan eli tekemällä ns. &#039;&#039;commiteja&#039;&#039; (engl. &#039;&#039;commit&#039;&#039;, vakiintunutta suomennosta ei ole). Gitissä jokaiselle commitille luodaan yksilöllinen [[SHA|SHA-1]]-tunniste jolla siihen voidaan viitata. Tunnisteen avulla varmistetaan myös se, ettei tietokantaa voida vahingossa tai tahallaan korruptoida. &lt;br /&gt;
&lt;br /&gt;
== Käyttö ==&lt;br /&gt;
Seuraavassa käydään läpi Gitin peruskäyttö esimerkin avulla luomalla esimerkkiprojektille &amp;quot;hello&amp;quot; versionhallintajärjestelmä.&lt;br /&gt;
=== Versionhallinnan käyttöönotto ===&lt;br /&gt;
Luodaan ensin muutama tiedosto projektia varten:&lt;br /&gt;
hello.c ([[C]]-kielinen lähdekoodi, ohjelma tulostaa ruudulle yhden rivin tekstiä, kääntyy komennolla &amp;lt;tt&amp;gt;[[gcc]] hello.c -o hello&amp;lt;/tt&amp;gt;):&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 void main() {&lt;br /&gt;
   printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
README:&lt;br /&gt;
 Esimerkkiprojekti, jonka avulla opetellaan Gitin käyttöä&lt;br /&gt;
&lt;br /&gt;
Seuraavaksi alustetaan Git ajamalla projektin hakemistossa komento&lt;br /&gt;
 $ git init&lt;br /&gt;
 Initialized empty Git repository in .git/&lt;br /&gt;
Kuten Git ilmoittaa, komento luo työhakemistoon piilotetun alihakemiston &amp;lt;tt&amp;gt;.git&amp;lt;/tt&amp;gt; jonne Git tallentaa kaiken tarvitsemansa datan. Tämän hakemiston sisältöön ei tarvitse kiinnittää huomiota.&lt;br /&gt;
&lt;br /&gt;
=== Tiedostojen lisääminen ===&lt;br /&gt;
Seuraavaksi lisätään versionhallinnan piiriin alussa luodut tiedostot komennolla &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git add .&lt;br /&gt;
Piste tarkoittaa, että versionhallinnan piiriin lisätään kaikki hakemistossa olevat tiedostot. Yksittäisten tiedostojen lisääminen on myös mahdollista:&lt;br /&gt;
 $ git add hello.c README&lt;br /&gt;
Nyt kun Git tietää, että tällaisia tiedostoja on muokattu, on aika tehdä ensimmäinen &amp;quot;commit&amp;quot;, eli siirretään tiedostojen uusin tila versionhallintaan yhdeksi commitiksi:&lt;br /&gt;
 $ git commit&lt;br /&gt;
Komento avaa [[ympäristömuuttuja]]ssa EDITOR määritettyyn tekstieditoriin tiedoston, jossa #-merkeillä alkavilla riveillä lyhyesti kuvattu tehtävät muutokset. Tässä tapauksessa ilmoitetaan uusista tiedostoista &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt;. Tiedostoon voidaan kirjoittaa lyhyehkö lokiin tallentuva kuvaus tehdyistä muutoksista. Risuaidalla alkavat rivit eivät päädy kommenttiin. Kun kommentti on kirjoitettu suljetaan tekstieditori, jolloin muutokset viedään versionhalintaan eli tapahtuu commit:&lt;br /&gt;
 Created initial commit 9c5cc04: Ensimmäinen commit&lt;br /&gt;
 2 files changed, 5 insertions(+), 0 deletions(-)&lt;br /&gt;
 create mode 100644 README&lt;br /&gt;
 create mode 100644 hello.c&lt;br /&gt;
&lt;br /&gt;
Nyt lokista nähdään, että projektiin on tehty yksi muokkaus:&lt;br /&gt;
 $ git log&lt;br /&gt;
 commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:39:56 2009 +0300&lt;br /&gt;
&lt;br /&gt;
    Ensimmäinen commit&lt;br /&gt;
Lokiin ilmestyvä nimi ja sähköpostiosoite voidaan asettaa komennoilla&lt;br /&gt;
 $ git config --global user.name &amp;quot;Oma Nimi&amp;quot;&lt;br /&gt;
 $ git config --global user.email oma@sähköposti.osoite&lt;br /&gt;
&lt;br /&gt;
=== Tiedostojen muokkaaminen ===&lt;br /&gt;
Nyt kun ensimmäinen commit on tehty voidaan alkaa kehittämään projektia jolloin näemme, miten Gitin kanssa toimitaan tiedostojen muuttuessa. Tiedosto &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; ei ole standardin mukainen eikä se [[kääntäminen|käänny]] suoritettavaksi ohjelmaksi. Korjataan tämä ongelma muuttamalla tiedosto &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; muotoon&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 int main() {&lt;br /&gt;
   printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Tässä on siis muutettu toisella rivillä esiintyvä &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; muotoon &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; ja lisätty toiseksiviimeinen rivi &amp;lt;tt&amp;gt;return 0;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nyt tehdyt, vielä commitoimattomat muutokset nähdään komennolla &lt;br /&gt;
 $ git status&lt;br /&gt;
 # On branch master&lt;br /&gt;
 # Changed but not updated:&lt;br /&gt;
 #   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)&lt;br /&gt;
 #&lt;br /&gt;
 #  	modified:   hello.c&lt;br /&gt;
Eli huomataan, että tiedostoa &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; on muokattu mutta ei vielä commitoitu. Commit tehdään kertomalla Gitille ensin, että tiedostoa on muokattu, komennolla &lt;br /&gt;
 $ git add hello.c&lt;br /&gt;
ja tekemällä commit tämän jälkeen kuten aluksi&lt;br /&gt;
 $ git commit&lt;br /&gt;
Edellä olevat vaiheet voi myös yhdistää ja suorittaa yhdellä komennolla&lt;br /&gt;
 $ git commit -a&lt;br /&gt;
joka commitoi kaikkiin tiedostoihin tehdyt muutokset.&lt;br /&gt;
&lt;br /&gt;
=== Muokkaushistoria ===&lt;br /&gt;
Muiden versionhallintaohjelmien tapaan Git mahdollistaa projektin etenemisen tutkimisen helposti monilla eri tavoilla. Jokaisesta commitista tehdään merkintä lokiin, joka näkyy komennolla&lt;br /&gt;
 $ git log&lt;br /&gt;
 commit 770194dd647d7f7ab11a96cfd47ea6cd42c19f3a&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:51:59 2009 +0300&lt;br /&gt;
 &lt;br /&gt;
    Korjaus&lt;br /&gt;
&lt;br /&gt;
 commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef&lt;br /&gt;
 Author: Osku Ohjelmoija &amp;lt;osku@linux.fi&amp;gt;&lt;br /&gt;
 Date:   Fri Oct 23 23:39:56 2009 +0300&lt;br /&gt;
&lt;br /&gt;
    Ensimmäinen commit&lt;br /&gt;
Lokissa näkyy jokaiselle commitille yksilöllinen tunnistenumero, commitin tekijä, kellonaika jolloin commit tehtiin ja commitiin liittyvä kommentti. Jos loki on pitkä sitä voi selata nuolinäppäimillä tai näppäimillä j ja k ja selaamistilasta voi siirtyä takaisin komentoriville painamalla q-näppäintä. Käyttämällä valitsinta &amp;lt;tt&amp;gt;-p&amp;lt;/tt&amp;gt; Git näyttää myös versioiden välillä tapahtuneet [[diff|muutokset]]:&lt;br /&gt;
 $ git log -p&lt;br /&gt;
 -- (osa tulosteesta poistettu)&lt;br /&gt;
 diff --git a/hello.c b/hello.c&lt;br /&gt;
 index d1788b8..f4e5959 100644&lt;br /&gt;
 --- a/hello.c&lt;br /&gt;
 +++ b/hello.c&lt;br /&gt;
 @@ -1,4 +1,5 @@&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 -void main() {&lt;br /&gt;
 +int main() {&lt;br /&gt;
    printf(&amp;quot;Hei, maailma\n&amp;quot;);&lt;br /&gt;
 +  return 0;&lt;br /&gt;
  }&lt;br /&gt;
Muutokset näytetään käyttäen [[diff]]-komennosta tuttua syntaksia.&lt;br /&gt;
&lt;br /&gt;
Jokaisesta commitista on nähtävissä myös tarkempi yhteenveto komennolla&lt;br /&gt;
 $ git log --stat --summary&lt;br /&gt;
&lt;br /&gt;
Lokin voi katsoa myös esimerkiksi viimeisen kahden viikon ajalta komennolla &lt;br /&gt;
 $ git log --since=&amp;quot;2 weeks ago&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Haarat ===&lt;br /&gt;
Haarat (engl. &#039;&#039;branch&#039;&#039;) ovat erillisinä kehityshaaroina eteneviä kehityspolkuja jotka lähtevät yhdestä tietystä commitista. Esimerkiksi ohjelmaa kehitettäessä voidaan luoda kokeellinen haara jossa tehdään radikaaleja muutoksia samalla kun ohjelman pääasialliseen kehityshaaraan tehdään maltillisempia muutoksia. Kun uudet muutokset on saatu onnistuneesti tehtyä valmiiksi kokeellisessa haarassa voidaan ne liittää (engl. &#039;&#039;merge&#039;&#039;) päähaaraan (tai johonkin toiseen haaraan). Git mahdollistaa eri haarojen monipuolisen käytön ja niitä voi huoletta käyttää runsaastikin.&lt;br /&gt;
&lt;br /&gt;
Luodaan esimerkkiohjelmastamme uusi kokeellinen kehityshaara nimeltään testailu:&lt;br /&gt;
 $ git branch testailu&lt;br /&gt;
Katsotaan tämän jälkeen, mitä haaroja on käytettävissä:&lt;br /&gt;
 $ git branch&lt;br /&gt;
  * master&lt;br /&gt;
    testailu&lt;br /&gt;
Tähdellä (*) on merkattu tällä hetkellä aktiivisena oleva kehityshaara. &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haara luodaan aina automaattisesti oletuksena.&lt;br /&gt;
&lt;br /&gt;
Siirrytään nyt uuteen kehityshaaraan komennolla&lt;br /&gt;
 $ git checkout testailu&lt;br /&gt;
 Switched to branch &amp;quot;testailu&amp;quot;&lt;br /&gt;
Tehdään tässä nyt radikaaleja muutoksia ohjelmaamme:&lt;br /&gt;
&amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
  printf(&amp;quot;Päivää, maailma!!!!!111111\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
README:&lt;br /&gt;
 Upea esimerkkiohjelma&lt;br /&gt;
 v. 2.0!&lt;br /&gt;
&lt;br /&gt;
Ja tehdään muutoksista uusi commit:&lt;br /&gt;
 $ git commit -a -m &amp;quot;Ohjelman versio 2.0&amp;quot;&lt;br /&gt;
Huomaa, että tässä on käytetty valitsinta &amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; jolloin erillistä &amp;lt;tt&amp;gt;git add&amp;lt;/tt&amp;gt; -komentoa ei tarvita. Lisäksi valitsimella &amp;lt;tt&amp;gt;-m&amp;lt;/tt&amp;gt; asetetaan kommentti jolloin sitä ei kysytä erikseen.&lt;br /&gt;
&lt;br /&gt;
Siirrytään seuraavaksi takaisin &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaraan:&lt;br /&gt;
 $ git checkout master&lt;br /&gt;
 Switched to branch &amp;quot;master&amp;quot;&lt;br /&gt;
ja tehdään ohjelmaan pieni muutos tiedostoon &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;. Huomaa, että &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; latasi versionhallinnasta &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaran sisällön joten äsken tekemämme muokkaukset eivät näy tiedostossa. Mikäli tiedostoihin olisi tehty muutoksia joita ei vielä ole commitoitu siirtyminen ei onnistu. Jos muutokset halutaan hylätä voidaan &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; -komennolle antaa lisäksi valitsin &amp;lt;tt&amp;gt;-f&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Muutetaan tiedoston printf-rivi muotoon&lt;br /&gt;
 printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
ja commitoidaan muutokset&lt;br /&gt;
 $ git commit -a -m  &amp;quot;Hienosäädetään tekstiä&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ajatellaan nyt, että ohjelmamme on kehittynyt siihen pisteeseen että on aika ottaa kokeellisessa &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haarassa tehdyt muokkaukset käyttöön. Niiden käyttöönotto onnistuu nyt helposti, sillä Git osaa yhdistää kaksi kehityshaaraa. Yhdistetään &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haara &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haaraan ajamalla komento &lt;br /&gt;
 $ git merge testailu &lt;br /&gt;
 Auto-merged hello.c&lt;br /&gt;
 CONFLICT (content): Merge conflict in hello.c&lt;br /&gt;
 Automatic merge failed; fix conflicts and then commit the result.&lt;br /&gt;
joka yhdistää &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haaran aktiivisena olevaan haaraan (nyt &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;). Git osaa automaattisesti muuttaa &amp;lt;tt&amp;gt;README&amp;lt;/tt&amp;gt;-tiedoston sisällön sillä siihen ei ole tehty muokkauksia &amp;lt;tt&amp;gt;testailu&amp;lt;/tt&amp;gt;-haaran luomisen jälkeen. Sen sijaan molemmissa haaroissa on muokattu &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt;-tiedostoa samasta kohdasta, joten Git ei osaa päätellä, miten muokkaukset tulisi yhdistää. Tästä syystä automaattinen yhdistäminen epäonnistuu ja yhdistäminen jätetään käyttäjän harteille. &lt;br /&gt;
&lt;br /&gt;
Yhdistäminen tapahtuu muokkaamalla nyt käsin tiedostoa &amp;lt;tt&amp;gt;hello.c&amp;lt;/tt&amp;gt; josta löytyy rivit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD:hello.c&lt;br /&gt;
  printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
=======&lt;br /&gt;
  printf(&amp;quot;Päivää, maailma!!!!!111111\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; testailu:hello.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Git on siis merkinnyt allekkain ristiriidassa olevan kohdan rivit ensin aktiivisesta haarasta ja tämän jälkeen liitettävästä haarasta. Toteamme, että &amp;lt;tt&amp;gt;teistailu&amp;lt;/tt&amp;gt;-haaran ensimmäinen printf-rivi on järkyttävä, joten poistamme sen. Sen sijaan jätämme tietysti jäljelle linux.fin mainoksen. Lisäksi tiedostosta poistetaan käsin Gitin lisäämät ohjausrivit (&amp;lt;tt&amp;gt;=========&amp;lt;/tt&amp;gt; yms.), jolloin tiedoston tämä osuus jää muotoon&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 printf(&amp;quot;Terve maailma\n&amp;quot;);&lt;br /&gt;
 printf(&amp;quot;Vierailepa osoitteessa http://linux.fi\n&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Siirretään muutokset versionhallintaan:&lt;br /&gt;
 $ git commit -a -m &amp;quot;Yhdistetty kokeellisesta haarasta versio 2.0&amp;quot;&lt;br /&gt;
 Created commit 82fef9e: Yhdistetty kokeellisesta haarasta versio 2.0&lt;br /&gt;
Nyt komennolla &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt; nähdään, että on kyseisen commitin yhteydessä on tapahtunut kahden haaran liittäminen, sillä commitin tunnistenumeron alapuolelle ilmestyy rivi&lt;br /&gt;
 Merge: 040c39d... b2626d8...&lt;br /&gt;
Numero- ja kirjainyhdistelmät viittaavat tiettyyn commiteihin, joiden välillä liitos tapahtui (commitin tunnistenumerosta ilmoitetaan vain alkuosa jos se riittää yksilöimään commitin).&lt;br /&gt;
&lt;br /&gt;
Kun luomallamme kehityshaaralla ei enää ole käyttöä, se voidaan poistaa komennolla&lt;br /&gt;
 $ git branch -d testailu &lt;br /&gt;
 Deleted branch testailu.&lt;br /&gt;
Komento varmistaa, että haarassa tehty kehitystyö on liitetty johonkin toiseen haaraan. Jos muualle liittämätön haara halutaan tarkoituksella hylätä käytetään valitsinta &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git branch -D testailu&lt;br /&gt;
&lt;br /&gt;
=== Tagit ja tunnisteet ===&lt;br /&gt;
Kuten aiemmin huomattiin, jokaiseen commitiin viitataan yksilöllisellä mystisellä kirjain- ja numeroyhdistelmällä. Tämän lisäksi Git mahdollistaa tiettyjen commitien nimeämisen selväkielisillä tageilla. Esimerkiksi nimetään alussa ensimmäisen korjauksen jälkeen tehty commit nimelle &amp;quot;v1.0&amp;quot;:&lt;br /&gt;
 $ git tag v1.0 770194dd647d7f&lt;br /&gt;
Tässä 770194dd647d7f on alkuosa kyseiseen muokkauksen tunniste (ja luultavasti eroaa omassa järjestelmässäsi). Aina, kun Gitissä viitataan tiettyyn muokkaukseen sen tunnisteella riittää kirjoittaa tunnisteen alkuosaa niin pitkälle, että se yksilöi tietyn tunnistenumeron versiohistoriasta.&lt;br /&gt;
&lt;br /&gt;
Tagitetaan vastaavasti uusin commit versiolle 2.0:&lt;br /&gt;
 $ git tag v2.0 &lt;br /&gt;
Kaikki määritetyt tagit saa listattua komennolla &lt;br /&gt;
 $ git tag&lt;br /&gt;
 v1.0&lt;br /&gt;
 v2.0&lt;br /&gt;
&lt;br /&gt;
Nyt voidaan esimerkiksi vertailla näiden kahden commitin välillä tapahtuneita muutoksia:&lt;br /&gt;
 $ git diff v1.0 v2.0&lt;br /&gt;
Tässä voitaisiin toki käyttää tagien sijasta myös tunnisteita, mutta tagit selkeyttävät tilannetta. Nykyiseen tilanteeseen voi viitata &amp;quot;tagilla&amp;quot; HEAD, jolloin version 1.0 jälkeen tehdyt muutokset näkisi komennolla&lt;br /&gt;
 $ git diff v1.0 HEAD&lt;br /&gt;
&lt;br /&gt;
Kahden tilan välillä tapahtuneet commitit nähdään antamalla &amp;lt;tt&amp;gt;git log&amp;lt;/tt&amp;gt; -komennolla parametrina alku- ja lopputila:&lt;br /&gt;
 $ git log v1.0..v2.0&lt;br /&gt;
näyttäisi tagilla v1.0 merkityn tilan jälkeen tapahtuneet muutokset tagiin v2.0 asti.&lt;br /&gt;
&lt;br /&gt;
Edellä esiteltiin eräänlainen tagi HEAD joka viittaa nykyiseen commitiin. Lisäksi voidaan käyttää merkintää ^, joka viittaa edeltäneeseen commitiin (esim. HEAD^ tai v1.0^), esimerkiksi &lt;br /&gt;
 $ git diff v1.0^ v1.0&lt;br /&gt;
näyttäisi erot commitin v1.0 ja sitä edeltäneen commitin välillä. Vastaavasti kaksi commitia taaksepäin on ^^ jne. Yleisemmin voidaan käyttää merkintää ~numero, esimerkiksi HEAD~4 viittaa 4 commitia taaksepäin. Liitetyille (&#039;&#039;merge&#039;&#039;) commiteille löytyy useampia edeltäjiä, jolloin niitä merkitään esimerkiksi HEAD^1 ja HEAD^2.&lt;br /&gt;
&lt;br /&gt;
Yleisesti kaikissa tapauksissa, joissa Gitille annettaisiin commitin tunniste, voidaan käyttää myös kyseiselle commitille merkattua tagia. Katsotaan esimerkiksi millaiseen commitiin asetettiin tagi v2.0:&lt;br /&gt;
 $ git show v2.0&lt;br /&gt;
&lt;br /&gt;
Tietyn tagin merkkaamasta commitista voidaan aloittaa myös uusi haara:&lt;br /&gt;
 $ git branch vakaa v1.0&lt;br /&gt;
&lt;br /&gt;
loisi uuden haaran nimellä vakaa siten, että haarasta löytyisi vain ne commitit, jotka on tehty tähän commitiin mennessä.&lt;br /&gt;
&lt;br /&gt;
Kehityshaaran sisällä voidaan palata tiettyyn vanhaan commitiin komennolla &amp;lt;tt&amp;gt;git reset&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git reset --hard v1.0&lt;br /&gt;
palaisi valitussa haarassa tagin v1.0 osoittamaan commitiin. Tämä komento poistaa kaikki tehdyt commitit viitatun commitin jälkeen ja lisäksi paikallisesti tehdyt, versionhallintaan siirtämättömät muokkaukset. Tätä ei pidä käyttää julkisesti käytössä olevassa Git-varastossa. Sen sijaan on käytettävä komentoa &amp;lt;tt&amp;gt;git revert&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== git merge ja git rebase ===&lt;br /&gt;
&lt;br /&gt;
=== Kopioiminen - Git yhteistyövälineenä ===&lt;br /&gt;
Versionhallinnasta on eniten iloa tilanteessa, jossa useampi kehittäjä toimii saman projektin kimpussa. Oletetaan nyt, että äskeinen kehitystyö tapahtui hakemistossa &amp;lt;tt&amp;gt;/home/osku/projekti&amp;lt;/tt&amp;gt;. Nyt toinen samalla koneella oleva käyttäjä haluaa osallistua kehitystyöhön. Tällöin hän voi hakea versionhallinnasta kopion itselleen komennolla &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 $ git clone /home/osku/projekti hello&lt;br /&gt;
Komento kopioi hakemistosta &amp;lt;tt&amp;gt;/home/osku/projekti&amp;lt;/tt&amp;gt; löytyvän projektin Git-versionhallinnasta kopion hakemistoon &amp;lt;tt&amp;gt;hello&amp;lt;/tt&amp;gt;. Jos kehityshaaraa ei erikseen mainita haetaan &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-haara.&lt;br /&gt;
&lt;br /&gt;
Kun toinen käyttäjä (tässä Elisa) on tehnyt haluamiaan muutoksia projektiin (commitoinut ne versionhallintaan hakemistossa &amp;lt;tt&amp;gt;/home/elisa/hello&amp;lt;/tt&amp;gt;) hän voi ilmoittaa siitä Oskulle, joka voi hakea muutokset omaan kehityshaaraansa komennolla&lt;br /&gt;
 $ git pull /home/elisa/hello master&lt;br /&gt;
Komento hakee parametrina annetusta hakemistosta löytyvästä versionhallinnasta &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;-kehityshaaran sisällön ja liittää sen aktiivisena olevaan kehityshaaraan. Jos paikalliseen kehityshaaraan ja etähaaraan (eli Elisan kehityshaaraan) välillä on päällekkäisiä muokkauksia jätetään ristiriidat käyttäjän ratkaistavaksi (kuten edellä käsiteltäessä kehityshaarojen yhdistämistä). Lopuksi &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt; tekee muutoksista commitin nykyiseen haaraan.&lt;br /&gt;
&lt;br /&gt;
Yleensä ulkoisen kehityshaaran liittäminen suoraan ei ole järkevää, vaan kannattaa ensin katsoa, minkälaisia muutoksia ollaan tekemässä. Tämä onnistuu hakemalla ulkoisen kehityshaaran muutokset komennolla &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt;, eli Osku voisi ajaa komennon&lt;br /&gt;
 $ git fetch /home/elisa/hello master&lt;br /&gt;
eli &amp;lt;tt&amp;gt;git fetch&amp;lt;/tt&amp;gt; -komennolle annetaan samat parametrit kuin &amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt; -komennolle.&lt;br /&gt;
&lt;br /&gt;
Nyt muutokset on haettu mutta ei vielä siirretty versionhallintaan. Myöskään paikallisia tiedostoja ei ole muutettu mitenkään. Haettuun kehityshaaraan voidaan kuitenkin viitata tagilla &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;, jolloin nykyisen tilanteen (&amp;lt;tt&amp;gt;HEAD&amp;lt;/tt&amp;gt;) ja haetun tilanteen erot nähtäisiin komennolla &lt;br /&gt;
 $ git log -p HEAD..FETCH_HEAD&lt;br /&gt;
Jos muutokset näyttävät hyviltä, ne voidaan commitoida liittämällä &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;-haara aktiivisena olevaan haaraan komennolla&lt;br /&gt;
 $ git merge FETCH_HEAD&lt;br /&gt;
&lt;br /&gt;
Etäkoneilla sijaitseviin kehityshaaroihin voidaan luoda linkkejä komennolla &amp;lt;tt&amp;gt;git remote&amp;lt;/tt&amp;gt;. Esimerkiksi Osku voisi luoda Elisan haaraan linkin &amp;lt;tt&amp;gt;elisa&amp;lt;/tt&amp;gt; komennolla&lt;br /&gt;
 $ git remote add elisa /home/elisa/hello&lt;br /&gt;
Tämän jälkeen muutokset voitaisiin hakea helposti komennolla &lt;br /&gt;
 $ git fetch elisa&lt;br /&gt;
joka hakisi kaikkien Elisan kehityshaarojen sisällöt. Näihin haaroihin voitaisiin nyt viitata muodossa &amp;lt;tt&amp;gt;elisa/haaran_nimi&amp;lt;/tt&amp;gt;, esimerkiksi &amp;lt;tt&amp;gt;elisa/master&amp;lt;/tt&amp;gt;. Esimerkiksi erot nähtäisiin komennolla&lt;br /&gt;
 $ git log -p HEAD..elisa/master&lt;br /&gt;
Ja haaran liittäminen nykyiseen haaraan onnistuisi komennolla &lt;br /&gt;
 $ git merge elisa/master&lt;br /&gt;
Yksittäisen haaran (esim. &amp;lt;tt&amp;gt;master&amp;lt;/tt&amp;gt;) voi hakea komennolla &lt;br /&gt;
 $ git fetch elisa master&lt;br /&gt;
jolloin haettuun haaraan voi viitata tagilla &amp;lt;tt&amp;gt;FETCH_HEAD&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Elisa voi myös suoraan päivittää kehityshaaraansa Oskun haaraan tehdyt muutokset suoraan komennolla&lt;br /&gt;
 $ git pull&lt;br /&gt;
Komennolle ei tarvitse antaa parametreja sillä &amp;lt;tt&amp;gt;git clone&amp;lt;/tt&amp;gt; on tallentanut Gitin tietokantaan tiedon siitä, mistä alkuperäinen kopio on tehty. Jos versioiden välillä on ristiriitoja ei muutoksista tehdä commitia vaan ristiriidat jätetään käyttäjän ratkaistavaksi kuten &amp;lt;tt&amp;gt;git merge&amp;lt;/tt&amp;gt;:n kanssa huomattiin. Kun ristiriidat on korjattu viedään muutokset versionhallintaan tavalliseen tapaan &amp;lt;tt&amp;gt;git commit -a&amp;lt;/tt&amp;gt; -komennolla.&lt;br /&gt;
&lt;br /&gt;
Voit luoda projektia varten palvelimelle oman tietovaraston (engl. &#039;&#039;repository&#039;&#039;) eli hakemiston, johon kukin kehittäjä voi tehdä omat muutoksensa itsenäisesti ilman, että täytyy pyytää erikseen muita kehittäjiä hakemaan tehdyt muutokset omasta kansiostasi. Tällainen paljas (engl. &#039;&#039;bare&#039;&#039;) tietovarasto luodaan kirjautumalla ensin palvelimelle ja antamalla esimerkiksi komennot&lt;br /&gt;
 $ cd /opt/git&lt;br /&gt;
 $ mkdir project.git&lt;br /&gt;
 $ cd project.git&lt;br /&gt;
 $ git --bare init&lt;br /&gt;
Siirrytään tämän jälkeen omalle koneelle projektin työhakemistoon. Jos työhakemistossa ei ole otettu git versiohallintaa käyttöön, niin tehdään se nyt ja lisätään sinne tarvittavat tiedostot (git init; git add .; git commit; ks.yllä). Luodaan linkki palvelimella olevaan hakemistoon. Esimerkiksi&lt;br /&gt;
 $ git remote add origin ssh://user@gitserver/opt/git/project.git&lt;br /&gt;
Kaikilla kehittäjillä (user) pitää olla palvelimella (gitserver) pääsy , luku- ja kirjoitusoikeus kyseiseen hakemistoon. Tällöin kehittäjät voivat siirtää tekemänsä muutokset tietovarastoon komenolla&lt;br /&gt;
 $ git push origin master&lt;br /&gt;
Kun projekti on siirretty git push komennolla palvelimelle, voivat muut kehittäjät liittyä siihen normaalisti komennolla&lt;br /&gt;
 $ git clone ssh://user@gitserver/opt/git/project.git&lt;br /&gt;
Muiden kehittäjien ei tarvitse enää luoda linkkiä projektiin yllä olevalla tavalla koska clone luo sen origin nimellä automaattisesti. He siirtävät tekemänsä muokkaukset palvelimen tietovarastoon samalla git push komennolla.&lt;br /&gt;
Mikäli useampi kehittäjä muokkaa tietovarastoa yhtä aikaa ja toinen kehittäjä on muokannut tietovarastoa sillä välin kun olet hakenut ja tehnyt omia muutoksiasi, pitää ennen git push komentoa antaa git pull, jolloin muiden tekemät muutokset liitetään omiin muutoksiisi ja mahdolliset ristiriidat ratkaistaan (ks. git pull yllä).&lt;br /&gt;
&lt;br /&gt;
Paljas repository toimii myös projektin varmuuskopiona, mikäli oma työhakemistosi syystä tai toisesta tuhoutuu.&lt;br /&gt;
&lt;br /&gt;
== Graafisia Git-käyttöliittymiä ==&lt;br /&gt;
* [[SmartGit]] [http://www.syntevo.com/smartgit/] - kaupallinen, ilmainen ei kaupalliseen tarkoitukseen.&lt;br /&gt;
* [[git-cola]] [http://git-cola.github.io/]&lt;br /&gt;
* [[GitEye]] [http://www.collab.net/products/giteye]&lt;br /&gt;
* [[Giggle]] [https://wiki.gnome.org/Apps/giggle/]&lt;br /&gt;
* [[gitg]] [https://wiki.gnome.org/Apps/Gitg/]&lt;br /&gt;
* [[GitKraken]] [http://www.gitkraken.com/]&lt;br /&gt;
* [[GitForce]] [https://sites.google.com/site/gitforcetool/home] ([[Mono]])&lt;br /&gt;
* [[tig]] [http://jonas.nitro.dk/tig/]&lt;br /&gt;
* [[QGit]] [http://digilander.libero.it/mcostalba/]&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Bazaar]]&lt;br /&gt;
*[[CVS]]&lt;br /&gt;
*[[Darcs]]&lt;br /&gt;
*[[Mercurial]]&lt;br /&gt;
*[[Subversion]]&lt;br /&gt;
*[[GitHub]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [http://git-scm.com/ Gitin kotisivu]&lt;br /&gt;
* [http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html Git tutorial]&lt;br /&gt;
* [[wikipedia:Git (software)|Git englanninkielisessä Wikipediassa]]&lt;br /&gt;
* [http://progit.org/book/ Pro Git, professional version control] -ekirja&lt;br /&gt;
* [https://www.codecademy.com/learn/learn-git www.codecademy.com/learn/learn-git] - Codecademyn Git-kurssi&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Kehitystyökalut]]&lt;/div&gt;</summary>
		<author><name>Karilindgren</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Taustaprosessi&amp;diff=45279</id>
		<title>Taustaprosessi</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Taustaprosessi&amp;diff=45279"/>
		<updated>2016-03-17T22:53:18Z</updated>

		<summary type="html">&lt;p&gt;Karilindgren: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Taustaprosessi on taustalla ajettava [[prosessi]]. Esimerkiksi [[palvelin|palvelinohjelmistoja]] (kuten [[Apache]]) ajetaan yleensä taustaprosesseina.  &lt;br /&gt;
&lt;br /&gt;
Taustaprosesseina toimivien palvelujen (engl. &#039;&#039;daemon&#039;&#039;, suomeksi joskus &#039;&#039;demoni&#039;&#039;) käynnistyksestä huolehtii yleensä [[init]]. Taustapalvelut toteuttavat monia Linux/Unix-järjestelmän perustoimintoja kuten esimerkiksi tulostuksen ([[CUPS]], [[lpd]]), [[Samba]]-jaot sekä [[infrapunalaitteet]] (irda).&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
&lt;br /&gt;
*[[Init-skriptit]]&lt;br /&gt;
*[[Fork()]]&lt;br /&gt;
*[[Prosessi#Prosessien_tausta-ajo|Prosessien tausta-ajo]]&lt;br /&gt;
*[[Nohup]]&lt;br /&gt;
*[[Screen]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Prosessienhallinta]]&lt;/div&gt;</summary>
		<author><name>Karilindgren</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Prosessi&amp;diff=45278</id>
		<title>Prosessi</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Prosessi&amp;diff=45278"/>
		<updated>2016-03-17T22:51:49Z</updated>

		<summary type="html">&lt;p&gt;Karilindgren: /* Prosessien tausta-ajo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{perustietoa}}&lt;br /&gt;
Kun ohjelma käynnistetään, [[käyttöjärjestelmä]] luo &#039;&#039;&#039;prosessin&#039;&#039;&#039;, jona ohjelmaa ajetaan. Prosessit yksilöidään [[PID]]-numeroilla (&amp;quot;process id&amp;quot;). Sovellus voi muodostua useammasta prosessista, joita se käynnistää [[fork]]-kutsuilla.&lt;br /&gt;
&lt;br /&gt;
Itse prosessi voi koostua useammasta [[säie|säikeestä]], jotka prosesseista poiketen jakavat muistiavaruutensa ja muita resursseja. Linuxissa säikeet on toteutettu käytännössä itsenäisinä prosesseina, joita luotaessa vain on määritelty myös mitkä resurssit halutaan yhteisiksi ([[clone]]-kutsulla). Saman prosessin säikeillä on nykyään sama PID (mutta eri säie-ID).&lt;br /&gt;
&lt;br /&gt;
Säie on se yksikkö, jolle varataan prosessoriaikaa, eli saman ohjelman eri säikeet tai prosessit voivat moniprosessorikoneella kukin olla ajossa samanaikaisesti eri prosessoreilla (rinnakkaistus).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prosessien tausta-ajo==&lt;br /&gt;
&#039;&#039;Prosessien tausta-ajoa on käsitelty myös artikkelissa [[Komentorivin perusteet]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Otetaan esimerkkitilanne, jossa haluat ajaa kahta ohjelmaa yhtäaikaa. Toinen on videonkatseluohjelma [[mplayer]] ja toinen on musiikintoisto-ohjelma [[xmms]]. Normaalisti [[komentorivi]]llä kirjoittaisit vain ohjelman nimen ja ohjelma käynnistyisi, jos tämä prosessi kuitenkin halutaan tausta-ajoon siten, että samasta [[terminaali]]sta voidaan käynnistää useita ohjelmia, tulee ohjelman perään lisätä &amp;amp;-merkki. Kun olet kirjoittanut ohjelman nimen &amp;amp;-merkin kanssa, tulostaa [[komentotulkki]] sinulle ohjelman työnumeron sekä [[PID]]:n, joiden avulla voit myöhemmin esimerkiksi [[kill|sulkea/tappaa]] prosessin.&lt;br /&gt;
&lt;br /&gt;
Ohjelman käynnistäminen tausta-ajoon&lt;br /&gt;
 xmms &amp;amp;&lt;br /&gt;
Ohjelman ajaminen tulostaa seuraavaa: [työnumero­][PID] ohjelmannimi&lt;br /&gt;
 [1][3017] xmms&lt;br /&gt;
Nyt voimme heti perään käynnistää toisen ohjelman - sen mplayerin jonka alun perin halusimme tulevan samaan aikaan ajoon. Tämä tapahtuu aivan identtisellä tavalla:&lt;br /&gt;
 mplayer &amp;amp;&lt;br /&gt;
Tämä antaa jälleen kerran tulosteeksi työnumeron ja PID:n. &lt;br /&gt;
&lt;br /&gt;
On myös toinen tapa lähestyä tausta-ajoa, jos olemme käynnistäneet ohjelman ilman &amp;amp;-merkkiä ja haluamme sen tausta-ajoon. Voit yksinkertaisesti käyttää näppäimistöä asettamaan käynnissä olevan prosessin (joka tukkii komentorivin) pysähdyksiin painamalla &#039;&#039;&#039;Ctrl+Z&#039;&#039;&#039;. Tämän jälkeen saat prosessin tausta-ajoon kirjoittamalla komentoriville &amp;lt;tt&amp;gt;[[bg]] %työnumero&amp;lt;/tt&amp;gt;. Käytännössä ensin ohjelma pysäytetään ja sen jälkeen asetetaan tausta-ajoon. Esimerkiksi:&lt;br /&gt;
&lt;br /&gt;
Pysäytetään ohjelma xmms, joka on käynnistetty ilman &amp;amp;-merkkiä&lt;br /&gt;
 xmms&lt;br /&gt;
Painetaan terminaaliemulaattori-ikkunan ollessa aktiivisena Ctrl+Z.&lt;br /&gt;
 &lt;br /&gt;
Ruutuun tulee teksti, joka kertoo prosessin työnumeron, tilan sekä nimen&lt;br /&gt;
 [1]+ Stopped xmms&lt;br /&gt;
Nyt asetamme ohjelman tausta-ajoon (katsomme työnumeron edellä tulevasta tulosteesta)&lt;br /&gt;
 bg %1 &lt;br /&gt;
&lt;br /&gt;
Prosessin saa myös nostettua etualalle komentamalla &amp;lt;tt&amp;gt;%työnumero&amp;lt;/tt&amp;gt; tai &amp;lt;tt&amp;gt;[[fg]] %työnumero&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nyt osaamme asettaa prosessit tausta-ajoon ja käynnistää kaksi ohjelmaa peräkkäin. Entäs jos haluamme ajaa kymmeniä ohjelmia päällekäin, emmekä muista ohjelmien työnumeroita? Komento &amp;lt;tt&amp;gt;[[jobs]]&amp;lt;/tt&amp;gt; auttaa tässä tilanteessa. Kirjoittamalla komentoriville tuon komennon saamme listauksen kaikista töistä ja niiden työnumeroista. Tämän jälkeen komennolla &amp;lt;tt&amp;gt;bg %työnumero&amp;lt;/tt&amp;gt; saa prosessit asetettua tausta-ajoon.&lt;br /&gt;
&lt;br /&gt;
==Ohjelmien tappaminen==&lt;br /&gt;
On todennäköistä, että joskus jokin ohjelma jää jumiin, eikä ole muuta keinoa kuin tappaa tämän ohjelman prosessi. Prosessin tappaminen tapahtuu komennolla &amp;lt;tt&amp;gt;[[kill]] %työnumero&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;kill PID&amp;lt;/tt&amp;gt; tai &amp;lt;tt&amp;gt;[[killall]] ohjelmannimi&amp;lt;/tt&amp;gt;. Ohjelman PID:n saa esimerkiksi komennoilla &amp;lt;tt&amp;gt;[[ps]] -A&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;[[pstree]] -p&amp;lt;/tt&amp;gt; tai &amp;lt;tt&amp;gt;[[top]]&amp;lt;/tt&amp;gt;. Seuraavassa haetaan PID-numero komennolla pstree ja tapetaan jumittunut xmms-prosessi.&lt;br /&gt;
&lt;br /&gt;
Tarkistetaan käynnissä olevien taustaprosessien määrä&lt;br /&gt;
 jobs&lt;br /&gt;
Tulostus näyttää tämäntapaiselta&lt;br /&gt;
 [1]+ running [3333] xmms&lt;br /&gt;
 [2]+ running [3434] gkrellm&lt;br /&gt;
 [3]+ running [3344] gmplayer&lt;br /&gt;
Tapetaan prosessi työnumeron mukaan (gkrellm)&lt;br /&gt;
 kill %2&lt;br /&gt;
Tuloste näyttää tämäntapaiselta&lt;br /&gt;
 [2]+ exit 1 gkrellm&lt;br /&gt;
Otetaan pstree-tuloste PID:n mukaan ja tapetaan PID:n avulla xmms-prosessi&lt;br /&gt;
 pstree -p&lt;br /&gt;
Tuloste (tulostetta kutistettu)&lt;br /&gt;
 fluxbox(428)-+-Eterm(603)---bash(606)---irssi(7+&lt;br /&gt;
                                             |-Eterm(1215)---bash(1218)---irssi+&lt;br /&gt;
                                             |-Eterm(7868)---bash(7871)&lt;br /&gt;
                                             |-Eterm(11586)---bash(11590)---irs+&lt;br /&gt;
                                             |-Eterm(21647)---bash(21650)-+-pst+&lt;br /&gt;
                                             |                            `-wis+&lt;br /&gt;
                                             |-MozillaFirebird(20617)---Mozilla+&lt;br /&gt;
                                             |-dcgui-qt(21267)---dcgui-qt(21270+&lt;br /&gt;
                                             |-soffice.bin(21722)---soffice.bin+&lt;br /&gt;
                                             |-ssh-agent(466)&lt;br /&gt;
                                             |-wish(9520)---wish(9521)---wish(9+&lt;br /&gt;
                                             `-&#039;&#039;&#039;xmms(25068)&#039;&#039;&#039;---xmms(25070)-+-xmms+&lt;br /&gt;
                                                                         |-xmms+&lt;br /&gt;
                                                                         |-xmms+&lt;br /&gt;
                                                                         |-xmms+&lt;br /&gt;
                                                                         `-xmms+&lt;br /&gt;
Katsotaan &#039;&#039;päällimmäisen&#039;&#039; xmms-prosessin PID ja tapetaan se (prosessi lihavoitu)&lt;br /&gt;
 kill 25068&lt;br /&gt;
Tapetaan ohjelman killallin avulla antamalla sen nimi:&lt;br /&gt;
 killall xmms&lt;br /&gt;
Oletuksena kill-komento pyytää ohjelmaa sulkeutumaan lähettämällä sille [[signaali]]n &amp;lt;tt&amp;gt;SIGTERM&amp;lt;/tt&amp;gt;. Jos ohjelma on epäsivistynyt tai pahasti jumissa, se ei välttämättä sulkeudu. Katso komento [[kill]].&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
*[[:Luokka:Prosessienhallinta|Prosessienhallinta-luokka]]&lt;br /&gt;
*[[bg]] - lisätietoa tausta-ajosta&lt;br /&gt;
*[[kill]] - lisätietoa ohjelmien tappamisesta&lt;br /&gt;
*[[Signaali]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Ohjeet]]&lt;br /&gt;
[[Luokka:Prosessienhallinta]]&lt;/div&gt;</summary>
		<author><name>Karilindgren</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Prosessi&amp;diff=45277</id>
		<title>Prosessi</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Prosessi&amp;diff=45277"/>
		<updated>2016-03-17T22:50:42Z</updated>

		<summary type="html">&lt;p&gt;Karilindgren: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{perustietoa}}&lt;br /&gt;
Kun ohjelma käynnistetään, [[käyttöjärjestelmä]] luo &#039;&#039;&#039;prosessin&#039;&#039;&#039;, jona ohjelmaa ajetaan. Prosessit yksilöidään [[PID]]-numeroilla (&amp;quot;process id&amp;quot;). Sovellus voi muodostua useammasta prosessista, joita se käynnistää [[fork]]-kutsuilla.&lt;br /&gt;
&lt;br /&gt;
Itse prosessi voi koostua useammasta [[säie|säikeestä]], jotka prosesseista poiketen jakavat muistiavaruutensa ja muita resursseja. Linuxissa säikeet on toteutettu käytännössä itsenäisinä prosesseina, joita luotaessa vain on määritelty myös mitkä resurssit halutaan yhteisiksi ([[clone]]-kutsulla). Saman prosessin säikeillä on nykyään sama PID (mutta eri säie-ID).&lt;br /&gt;
&lt;br /&gt;
Säie on se yksikkö, jolle varataan prosessoriaikaa, eli saman ohjelman eri säikeet tai prosessit voivat moniprosessorikoneella kukin olla ajossa samanaikaisesti eri prosessoreilla (rinnakkaistus).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prosessien tausta-ajo==&lt;br /&gt;
&#039;&#039;Prosessien tausta-ajoa on käsitelty myös artikkelissa [[Komentorivin perusteet]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Otetaan esimerkkitilanne, jossa haluat ajaa kahta ohjelmaa yhtäaikaa. Toinen on videonkatseluohjelma [[mplayer]] ja toinen on musiikintoisto-ohjelma [[xmms]]. Normaalisti [[komentorivi]]llä kirjoittaisit vain ohjelman nimen ja ohjelma käynnistyisi, jos tämä prosessi kuitenkin halutaan tausta-ajoon siten, että samasta [[terminaali]]sta voidaan käynnistää useita ohjelmia, tulee ohjelman perään lisätä &amp;amp;-merkki. Kun olet kirjoittanut ohjelman nimen &amp;amp;-merkin kanssa, tulostaa [[komentotulkki]] sinulle ohjelman työnumeron sekä [[PID]]:n, joiden avulla voit myöhemmin esimerkiksi [[kill|tappaa]] prosessin.&lt;br /&gt;
&lt;br /&gt;
Ohjelman käynnistäminen tausta-ajoon&lt;br /&gt;
 xmms &amp;amp;&lt;br /&gt;
Ohjelman ajaminen tulostaa seuraavaa: [työnumero­][PID] ohjelmannimi&lt;br /&gt;
 [1][3017] xmms&lt;br /&gt;
Nyt voimme heti perään käynnistää toisen ohjelman - sen mplayerin jonka alun perin halusimme tulevan samaan aikaan ajoon. Tämä tapahtuu aivan identtisellä tavalla:&lt;br /&gt;
 mplayer &amp;amp;&lt;br /&gt;
Tämä antaa jälleen kerran tulosteeksi työnumeron ja PID:n. &lt;br /&gt;
&lt;br /&gt;
On myös toinen tapa lähestyä tausta-ajoa, jos olemme käynnistäneet ohjelman ilman &amp;amp;-merkkiä ja haluamme sen tausta-ajoon. Voit yksinkertaisesti käyttää näppäimistöä asettamaan käynnissä olevan prosessin (joka tukkii komentorivin) pysähdyksiin painamalla &#039;&#039;&#039;Ctrl+Z&#039;&#039;&#039;. Tämän jälkeen saat prosessin tausta-ajoon kirjoittamalla komentoriville &amp;lt;tt&amp;gt;[[bg]] %työnumero&amp;lt;/tt&amp;gt;. Käytännössä ensin ohjelma pysäytetään ja sen jälkeen asetetaan tausta-ajoon. Esimerkiksi:&lt;br /&gt;
&lt;br /&gt;
Pysäytetään ohjelma xmms, joka on käynnistetty ilman &amp;amp;-merkkiä&lt;br /&gt;
 xmms&lt;br /&gt;
Painetaan terminaaliemulaattori-ikkunan ollessa aktiivisena Ctrl+Z.&lt;br /&gt;
 &lt;br /&gt;
Ruutuun tulee teksti, joka kertoo prosessin työnumeron, tilan sekä nimen&lt;br /&gt;
 [1]+ Stopped xmms&lt;br /&gt;
Nyt asetamme ohjelman tausta-ajoon (katsomme työnumeron edellä tulevasta tulosteesta)&lt;br /&gt;
 bg %1 &lt;br /&gt;
&lt;br /&gt;
Prosessin saa myös nostettua etualalle komentamalla &amp;lt;tt&amp;gt;%työnumero&amp;lt;/tt&amp;gt; tai &amp;lt;tt&amp;gt;[[fg]] %työnumero&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nyt osaamme asettaa prosessit tausta-ajoon ja käynnistää kaksi ohjelmaa peräkkäin. Entäs jos haluamme ajaa kymmeniä ohjelmia päällekäin, emmekä muista ohjelmien työnumeroita? Komento &amp;lt;tt&amp;gt;[[jobs]]&amp;lt;/tt&amp;gt; auttaa tässä tilanteessa. Kirjoittamalla komentoriville tuon komennon saamme listauksen kaikista töistä ja niiden työnumeroista. Tämän jälkeen komennolla &amp;lt;tt&amp;gt;bg %työnumero&amp;lt;/tt&amp;gt; saa prosessit asetettua tausta-ajoon.&lt;br /&gt;
&lt;br /&gt;
==Ohjelmien tappaminen==&lt;br /&gt;
On todennäköistä, että joskus jokin ohjelma jää jumiin, eikä ole muuta keinoa kuin tappaa tämän ohjelman prosessi. Prosessin tappaminen tapahtuu komennolla &amp;lt;tt&amp;gt;[[kill]] %työnumero&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;kill PID&amp;lt;/tt&amp;gt; tai &amp;lt;tt&amp;gt;[[killall]] ohjelmannimi&amp;lt;/tt&amp;gt;. Ohjelman PID:n saa esimerkiksi komennoilla &amp;lt;tt&amp;gt;[[ps]] -A&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;[[pstree]] -p&amp;lt;/tt&amp;gt; tai &amp;lt;tt&amp;gt;[[top]]&amp;lt;/tt&amp;gt;. Seuraavassa haetaan PID-numero komennolla pstree ja tapetaan jumittunut xmms-prosessi.&lt;br /&gt;
&lt;br /&gt;
Tarkistetaan käynnissä olevien taustaprosessien määrä&lt;br /&gt;
 jobs&lt;br /&gt;
Tulostus näyttää tämäntapaiselta&lt;br /&gt;
 [1]+ running [3333] xmms&lt;br /&gt;
 [2]+ running [3434] gkrellm&lt;br /&gt;
 [3]+ running [3344] gmplayer&lt;br /&gt;
Tapetaan prosessi työnumeron mukaan (gkrellm)&lt;br /&gt;
 kill %2&lt;br /&gt;
Tuloste näyttää tämäntapaiselta&lt;br /&gt;
 [2]+ exit 1 gkrellm&lt;br /&gt;
Otetaan pstree-tuloste PID:n mukaan ja tapetaan PID:n avulla xmms-prosessi&lt;br /&gt;
 pstree -p&lt;br /&gt;
Tuloste (tulostetta kutistettu)&lt;br /&gt;
 fluxbox(428)-+-Eterm(603)---bash(606)---irssi(7+&lt;br /&gt;
                                             |-Eterm(1215)---bash(1218)---irssi+&lt;br /&gt;
                                             |-Eterm(7868)---bash(7871)&lt;br /&gt;
                                             |-Eterm(11586)---bash(11590)---irs+&lt;br /&gt;
                                             |-Eterm(21647)---bash(21650)-+-pst+&lt;br /&gt;
                                             |                            `-wis+&lt;br /&gt;
                                             |-MozillaFirebird(20617)---Mozilla+&lt;br /&gt;
                                             |-dcgui-qt(21267)---dcgui-qt(21270+&lt;br /&gt;
                                             |-soffice.bin(21722)---soffice.bin+&lt;br /&gt;
                                             |-ssh-agent(466)&lt;br /&gt;
                                             |-wish(9520)---wish(9521)---wish(9+&lt;br /&gt;
                                             `-&#039;&#039;&#039;xmms(25068)&#039;&#039;&#039;---xmms(25070)-+-xmms+&lt;br /&gt;
                                                                         |-xmms+&lt;br /&gt;
                                                                         |-xmms+&lt;br /&gt;
                                                                         |-xmms+&lt;br /&gt;
                                                                         `-xmms+&lt;br /&gt;
Katsotaan &#039;&#039;päällimmäisen&#039;&#039; xmms-prosessin PID ja tapetaan se (prosessi lihavoitu)&lt;br /&gt;
 kill 25068&lt;br /&gt;
Tapetaan ohjelman killallin avulla antamalla sen nimi:&lt;br /&gt;
 killall xmms&lt;br /&gt;
Oletuksena kill-komento pyytää ohjelmaa sulkeutumaan lähettämällä sille [[signaali]]n &amp;lt;tt&amp;gt;SIGTERM&amp;lt;/tt&amp;gt;. Jos ohjelma on epäsivistynyt tai pahasti jumissa, se ei välttämättä sulkeudu. Katso komento [[kill]].&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
*[[:Luokka:Prosessienhallinta|Prosessienhallinta-luokka]]&lt;br /&gt;
*[[bg]] - lisätietoa tausta-ajosta&lt;br /&gt;
*[[kill]] - lisätietoa ohjelmien tappamisesta&lt;br /&gt;
*[[Signaali]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Ohjeet]]&lt;br /&gt;
[[Luokka:Prosessienhallinta]]&lt;/div&gt;</summary>
		<author><name>Karilindgren</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=OneDrive-d-old&amp;diff=45276</id>
		<title>OneDrive-d-old</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=OneDrive-d-old&amp;diff=45276"/>
		<updated>2016-03-17T22:47:35Z</updated>

		<summary type="html">&lt;p&gt;Karilindgren: /* Asennus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma&lt;br /&gt;
| nimi=OneDrive-d&lt;br /&gt;
| kuva=&lt;br /&gt;
| kuvateksti=&lt;br /&gt;
| lisenssi=[[GPL]]&lt;br /&gt;
| käyttöliittymä=taustapalvelu, teksti&lt;br /&gt;
| kotisivu=[https://github.com/xybu/onedrive-d github.com/xybu/onedrive-d]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OneDrive-d&#039;&#039;&#039; on synkronoiontisovellus Linuxille, jolla voidaan hallita Microsoftin suljetun lähdekoodin [[OneDrive]] pilvipalvelua.&lt;br /&gt;
Ohjelma ei tarjoa minkäänlaista salausta, suositeltavaa olisi käyttää tiedostojen salaamiseen [[CryptSync]]in tyylistä apuohjelmaa.&lt;br /&gt;
&lt;br /&gt;
===Poisto===&lt;br /&gt;
Poistaaksesi onedrive-d &amp;lt; 1.0&lt;br /&gt;
 sudo pip uninstall onedrive-d&lt;br /&gt;
&lt;br /&gt;
Poistaaksesi onedrive-d &amp;gt;= 1.0&lt;br /&gt;
 sudo pip3 uninstall onedrive-d&lt;br /&gt;
&lt;br /&gt;
Poista vanhat asetustiedostot&lt;br /&gt;
 rm -rfv ~/.onedrive&lt;br /&gt;
&lt;br /&gt;
===Asennus===&lt;br /&gt;
Lataa lähdekoodi käyttämällä [[git]]-versionhallintajärjestelmää.&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/xybu/onedrive-d.git&lt;br /&gt;
 cd onedrive-d&lt;br /&gt;
&lt;br /&gt;
Paikalliseen tiedostojärjestelmään on tallennettava UTC-aikaleimat, ei paikallista aikaa. Tämä pätee useimpiin Unix tiedostojärjestelmiin.&lt;br /&gt;
onedrive-d vaatii [[python]]3 käyttöä. Jos Pythonin versio on vanhempi kuin 3.4, python3-PIP on myös tarpeen.&lt;br /&gt;
&lt;br /&gt;
Python3:sta on käytettävä [[Unicode]]-tilassa (oletusarvo useimmilla Linux jakelupaketeilla) muuten sen &amp;lt;tt&amp;gt;string&amp;lt;/tt&amp;gt;-tietotyypit eivät toimi.&lt;br /&gt;
&lt;br /&gt;
Taustaprosessi ([[daemon]]) on toteutettu Pythonilla. Riippuvuudet: &amp;lt;tt&amp;gt;psutil&amp;lt;/tt&amp;gt; paketti edellyttää, että järjestelmään on asennettu paketti &amp;lt;tt&amp;gt;python3-dev&amp;lt;/tt&amp;gt;. Jos asennus epäonnistuu: &amp;lt;Python.h&amp;gt; paketti puuttuu, tarkista &amp;lt;tt&amp;gt;python3-dev&amp;lt;/tt&amp;gt;-paketti on asennettuna. Kaikki Linux jakelut asentavat tämän oletuksena. Kiinnitä erityistä huomiota tähän, jos työpöytäympäristö on MATE (eli jos jakelupaketti on Linux Mint tai Ubuntu MATE jne).&lt;br /&gt;
&lt;br /&gt;
GObject (&amp;lt;tt&amp;gt;python3-gi&amp;lt;/tt&amp;gt; paketti Debian/Ubuntu, &amp;lt;tt&amp;gt;pygobject3&amp;lt;/tt&amp;gt; Fedora, &amp;lt;tt&amp;gt;python-gobject&amp;lt;/tt&amp;gt; Arch, ja &amp;lt;tt&amp;gt;python3-gobject&amp;lt;/tt&amp;gt; openSUSE) ovat tarpeen. Katso tämä artikkeli, jos haluat rakentaa PyGObjectin suoraan lähteestä.&lt;br /&gt;
&lt;br /&gt;
Toinen suositeltava paketti on &amp;lt;tt&amp;gt;inotify-tools&amp;lt;/tt&amp;gt; (löytyy useimmille pakettienhallinnasta), se sisältää komennon &amp;lt;tt&amp;gt;inotifywait&amp;lt;/tt&amp;gt;. Jos tämä komento on käytettävissä järjestelmässä, jossa on reaaliaikainen tiedostojärjestelmän valvontasäie käytössä. Muuten synkronointi suoritetaan tietyn ajan kuluttua (konfiguroitavissa).&lt;br /&gt;
&lt;br /&gt;
Asenna paketti&lt;br /&gt;
 sudo python3 setup.py install&lt;br /&gt;
&lt;br /&gt;
Puhdista väliaikaiset tiedostot&lt;br /&gt;
 sudo python3 setup.py clean&lt;br /&gt;
&lt;br /&gt;
Luo asetustiedostot&lt;br /&gt;
 mkdir ~/.onedrive&lt;br /&gt;
 cp ./onedrive_d/res/default_ignore.ini ~/.onedrive/ignore_v2.ini&lt;br /&gt;
&lt;br /&gt;
Luo lokitiedosto&lt;br /&gt;
 sudo touch /var/log/onedrive_d.log&lt;br /&gt;
saatat joutua muuttamaan `whoami` vastaamaan käyttäjätunnustasi&lt;br /&gt;
 sudo chown `whoami` /var/log/onedrive_d.log&lt;br /&gt;
&lt;br /&gt;
===Parametrit===&lt;br /&gt;
&lt;br /&gt;
Ohjeen lukeminen&lt;br /&gt;
 onedrive-pref --help&lt;br /&gt;
 onedrive-d --help&lt;br /&gt;
&lt;br /&gt;
Käynnistä onedrive-d taustaprosessi&lt;br /&gt;
 onedrive-d start&lt;br /&gt;
&lt;br /&gt;
tai käynnistä prosessi debug parametrilla&lt;br /&gt;
 onedrive-d start --debug&lt;br /&gt;
&lt;br /&gt;
tai vastaavasti lopeta prosessi parametrilla&lt;br /&gt;
 onedrive-d stop&lt;br /&gt;
&lt;br /&gt;
==Ohjelman käyttäminen==&lt;br /&gt;
Käynnistä asetusohjelma komentorivillä: &lt;br /&gt;
 onedrive-pref&lt;br /&gt;
&lt;br /&gt;
* Ohjelma antaa linkin, joka kopioidaan www-selaimeen.&lt;br /&gt;
* Kun sivu on auki www-selaimessa. Kirjoita Microsoft sähköpostiosoite ja salasana ja klikkaa &amp;quot;Kirjaudu sisään&amp;quot;.&lt;br /&gt;
* Selaimeen aukeaa sivu, jossa kysytään, että &#039;&#039;&#039;OneDrive-D tarvitsee oikeuden käyttää OneDrive infoa.&#039;&#039;&#039; Jatka napsauttamalla &amp;quot;Kyllä.&amp;quot;&lt;br /&gt;
* Selaimeen aukeaa hämäävästi tyhjä sivu. Kopio selaimen koko osoiterivi. Osoite voi olla esimerkiksi muotoa.&lt;br /&gt;
  https://login.live.com/oauth20_desktop.srf?code=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxxxx&amp;amp;=xxxx&lt;br /&gt;
* Komentorivin asetusohjelma kysyy URL-osoitetta. Anna juuri kopioimasi www-osoite selaimen osoiteriviltä ja paina enter.&lt;br /&gt;
* Lopuksi kysytään mihin kansioon tallennetaan OneDriven sisältö. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Käynnistä onedrive-d taustaprosessi seuraavasti: &lt;br /&gt;
 &lt;br /&gt;
 onedrive-d start&lt;br /&gt;
&lt;br /&gt;
Huomaa!!! että taustaprosessi poistuu kun tietokone suljetaan. Lisää taustaprosessi käynnistettävien ohjelmien listaan tai [[Crontab]]iin.&lt;br /&gt;
&lt;br /&gt;
Voit tehdä esimerkiksi seuraavanlaisen [[Bash]]-skritpin käynnistettävien ohjelmien listaan.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 # Siirrytään oikeaan hakemistoon&lt;br /&gt;
 cd ~/onedrive-d&lt;br /&gt;
 # Käynnistetään oneDrive-d skripti&lt;br /&gt;
 python3 -m onedrive_d.od_main start&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esimerkkiohjelma voidaan tallentaa vaikka nimelle &amp;lt;tt&amp;gt;onedrive-start&amp;lt;/tt&amp;gt; ja sille voidaan antaa suoritusoikeudet komennolla:&lt;br /&gt;
&lt;br /&gt;
 chmod u+rx onedrive-start&lt;br /&gt;
&lt;br /&gt;
Lisää taustaprosessi käynnistettävien ohjelmien (Käynnistettävät ohjelmat) listalle tai [[Crontab]]iin.&lt;br /&gt;
&lt;br /&gt;
Tarkista käynnissä oleva prosessi seuraavalla komentorivi komennolla:&lt;br /&gt;
 python3 -m onedrive_d.od_main status&lt;br /&gt;
&lt;br /&gt;
Käynnissä oleva prosessi näyttää tältä:&lt;br /&gt;
 Loading configuration ... OK&lt;br /&gt;
 od_main.py -- pid: 9286, status: sleeping, uptime: 25m, %cpu: 0.0, %mem: 0.7&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [https://github.com/xybu/onedrive-d Lähdekoodi Githubista]&lt;br /&gt;
* [http://www.howtogeek.com/208437/how-to-sync-files-with-your-onedrive-account-on-ubuntu-14.04/ How to Sync Files with Your OneDrive Account on Ubuntu 14.04]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Pilvipalvelut}}&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Pilvitallennusohjelmat]]&lt;/div&gt;</summary>
		<author><name>Karilindgren</name></author>
	</entry>
</feed>