Ero sivun ”Git” versioiden välillä
Siirry navigaatioon
Siirry hakuun
Uudet osiot: muutosten allekirjoittaminen ja allekirjoitusten tarkistaminen
Ei muokkausyhteenvetoa |
(Uudet osiot: muutosten allekirjoittaminen ja allekirjoitusten tarkistaminen) |
||
(25 välissä olevaa versiota 8 käyttäjän tekeminä ei näytetä) | |||
Rivi 3: | Rivi 3: | ||
| kuva=[[Kuva:Git-logo.svg]] | | kuva=[[Kuva:Git-logo.svg]] | ||
| kuvateksti= | | kuvateksti= | ||
| lisenssi=[[GPL]] | | lisenssi=[[GPL]]v2 | ||
| käyttöliittymä=teksti | | käyttöliittymä=teksti | ||
| kotisivu=[ | | kotisivu=[https://git-scm.com/ git-scm.com] | ||
Git on hajautettu [[versionhallintajärjestelmä]], jonka kehityksen aloitti [[Linus Torvalds]] Linuxin [[ydin|ytimen]] kehitystä varten. Se korvasi ytimen kehityksessä suljetun lähdekoodin BitKeeperin. | | 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 == | == Perusperiaate == | ||
Rivi 20: | 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>): | ||
<syntaxhighlight lang="C"> | |||
#include <stdio.h> | |||
void main() { | |||
printf("Hei, maailma\n"); | |||
} | |||
</syntaxhighlight> | |||
README: | README: | ||
Esimerkkiprojekti, jonka avulla opetellaan Gitin käyttöä | Esimerkkiprojekti, jonka avulla opetellaan Gitin käyttöä | ||
Rivi 55: | 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 | 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> | |||
<syntaxhighlight lang="C"> | |||
#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 | } | ||
</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ä | Nyt tehdyt, vielä commit'oimattomat muutokset nähdään komennolla | ||
$ git status | $ git status | ||
# On branch master | # On branch master | ||
Rivi 196: | Rivi 208: | ||
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": | 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 | 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 commit versiolle 2.0: | Tagitetaan vastaavasti uusin commit versiolle 2.0: | ||
Rivi 266: | Rivi 278: | ||
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. | 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 == | == Katso myös == | ||
Rivi 272: | Rivi 352: | ||
*[[CVS]] | *[[CVS]] | ||
*[[Darcs]] | *[[Darcs]] | ||
*[[Gitea]] | |||
*[[GitHub]] | |||
*[[GitLab]] | |||
*[[Mercurial]] | *[[Mercurial]] | ||
*[[Subversion]] | *[[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 | * [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]] |