Ero sivun ”Git” versioiden välillä

Siirry navigaatioon Siirry hakuun
10 767 merkkiä lisätty ,  8. helmikuuta 2022
Uudet osiot: muutosten allekirjoittaminen ja allekirjoitusten tarkistaminen
p (→‎Tagit ja tunnisteet: vähän vielä)
(Uudet osiot: muutosten allekirjoittaminen ja allekirjoitusten tarkistaminen)
 
(37 välissä olevaa versiota 12 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
Git on hajautettu [[versionhallintajärjestelmä]], jonka kehityksen aloitti Linus Torvalds Linuxin [[ydin|ytimen]] kehitystä varten. Se korvasi ytimen kehityksessä suljetun lähdekoodin BitKeeperin.
{{Ohjelma
| nimi=Git
| kuva=[[Kuva:Git-logo.svg]]
| kuvateksti=
| lisenssi=[[GPL]]v2
| käyttöliittymä=teksti
| kotisivu=[https://git-scm.com/ git-scm.com]
| lähdekoodi=[https://github.com/git/git github.com/git/git]
}}
 
'''Git''' on hajautettu [[versionhallintajärjestelmä]], jonka kehityksen aloitti [[Linus Torvalds]] Linuxin [[ydin|ytimen]] kehitystä varten. Se korvasi ytimen kehityksessä suljetun lähdekoodin BitKeeperin.
 
== Perusperiaate ==
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. ''merge'') oman kehityshaaransa (engl. ''branch'') projektin pääasialliseen versionhallintajärjestelmään.
 
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.
 
Kehitystyö tapahtuu käytännössä viemällä muutoksia versionhallintaan eli tekemällä ns. ''commiteja'' (engl. ''commit'', 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.  


== Käyttö ==
== Käyttö ==
Rivi 6: Rivi 23:
Luodaan ensin muutama tiedosto projektia varten:
Luodaan ensin muutama tiedosto projektia varten:
hello.c ([[C]]-kielinen lähdekoodi, ohjelma tulostaa ruudulle yhden rivin tekstiä, kääntyy komennolla <tt>[[gcc]] hello.c -o hello</tt>):
hello.c ([[C]]-kielinen lähdekoodi, ohjelma tulostaa ruudulle yhden rivin tekstiä, kääntyy komennolla <tt>[[gcc]] hello.c -o hello</tt>):
#include <stdio.h>
<syntaxhighlight lang="C">
void main() {
#include <stdio.h>
  printf("Hei, maailma\n");
void main() {
}
    printf("Hei, maailma\n");
}
</syntaxhighlight>
README:
README:
  Esimerkkiprojekti, jonka avulla opetellaan Gitin käyttöä
  Esimerkkiprojekti, jonka avulla opetellaan Gitin käyttöä
Rivi 41: Rivi 60:
  $ git config --global user.name "Oma Nimi"
  $ git config --global user.name "Oma Nimi"
  $ git config --global user.email oma@sähköposti.osoite
  $ git config --global user.email oma@sähköposti.osoite
Edellisen muokkausyhteysvedon voi tarvittaessa kirjoittaa uusiksi komennolla
$ git commit --amend
Tämä, kuten muutkin aiempiin committeihin puuttuvat komennot muuttavat kyseisten (ja niitä seuraavien) committien tiivisteitä, minkä johdosta ne ovat gitille eri committeja kuin aiemmin. Se taas aiheuttaa manuaalisia sopeuttamistarpeita muille saman repositorion käyttäjille. Tästä syystä historiaa on viisainta olla muuttamatta niiltä osin, kuin se on jo levitetty muille käyttäjille. Tämä koskee amendin lisäksi esimerkiksi rebasea.


=== Tiedostojen muokkaaminen ===
=== Tiedostojen muokkaaminen ===
Nyt kun ensimmäinen commit on tehty voidaan alkaa kehittämään projektia jolloin näemme, miten Gitin kanssa toimitaan tiedostojen muuttuessa. Tiedosto <tt>hello.c</tt> ei ole standardin mukainen eikä se [[kääntäminen|käänny]] suoritettavaksi ohjelmaksi. Korjataan tämä ongelma muuttamalla tiedosto muotoon
Nyt kun ensimmäinen commit on tehty voidaan alkaa kehittämään projektia jolloin näemme, miten Gitin kanssa toimitaan tiedostojen muuttuessa. Tiedosto <tt>hello.c</tt> ei ole standardin mukainen eikä se [[kääntäminen|käänny]] suoritettavaksi ohjelmaksi. Korjataan tämä ongelma muuttamalla tiedosto <tt>hello.c</tt> muotoon
<tt>hello.c</tt>
#include <stdio.h>
int main() {
  printf("Hei, maailma\n");
  return 0;
}
Tässä on siis muutettu toisella rivillä esiintyvä <tt>void</tt> muotoon <tt>int</tt> ja lisätty toiseksiviimeinen rivi <tt>return 0;</tt>.


Nyt tehdyt, vielä committoimattomat muutokset nähdään komennolla  
<syntaxhighlight lang="C">
#include <stdio.h>
int main() {
    printf("Hei, maailma\n");
    return 0;
}
</syntaxhighlight>
Tässä on siis muutettu toisella rivillä esiintyvä <tt>void</tt> muotoon <tt>int</tt> ja lisätty loppuun rivi <tt>return 0;</tt>.
 
Nyt tehdyt, vielä commit'oimattomat muutokset nähdään komennolla  
  $ git status
  $ git status
  # On branch master
  # On branch master
Rivi 81: Rivi 107:


     Ensimmäinen commit
     Ensimmäinen commit
Lokissa näkyy jokaiselle commitille yksilöllinen tunnistenumero, commitin tekijä, kellonaika jolloin commit tehtiin ja committiin 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 <tt>-p</tt> Git näyttää myös versioiden välillä tapahtuneet [[diff|muutokset]]:
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 <tt>-p</tt> Git näyttää myös versioiden välillä tapahtuneet [[diff|muutokset]]:
  $ git log -p
  $ git log -p
  -- (osa tulosteesta poistettu)
  -- (osa tulosteesta poistettu)
Rivi 171: Rivi 197:
Nyt komennolla <tt>git log</tt> nähdään, että on kyseisen commitin yhteydessä on tapahtunut kahden haaran liittäminen, sillä commitin tunnistenumeron alapuolelle ilmestyy rivi
Nyt komennolla <tt>git log</tt> nähdään, että on kyseisen commitin yhteydessä on tapahtunut kahden haaran liittäminen, sillä commitin tunnistenumeron alapuolelle ilmestyy rivi
  Merge: 040c39d... b2626d8...
  Merge: 040c39d... b2626d8...
Numero- ja kirjainyhdistelmät viittaavat tiettyyn committeihin, joiden välillä liitos tapahtui (commitin tunnistenumerosta ilmoitetaan vain alkuosa jos se riittää yksilöimään commitin).
Numero- ja kirjainyhdistelmät viittaavat tiettyyn commiteihin, joiden välillä liitos tapahtui (commitin tunnistenumerosta ilmoitetaan vain alkuosa jos se riittää yksilöimään commitin).


Kun luomallamme kehityshaaralla ei enää ole käyttöä, se voidaan poistaa komennolla
Kun luomallamme kehityshaaralla ei enää ole käyttöä, se voidaan poistaa komennolla
Rivi 180: Rivi 206:


=== Tagit ja tunnisteet ===
=== Tagit ja tunnisteet ===
Kuten aiemmin huomattiin, jokaiseen committiin viitataan yksilöllisellä mystisellä kirjain- ja numeroyhdistelmällä. Tämän lisäksi Git mahdollistaa tiettyjen committien nimeämisen selväkielisillä tageilla. Esimerkiksi nimetään alussa ensimmäisen korjauksen jälkeen tehty commit nimelle "v1.0":
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 "v1.0":
  $ git tag v1.0 770194dd647d7f
  $ git tag v1.0 770194dd647d7f
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.
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.


Tagitetaan vastaavasti uusin committi versiolle 2.0:
Tagitetaan vastaavasti uusin commit versiolle 2.0:
  $ git tag v2.0  
  $ git tag v2.0  
Kaikki määritetyt tagit saa listattua komennolla  
Kaikki määritetyt tagit saa listattua komennolla  
Rivi 200: Rivi 226:
näyttäisi tagilla v1.0 merkityn tilan jälkeen tapahtuneet muutokset tagiin v2.0 asti.
näyttäisi tagilla v1.0 merkityn tilan jälkeen tapahtuneet muutokset tagiin v2.0 asti.


Edellä esiteltiin eräänlainen tagi HEAD joka viittaa nykyiseen committiin. Lisäksi voidaan käyttää merkintää ^, joka viittaa edeltäneeseen committiin (esim. HEAD^ tai v1.0^), esimerkiksi  
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  
  $ git diff v1.0^ v1.0
  $ git diff v1.0^ v1.0
näyttäisi erot commitin v1.0 ja sitä edeltäneen commitin välillä. Vastaavasti kaksi committia taaksepäin on ^^ jne. Yleisemmin voidaan käyttää merkintää ~numero, esimerkiksi HEAD~4 viittaa 4 committia taaksepäin. Liitetyille (''merge'') commiteille löytyy useampia edeltäjiä, jolloin niitä merkitään esimerkiksi HEAD^1 ja HEAD^2.
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 (''merge'') commiteille löytyy useampia edeltäjiä, jolloin niitä merkitään esimerkiksi HEAD^1 ja HEAD^2.


Yleisesti kaikissa tapauksissa, joissa Gitille annettaisiin commitin tunniste, voidaan käyttää myös kyseiselle commitille merkattua tagia. Katsotaan esimerkiksi millaiseen committiin asetettiin tagi v2.0:
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:
  $ git show v2.0
  $ git show v2.0


Tietyn tagin merkkaamasta commitista voidaan aloittaa myös uusi haara:  
Tietyn tagin merkkaamasta commitista voidaan aloittaa myös uusi haara:
 $ git branch vakaa v1.0
$ git branch vakaa v1.0
loisi uuden haaran nimellä vakaa siten, että haarasta löytyisi vain ne commitit, jotka on tehty tähän committiin mennessä.
 
loisi uuden haaran nimellä vakaa siten, että haarasta löytyisi vain ne commitit, jotka on tehty tähän commitiin mennessä.


Kehitsyhaaran sisällä voidaan palata tiettyyn vanhaan committiin komennolla <tt>git reset</tt>:
Kehityshaaran sisällä voidaan palata tiettyyn vanhaan commitiin komennolla <tt>git reset</tt>:
  $ git reset --hard v1.0
  $ git reset --hard v1.0
palaisi valitussa haarassa tagin v1.0 osoittamaan committiin. 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 <tt>git revert</tt>.
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 <tt>git revert</tt>.
 
=== git merge ja git rebase ===
 
=== Kopioiminen - Git yhteistyövälineenä ===
Versionhallinnasta on eniten iloa tilanteessa, jossa useampi kehittäjä toimii saman projektin kimpussa. Oletetaan nyt, että äskeinen kehitystyö tapahtui hakemistossa <tt>/home/osku/projekti</tt>. Nyt toinen samalla koneella oleva käyttäjä haluaa osallistua kehitystyöhön. Tällöin hän voi hakea versionhallinnasta kopion itselleen komennolla <tt>git clone</tt>:
$ git clone /home/osku/projekti hello
Komento kopioi hakemistosta <tt>/home/osku/projekti</tt> löytyvän projektin Git-versionhallinnasta kopion hakemistoon <tt>hello</tt>. Jos kehityshaaraa ei erikseen mainita haetaan <tt>master</tt>-haara.
 
Kun toinen käyttäjä (tässä Elisa) on tehnyt haluamiaan muutoksia projektiin (commitoinut ne versionhallintaan hakemistossa <tt>/home/elisa/hello</tt>) hän voi ilmoittaa siitä Oskulle, joka voi hakea muutokset omaan kehityshaaraansa komennolla
$ git pull /home/elisa/hello master
Komento hakee parametrina annetusta hakemistosta löytyvästä versionhallinnasta <tt>master</tt>-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 <tt>git pull</tt> tekee muutoksista commitin nykyiseen haaraan.
 
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 <tt>git fetch</tt>, eli Osku voisi ajaa komennon
$ git fetch /home/elisa/hello master
eli <tt>git fetch</tt> -komennolle annetaan samat parametrit kuin <tt>git pull</tt> -komennolle.
 
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 <tt>FETCH_HEAD</tt>, jolloin nykyisen tilanteen (<tt>HEAD</tt>) ja haetun tilanteen erot nähtäisiin komennolla
$ git log -p HEAD..FETCH_HEAD
Jos muutokset näyttävät hyviltä, ne voidaan commitoida liittämällä <tt>FETCH_HEAD</tt>-haara aktiivisena olevaan haaraan komennolla
$ git merge FETCH_HEAD
 
Etäkoneilla sijaitseviin kehityshaaroihin voidaan luoda linkkejä komennolla <tt>git remote</tt>. Esimerkiksi Osku voisi luoda Elisan haaraan linkin <tt>elisa</tt> komennolla
$ git remote add elisa /home/elisa/hello
Tämän jälkeen muutokset voitaisiin hakea helposti komennolla
$ git fetch elisa
joka hakisi kaikkien Elisan kehityshaarojen sisällöt. Näihin haaroihin voitaisiin nyt viitata muodossa <tt>elisa/haaran_nimi</tt>, esimerkiksi <tt>elisa/master</tt>. Esimerkiksi erot nähtäisiin komennolla
$ git log -p HEAD..elisa/master
Ja haaran liittäminen nykyiseen haaraan onnistuisi komennolla
$ git merge elisa/master
Yksittäisen haaran (esim. <tt>master</tt>) voi hakea komennolla
$ git fetch elisa master
jolloin haettuun haaraan voi viitata tagilla <tt>FETCH_HEAD</tt>.
 
Elisa voi myös suoraan päivittää kehityshaaraansa Oskun haaraan tehdyt muutokset suoraan komennolla
$ git pull
Komennolle ei tarvitse antaa parametreja sillä <tt>git clone</tt> 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 <tt>git merge</tt>:n kanssa huomattiin. Kun ristiriidat on korjattu viedään muutokset versionhallintaan tavalliseen tapaan <tt>git commit -a</tt> -komennolla.
 
Voit luoda projektia varten palvelimelle oman tietovaraston (engl. ''repository'') 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. ''bare'') tietovarasto luodaan kirjautumalla ensin palvelimelle ja antamalla esimerkiksi komennot
$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git --bare init
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
$ git remote add origin ssh://user@gitserver/opt/git/project.git
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
$ git push origin master
Kun projekti on siirretty git push komennolla palvelimelle, voivat muut kehittäjät liittyä siihen normaalisti komennolla
$ git clone ssh://user@gitserver/opt/git/project.git
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.
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ä).
 
Paljas repository toimii myös projektin varmuuskopiona, mikäli oma työhakemistosi syystä tai toisesta tuhoutuu.
 
=== Muutosten allekirjoittaminen ===
 
Kuten osiosta versionhallinnan käyttöönotto mahdollisesti huomattiin, Git ei tarkista sille annettua nimeä ja sähköpostia. Mikäli committin tai tagin tunnistaminen on tärkeää, se on allekirjoitettava joko [[GnuPG|GPG-avaimella]] tai alkaen Gitin versiosta 2.34 [[SSH#Tunnistaminen_avainparilla|SSH-avaimella]].
 
Ensin kerrotaan gitille allekirjoitusavain, GPG:n tapauksessa tämä on avaimen pitkä ID, SSH:lla tämä on julkinen avain tai polku siihen, esimerkiksi
$ git config --global user.signingkey ~/.ssh/id_ed25519.pub
 
SSH:n tapauksessa gitille täytyy myös kertoa SSH:n olevan käytössä
$ git config --global gpg.format ssh
 
Nyt committia tai tagia luodessa voidaan määrittää allekirjoitus <tt>-S</tt> -lipulla
$ git commit -S -a -m "Luotiin allekirjoitettu commit"
$ git tag -S v2.1
 
Gitin voi myös määrittää allekirjoittamaan commitit ja tagit automaattisesti:
$ git config --global git commit.gpgsign true
$ git config --global tag.forceSignAnnotated true
$ git config --global git push.gpgsign if-asked
 
==== Allekirjoitusten tarkistaminen ====
 
Gitillä on monta komentoa allekirjoitusten tarkistamiseksi, esimerkiksi aiemmin mainittu <tt>git log</tt>, jonka voi käskeä näyttämään allekirjoituksen:
$ git log --show-signature
 
[[GnuPG|GPGtä]] käytettäessä tämä noudattaa sen luottamusmallia, mutta SSH:lle on tehtävä oma <tt>authorized_signers</tt> -tiedostonsa ja kerrottava git:ille mistä se löytyy. Tämä sisältää käyttäjän
sähköposti-osoitteen (tai osan sitä, <tt>*</tt> merkki sallii kaiken, julkisen avaimen ja mahdollisesti kommentin.
 
Lisätään esimerkiksi Oskun julkinen avain:
 
$ echo "osku@linux.fi ssh-ed25519 pitkaMerkkijonoJossaOnVahanKaikkeaMuutaKuinAakkosia" >> ~/.ssh/authorized_signatures
 
Kerrotaan Gitille mistä tämä tiedosto löytyy
 
$ git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
 
Nyt git kertoo
 
$ git log
commit 9c5cc04010c91cf560e097c69e5c53f6a51d30ef
Good "git" signature for osku@linux.fi with AVAIMENTYYPPI key SHA256:avaimenSormenjälkiSHA256Tiivisteenä
Author: Osku Ohjelmoija <osku@linux.fi>
Date:  Fri Oct 23 23:39:56 2009 +0300
 
== Graafisia Git-käyttöliittymiä ==
* [[SmartGit]] [http://www.syntevo.com/smartgit/] - kaupallinen, ilmainen ei kaupalliseen tarkoitukseen.
* [[git-cola]] [http://git-cola.github.io/]
* [[GitEye]] [http://www.collab.net/products/giteye]
* [[Giggle]] [https://wiki.gnome.org/Apps/giggle/]
* [[gitg]] [https://wiki.gnome.org/Apps/Gitg/]
* [[GitKraken]] [http://www.gitkraken.com/]
* [[GitForce]] [https://sites.google.com/site/gitforcetool/home] ([[Mono]])
* [[tig]] [http://jonas.nitro.dk/tig/]
* [[QGit]] [http://digilander.libero.it/mcostalba/]
 
== Katso myös ==
*[[Bazaar]]
*[[CVS]]
*[[Darcs]]
*[[Gitea]]
*[[GitHub]]
*[[GitLab]]
*[[Mercurial]]
*[[Subversion]]


==Aiheesta muualla==
==Aiheesta muualla==
*[http://git-scm.com/ Gitin kotisivu]
* [http://git-scm.com/ Gitin kotisivu]
*[http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html Git tutorial]
* [http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html Git tutorial]
*[[wikipedia:Git (software)|Git englanninkielisessä Wikipediassa]]
* [[wikipedia:Git (software)|Git englanninkielisessä Wikipediassa]]
* [http://progit.org/book/ Pro Git, professional version control] -ekirja
* [https://www.codecademy.com/learn/learn-git www.codecademy.com/learn/learn-git] - Codecademyn Git-kurssi


[[Luokka:Kehitystyökalut]]
[[Luokka:Kehitystyökalut]]
143

muokkausta

Navigointivalikko