Hauke Zühl
7 years ago
2 changed files with 627 additions and 0 deletions
@ -0,0 +1,622 @@
|
||||
\documentclass[german,a4paper]{report} |
||||
|
||||
\usepackage[german]{babel} |
||||
\usepackage{graphicx} % Benoetigt, um Grafiken einzubinden |
||||
\usepackage{longtable} |
||||
\usepackage{float} |
||||
\usepackage{german} |
||||
\usepackage{ae} |
||||
|
||||
\usepackage[latin1]{inputenc} % Umlaute und dt. Zeichen Kodieren |
||||
|
||||
% ae.sty verwenden! |
||||
\usepackage[T1]{fontenc} % ec* Schriftarten verwenden |
||||
|
||||
\usepackage{times} % Times-Schriftart (pdf) |
||||
\usepackage{calc} |
||||
|
||||
\begin{document} |
||||
|
||||
\title{GIT - Eine Einf"uhrung} |
||||
\author{Hauke Z"uhl <hzuehl@hauke-zuehl.de>} |
||||
|
||||
\maketitle |
||||
|
||||
\tableofcontents |
||||
|
||||
\chapter{Was ist GIT?} |
||||
GIT ist ein sogenanntes ``Versionskontrollsystem'' von Dateien in Projekten, das heisst, |
||||
man kann die Ver"anderungen, die an Dateien im Laufe der Zeit durchgef"uhrt werden, |
||||
nachvollziehen. Dabei werden nicht nur Zeitstempel gespeichert, sondern auch welcher |
||||
Benutzer die "Anderungen durchgef"uhrt hat. Dies ist dann ein Versionsstand eines |
||||
Projektes. |
||||
|
||||
GIT speichert also nur Ver"anderungen. Gut, bei sog. ``Bin"ardateien'', also zum Beispiel |
||||
LibreOffice-Dokumenten, geht das nicht, aber das ist ein anderes Thema. Immerhin kann |
||||
man aber auch LO-Dokumente speichern, wie man an und f"ur sich alles, was eine Datei ist, |
||||
in GIT gespeichert werden kann. |
||||
|
||||
Was GIT besonders macht, ist die Tatsache, dass es dezentral ist. Das bedeutet, dass jeder, |
||||
der ein Projekt aus GIT herunterl"adt (man sagt auch ``auschecken'' dazu) den kompletten |
||||
Versionsverlauf auf seinem Rechner als lokale Kopie verliegen hat. |
||||
|
||||
Im ersten Moment mag das ein Nachteil sein, denn man will ja nicht die Dateiversionen |
||||
haben, die Max Mustermann vor 10 Jahren in GIT hochgeladen hat, aber keine Sorge, GIT |
||||
arbeitet recht platzsparend. |
||||
|
||||
Der Vorteil dieser Methode ist, dass man dadurch mindestens eine Sicherheitskopie auf |
||||
einem Rechner hat. |
||||
Arbeiten mehrere Leute an einem Projekt, kommen so diverse Sicherheitskopien zustande. |
||||
|
||||
Diese Einf"uhrung soll mit einfachen Worten und Beispielen an GIT heranf"uhren. Ich |
||||
konzentriere mich dabei auf die Konsole, denn nur auf der Konsole kann man meiner Meinung |
||||
nach die Arbeitsweise von GIT verinnerlichen. Grafische Clients kann man sp"ater immer |
||||
noch einsetzen! |
||||
|
||||
\chapter{Fachbegriffe} |
||||
Ohne Fachbegriffe, die "uberwiegend in Englisch sind, kommt man leider bei der Benutzung |
||||
und der Erkl"arung von GIT nicht aus, deshalb hier die grundlegenden Fachbegriffe: |
||||
|
||||
``Repository'': |
||||
|
||||
Man kann es als ``Projekt'' bezeichnen. Im Repository (verk"urzt auch nur ``Repo'' genannt) |
||||
findet man die Verzeichnnisse und Dateien des Projektes wieder. |
||||
|
||||
``Einchecken'': |
||||
|
||||
Neue Dateien, die zum Repo hinzugef"ugt werden, werden ``eingecheckt'', aber wenn auch |
||||
"Anderungen an Dateien dem Repo hinzugef"ugt werden, spricht man von ``einchecken''. Auch |
||||
``commit'' genannt. |
||||
|
||||
``Auschecken'' / ``Klonen'': |
||||
|
||||
Unter ``Auschecken'' versteht man umgangssprachlich(!) das Herunterladen eines GIT-Repositories. |
||||
Korrekterweise bedeutet ``auschecken'', dass sog. ``Zweige'' auscheckt. Der Begriff des Zweiges |
||||
wird sp"ater genauer erl"autert. An dieser Stelle sei nur sovierl dazu gesagt, dass man mit Zweigen |
||||
Projekte weiter unterteilen kann. |
||||
|
||||
Wenn man ein Repository klont, dann bezieht sich das auf das GIT-Kommando, um ein Repository |
||||
von einem GIT-Server herunterzuladen. |
||||
|
||||
``Branch'': |
||||
|
||||
Ein ``Branch'' ist ein Zweig eines Projektes. Dazu sp"ater mehr. |
||||
|
||||
``Merge'': |
||||
|
||||
Das Zusammenf"uhren zweier Zweige wird als ``merge'' bezeichnet. |
||||
|
||||
\chapter{Erste Schritte mit GIT} |
||||
|
||||
Um mit GIT zu arbeiten, braucht man erst einmal das Programm.\\ |
||||
Unter Linux kann man sich GIT mit Hilfe des distributionseigenen Installationsprogrammes |
||||
installieren. Unter Debian oder Ubuntu zum Beispiel per \textit{aptitude install git}, bzw. per |
||||
\textit{apt-get install git}. RedHat oder CentOS liefert GIT per \textit{yum install git} |
||||
auf die Platte. Und unter MacOS d"urfte \textit{brew install git} zum Erfolg f"uhren. Mangels |
||||
MAC kann ich das nicht pr"ufen.\\ |
||||
Ein Tip: Vergiss erst einmal grafische Clients, das ist Bl"odsinn, denn damit lernt man nicht |
||||
mit GIT umzugehen und zu verstehen! Denk auch nicht an irgendwelche Server oder gar an GitHub! |
||||
Wir fangen einfach an und das ist lokal bei dir auf deinem Computer.\\ |
||||
\\ |
||||
Los geht's!\\ |
||||
\\ |
||||
"Offne eine Konsole deiner Wahl. Bash, zsh, ksh, egal. Irgendwas, wo du mit Hilfe deiner |
||||
Tastatur deinem Rechner Kommandos senden kannst\footnote{Manche Shells ben"otigen den |
||||
Befehl \textit{rehash}, wenn neue Software hinzugekommen ist}.\\ |
||||
Es empfiehlt sich, f"ur Git-Repos ein eigenes Verzeichnis anzulegen. Zum Beispiel \textit{git} |
||||
oder \textit{projekte}, oder, oder, oder.\\ |
||||
Ich selbst verwende \textit{git}.\\ |
||||
\\ |
||||
Also: \textit{mkdir git}, dann \textit{cd git}.\\ |
||||
\\ |
||||
Jetzt legen wir ein Verzeichnis f"ur unser erstes Projekt an. Lass uns das Projekt ``Welt'' |
||||
nennen: \textit{mkdir Welt}. Per \textit{cd Welt} wechseln wir in das neue Verzeichnis.\\ |
||||
Jetzt wird es ernst, wir erzeugen unser erstes GIT-Repository: \textit{git init}. Yes!\\ |
||||
Wenn man nun per \textit{ls -oha} nachguckt, sollte das Verzeichnis so aussehen: |
||||
\begin{verbatim} |
||||
insgesamt 12K |
||||
drwxrwxr-x 3 hauke 4,0K Mar 22 13:03 . |
||||
drwxrwxr-x 18 hauke 4,0K Mar 22 13:03 .. |
||||
drwxrwxr-x 7 hauke 4,0K Mar 22 13:03 .git |
||||
\end{verbatim} |
||||
Das Verzeichnis .git ist ein verstecktes Verzeichnis, dort stehen Informationen f"ur GIT in |
||||
diversen Dateien.\\ |
||||
\\ |
||||
Wir k"onnen nun loslegen, Dateien anzulegen. Fangen wir erst einmal einfach an und legen |
||||
eine Datei LIESMICH an. Ich verwende an dieser Stelle den Editor vi, wenn du aber einen |
||||
anderen Editor verwenden magst, nutze diesen; es geht nur darum, Text in eine einfache |
||||
Datei zu schreiben (Officeprogramme scheiden also aus!).\\ |
||||
Der Inhalt der Datei soll ganz einfach sein: |
||||
\begin{verbatim} |
||||
Projekt Welt |
||||
\end{verbatim} |
||||
Abspeichern nicht vergessen!\\ |
||||
Jetzt sieht unser Verzeichnis (\textit{ls -oha}) so aus: |
||||
\begin{verbatim} |
||||
insgesamt 16K |
||||
drwxrwxr-x 3 hauke 4,0K Mar 22 13:20 . |
||||
drwxrwxr-x 18 hauke 4,0K Mar 22 13:03 .. |
||||
drwxrwxr-x 7 hauke 4,0K Mar 22 13:06 .git |
||||
-rw-rw-r-- 1 hauke 14 Mar 22 13:20 LIESMICH |
||||
\end{verbatim} |
||||
Jetzt fragen wir mal GIT, was es davon h"alt, dass in dem Repository eine Datei neu |
||||
angelegt wurde. Dazu geben wir \textit{git status} ein. Das Ergebnis sollte in etwa so aussehen: |
||||
\begin{verbatim} |
||||
Auf Branch master |
||||
|
||||
Initialer Commit |
||||
|
||||
Unversionierte Dateien: |
||||
(benutzen Sie "git add <Datei>...", um die Aenderungen |
||||
zum Commit vorzumerken) |
||||
|
||||
LIESMICH |
||||
|
||||
nichts zum Commit vorgemerkt, aber es gibt unversionierte |
||||
Dateien |
||||
(benutzen Sie "git add" zum Versionieren) |
||||
\end{verbatim} |
||||
GIT gibt uns einige Informationen:\\ |
||||
Wir sind auf dem Branch (Zweig) ``master''. Dazu - wie gesagt - sp"ater mehr.\\ |
||||
Unser erstes Einchecken (commit) steht bevor; es ist der initiale Commit.\\ |
||||
Git hat festgestellt, dass es Dateien gibt, "uber die es nichts weiss. Unversionierte |
||||
Dateien also. Die Datei(en) wird/werden aufgez"ahlt und es gibt - zumindest bei mir - |
||||
einen hilfreichen Tip, was man machen sollte (\textit{git add ...}).\\ |
||||
Also, ran an den Speck und die Datei per \textit{git add LIESMICH} zum Einchecken vormerken. |
||||
Ein \textit{git status} sollte nun folgendes ergeben: |
||||
\begin{verbatim} |
||||
Auf Branch master |
||||
|
||||
Initialer Commit |
||||
|
||||
zum Commit vorgemerkte Aenderungen: |
||||
(benutzen Sie "git rm --cached <Datei>..." zum |
||||
Entfernen aus der Staging-Area) |
||||
|
||||
new file: LIESMICH |
||||
\end{verbatim} |
||||
Prima, das sieht schon anders, besser aus!\\ |
||||
Jetzt kann ich nat"urlich weitere Dateien anlegen und per \textit{git add ...} vormerken, |
||||
oder ich kann diese eine Datei in das Repository "ubernehmen, den ``commit'' also |
||||
durchf"uhren. \textit{git commit LIESMICH} f"uhrt den Commit auf die Datei LIESMICH aus. |
||||
Es sollte sich ein Editorfenster "offnen, denn GIT bietet dir jetzt an, in einem |
||||
Kommentar kurz zu erl"autern, |
||||
was du gemacht hast. Dieser Text taucht dann in der Historie des Projektes sp"ater auf. |
||||
Beispiel: ``LIESMICH angelegt''. Kurz und knackig sollte der Kommentar sein, aber auch |
||||
so geschrieben, dass du sp"ater noch weisst, was du seinerzeit gemacht hast.\\ |
||||
GIT gibt dir auch hier wieder eine R"uckmeldung: |
||||
\begin{verbatim} |
||||
[master (Basis-Commit) 19a30b3] LIESMICH angelegt |
||||
1 file changed, 2 insertions(+) |
||||
create mode 100644 LIESMICH |
||||
\end{verbatim} |
||||
In der ersten Zeile wird der Branch angezigt, der Commit-Hash (ist auch an dieser Stelle |
||||
nicht weiter wichtig, ich erw"ahne es aber dennoch, der "Ubersicht halber) und dein |
||||
Kommentar. In der zweite Zeile wird die Anzahl der ver"anderten Dateien, sowie hinzugekommene |
||||
Zeilen (insertions) und (hier noch nicht sichtbar) die Anzahl der entfernten Zeilen. |
||||
In der dritten Zeile stehen dann noch Information bzgl. des Modus der Datei (create), die |
||||
Dateirechte und der Dateiname.\\ |
||||
Super, damit ist die erste Version des Projektes ``Welt'' im GIT-Repository angekommen. |
||||
|
||||
Am Beispiel einer weiteren Datei zeige ich dir nun auch erste ``Vereinfachungen'', denn mal |
||||
angenommen, du hast auf einem Satz mehrere Dutzend Dateien neu in deinem Projekt, dann |
||||
wirst du nicht per \textit{git add datei1}, \textit{git add datei2}, usw. jede einzelne |
||||
Datei vormerken. Die Sache ginge ja dann so sp"ater beim commit weiter. Also, eher wird |
||||
der BER fertig, als dass du mit deinem Projekt weiterkommst!\\ |
||||
Als Beispiel gibt es jetzt das Shellskript ``welt.sh'': |
||||
\begin{verbatim} |
||||
#!/bin/sh |
||||
|
||||
echo "Hallo Welt" |
||||
\end{verbatim} |
||||
Jetzt kommt das ``add'' mal etwas anders: \textit{git add .} Du hast den Punkt hinter ``add'' |
||||
bemerkt? Gut! Damit hast du jetzt alle neuen Dateien in diesem Verzeichnis (Unterverzeichnisse, |
||||
sofern vorhanden mit eingeschlossen) zum einchecken vorgemerkt. \textit{git status} wird |
||||
dir das anzeigen.\\ |
||||
Jetzt das tats"achliche Einchecken in das Repository und da verrate ich dir den n"achsten |
||||
Trick: Den Kommentar direkt angeben, ohne dass ein Editor erst "offnet: \textit{git commit -a |
||||
-m 'Projekt erweitert, neue Dateien hinzugefuegt'}.\\ |
||||
Das erkl"are ich mal genauer:\\ |
||||
-a bedeutet, dass alle (-a = all) Dateien, die vorher per \textit{git add .}, bzw. per |
||||
\textit{git add dateiname} vorgemerkt wurden nun in das Repo "ubernommen werden sollen. Du siehst: |
||||
Man kann auch erst einmal ``sammeln''.\\ |
||||
-m bedeutet, dass nun ein Kommentar kommt (-m = message). Der Text sollte in Anf"uhrungszeichen |
||||
stehen, sonst macht die Shell "Arger.\\ |
||||
Und damit hast du bereits die ersten Schritte gemacht.\\ |
||||
Hier noch mal zusammengefasst die Schritte, die im Wesentlichen immer wieder wiederholt |
||||
werden, nachdem man das Projektverzeichnis angelegt und GIT initialisiert hat: |
||||
\begin{itemize} |
||||
\item Datei anlegen |
||||
\item git add |
||||
\item git commit |
||||
\item Datei anlegen |
||||
\item git add |
||||
\item git commit |
||||
\item ... |
||||
\end{itemize} |
||||
Oder aber man macht: |
||||
\begin{itemize} |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item git add . |
||||
\item git commit -a |
||||
\item Datei anlegen |
||||
\item ... |
||||
\end{itemize} |
||||
|
||||
\chapter{GIT konfigurieren} |
||||
Oftmals sehen die Logs von GIT ziemlich d"amllich aus, was meistens daran liegt, dass |
||||
die Benutzer ihr GIT nicht ordentlich konfiguriert haben. F"ur eine vern"unftige |
||||
Konfiguration bedarf es des korrekten Namens und der Mailadresse.\\ |
||||
Dies geschieht per \textit{git config ...}. Beispiel: |
||||
\textit{git config user.name 'Max Mustermann'}, um den Namen festzulegen und |
||||
\textit{git config user.email 'mmuster@exampel.kom} f"ur die Mailadresse.\\ |
||||
Damit sind Name und Mailadresse f"ur dieses eine Projekt festgelegt. Damit das |
||||
f"ur alle GIT-Repositories gilt, f"ugt man die Option \textit{--global} hinzu, also |
||||
\textit{git config --global user.name 'Max Mustermann'} und |
||||
\textit{git config --global user.email 'mmuster@exampel.kom}.\\ |
||||
Man kann nat"urlich noch eine Menge mehr konfigurieren, aber hier geht es um die Grundlagen. |
||||
|
||||
\chapter{Zweige} |
||||
Bisher haben wir uns geradlinig auf dem Zeitstrahl bewegt, aber wenn man im Team an |
||||
einem gro"sen Projekt arbeitet, dann erledigt jeder, bzw. jede entsprechende Unteraufgaben. |
||||
Um solche Unteraufgaben zu organisieren, nutzt man in Versionskontrollsystemen sog. |
||||
``Zweige''. Leider kann man das nicht direkt mit einem Baum vergleichen, denn zwar |
||||
gibt es sowohl beim Baum als auch in GIT einen Hauptzweig/Stamm und (mehr oder weniger) |
||||
viele Zweige, bei einem Baum werden die Zweige aber nicht wieder zum Stamm zur"uckgef"uhrt. |
||||
Bei Versionskontrollsystemen jedoch werden Zweige fr"uher oder sp"ater wieder in den Hauptzweig |
||||
"uberf"uhrt.\\ |
||||
\\ |
||||
Am Anfang befindet man sich immer auf dem Hauptzweig, dem sog. ``Masterbranch''. Du hast das |
||||
bereits in diversen Meldungen von GIT gesehen.\\ |
||||
Das sieht dann so aus: |
||||
\begin{verbatim} |
||||
master A--B--C--D--E--F |
||||
\end{verbatim} |
||||
Um nun einen neuen Zweig zu erzeugen, gibt man |
||||
\textit{git checkout -b <Zweigname>}\footnote{-b bedeutet, dass der Zweig erzeugt und sofort |
||||
ausgecheckt wird, d.h. man befindet sich sofort auf diesem Zweig} ein. |
||||
Angenommen, ich will als Unteraufgabe zum Projekt ``Welt'' ein ``Hallo'' programmieren, |
||||
dann erzeuge ich den Zweig ``Hallo'' per \textit{git checkout -b hallo}. Wir sind nun im Zweig |
||||
``hallo''. Um das zu "uberpr"ufen gibt es \textit{git branch}: |
||||
\begin{verbatim} |
||||
* hallo |
||||
master |
||||
\end{verbatim} |
||||
Der kleine Stern in der ersten Spalte zeigt den Zweig an, in dem wir uns aktuell befinden.\\ |
||||
Will ich auf den Zwei ``master'' zur"uckwechslen, gebe ich \textit{git checkout master} ein. |
||||
Wichtig: Hier wird kein ``-b'' verwendet, da es den Zweig ``master'' bereits gibt!\\ |
||||
\\ |
||||
Bist du also im Zweig ``hallo'', gehst du wieder wie immer vor: Datei(en) anlegen, vormerken, |
||||
einchecken.\\ |
||||
Das sieht dann so aus: |
||||
\begin{verbatim} |
||||
master A--B--C--D--E--F |
||||
\ |
||||
hallo G--H--I--J--K |
||||
\end{verbatim} |
||||
Das sollte soweit klar sein, aber irgendwann kommt der Punkt, an dem du den |
||||
Zweig ``hallo'' wieder in den Zweig ``master'' zur"uckf"uhren willst/musst.\\ |
||||
Dazu wechselst du erst einmal in den Zweig ``master'' zur"uck. Nun sagst du GIT, dass du den |
||||
Zweig ``hallo'' in den Masterbranch ``mergen'' willst: \textit{git merge hallo}. |
||||
Es "offnet sich wieder ein Editor, indem (meistens) bereits eine Information vorgegeben ist: |
||||
\begin{verbatim} |
||||
Merge branch 'hallo' |
||||
\end{verbatim} |
||||
Hinweis: Es muss(!) ein Kommentar angegeben werden, und sei es nur der vorgegebene |
||||
Standardkommentar!\\ |
||||
Wenn alles gutgegangen ist, sind nun alle Dateien des ``hallo''-Zweiges im Masterbranch.\\ |
||||
Das sieht dann so aus: |
||||
\begin{verbatim} |
||||
master A--B--C--D--E--F---L |
||||
\ / |
||||
hallo G--H--I--J--K |
||||
\end{verbatim} |
||||
In der Softwareentwicklung wird generell mit mehreren Zweigen gearbeitet, um zu verhindern, |
||||
dass ungetestete und in der Entwicklung befindliche Dateien Einzug in das fertige Projekt |
||||
nehmen. Es gibt daher einmal nat"urlich den Zweig ``master'', in dem das fertige Produkt |
||||
liegt, dann den Zweig ``develop'', in dem entwickelt wird und von dem weitere Zweige mit |
||||
weiteren Unteraufgaben abgeleitet werden. Wenn in ``develop'' alles ordentllich l"auft, dann |
||||
wird dieser in den Masterbranch gemergt und das Produkt wird ver"offentlicht. |
||||
Dadurch ergibt sich mit der Zeit eine durchaus recht breite Struktur, die aber dem Team |
||||
hilft, dass man sich nicht in die Quere kommt und letztendlich auch den "Uberblick |
||||
beh"alt. |
||||
|
||||
\chapter{Ein erstes Fazit} |
||||
Du solltest nun in der Lage sein, lokal auf deinem Rechner GIT-Repositories anzulegen, |
||||
Dateien hinzuzuf"ugen und diese auch in das Repo zu laden. Ausserdem solltest du dir |
||||
auch "uber Zweige klar sein und diese verwenden k"onnen, denn mit Hilfe von Zweigen wird |
||||
eine koordinierte Teamarbeit in einem Projekt erst m"oglich, aber auch wenn du alleine |
||||
an einem Projekt arbeitest, solltest du dir angew"ohnen, f"ur jede Teilaufgabe einen eigenen |
||||
Zweig anzulegen. |
||||
|
||||
\chapter{Dateien l"oschen und umbenennen} |
||||
Dateien anlegen kannst du jetzt schon fl"ussig, was aber ist, wenn du eine versionierte Datei |
||||
nicht mehr brauchst, oder wenn du dich beim Namen vertippt hast?\\ |
||||
Keine Panik, auch das geht mit GIT.\\ |
||||
Um eine Datei zu l"oschen, die im GIT-Repository ist, verwendest du den Removebefehl: |
||||
\textit{git rm <dateiname>}. Danach f"uhrst du ein \textit{git commit -m 'Kommentar'} aus und die |
||||
Datei ist von jetzt an nicht mehr vorhanden.\\ |
||||
Umbenennen geht ebenfalls sehr einfach: \textit{git mv <alter name> <neuer name>}. Auch danach |
||||
wieder ein \textit{git commit -m 'Kommentar'} und die Datei hat von nun an einen neuen |
||||
Namen.\\ |
||||
Moment mal, was soll das heissen ``von nun an''?\\ |
||||
Ganz einfach: Da man mit GIT auch "altere Versionen des Repositories auschecken kann, hat in |
||||
fr"uheren Versionen die Datei nat"urlich noch ihren alten Namen, bzw. ist im Repo noch |
||||
vorhanden! Wie man fr"uhere Versionen auscheckt, erkl"are ich aber sehr viel sp"ater. |
||||
|
||||
\chapter{GIT-Server} |
||||
|
||||
\section{Einstieg} |
||||
So, jetzt kommt der sog. ``heisse Scheiss''! GIT in Verwendung mit einem GIT-Server!\\ |
||||
Bisher hast du deine Repositories lokal auf deinem Rechner gehabt und das ist am Anfang |
||||
auch gut so, aber stelle dir vor, deine Festplatte zerlegt sich und dein echt tolles |
||||
Projekt wird damit geschreddert. Dann n"utzt dir auch GIT nichts mehr. Gut, du h"attest |
||||
regelm"a"sig eine Sicherung deines Repos auf DVD, CD, USB-Stick oder wo auch immer anlegen |
||||
k"onnenen, aber mal ehrlich, das ist nicht Sinn und Zweck von GIT. Ausserdem funktioniert |
||||
so die Teamarbeit an einem Projekt nicht. |
||||
Also ben"otigt man externen Speicherplatz. Auf einem GIT-Server.\\ |
||||
Als Plattform kannst du "offentliche Server nehmen. GitHub sei hier erw"ahnt.\\ |
||||
Du kannst dir einen GIT-Server auch auf einem kleinen Raspberry Pi in deinem Heimnetzwerk |
||||
einrichten. Oder du mietest dir einen eigenen Rootserver und packst dort deinen GIT-Server |
||||
drauf. Alles kein Problem! |
||||
|
||||
\section{GitHub} |
||||
GitHub ist eine - f"ur nichtkommerzielle Projekte - kostenlose Plattform, die GIT anbietet. |
||||
Man kann nat"urlich Geld zahlen, dann bekommt man etwas mehr an ``Features'' auf der Plattform, |
||||
aber f"ur den Hausgebrauch reicht die kostenlose Variante.\\ |
||||
Du meldest dich bei GitHub an und hinterlegst dort deinen "offentlichen |
||||
SSH-Schl"ussel\footnote{Wie man SSH-Schl"ussel erstellt, m"ogest du bitte im WWW selbst"andig |
||||
suchen}.\\ |
||||
Du kannst dort deine Projekte komplett verwalten, die Seite ist sehr "ubersichtlich |
||||
aufgebaut und es gibt auch eine Hilfefunktion. |
||||
|
||||
\section{GIT-Server im Heimnetzwerk} |
||||
F"ur einen GIT-Server im eigenen Heimnetzwerk eignet sich ein Raspberry Pi wunderbar. Der |
||||
sollte nat"urlich "uber LAN (und nicht via WLAN) mit dem Netz verbunden sein, damit die |
||||
Daten"ubertragung m"oglichst hastig erfolgen kann. Eine FritzBox zum Beispiel hat |
||||
Gigabitinterfaces, da kann man schon mal gut was "uber die Leitung jagen (wobei des Raspberries |
||||
Interface langsamer ist).\\ |
||||
Als GIT-Serversoftware empfehle ich an dieser Stelle gogs\footnote{https://gogs.io/}.\\ |
||||
Wenn du dich damit besch"aftigen willst, solltest du aber "uber gute Linuxkenntnisse |
||||
verf"ugen.\\ |
||||
Mit gogs hast du eine Weboberfl"ache, "ahnlich wie bei GitHub, unter der du deine Projekte |
||||
recht einfach verwalten kannst. Du hast auch die M"oglichkeit, private Projekte dort anzulegen. |
||||
|
||||
\section{GIT from scratch} |
||||
Ich habe keine bessere "Uberschrift gefunden, aber wenn du keine Lust auf GitHub oder gogs oder |
||||
wie auch immer das coole (Web-)Frontend heisst, dann reicht auch...git.\\ |
||||
Dann legst du als Benutzer ``root'' einen Benutzer ``git'' an. Hast du das erledigt, wirst |
||||
du zum Benutzer ``git'' und legst ein Verzeichnis ``.ssh'' im Benutzerverzeichnis von ``git'' |
||||
an. In das Verzeichnis ``.ssh'' kommen in die Datei ``authorized\_keys'' die "offentlichen |
||||
SSH-Schl"ussel der Benutzer, die git benutzen d"urfen.\\ |
||||
Also: |
||||
\begin{verbatim} |
||||
sudo adduser git |
||||
su git |
||||
mkdir .ssh |
||||
chmod 700 .ssh |
||||
\end{verbatim} |
||||
Jetzt kannst du - als Benutzer ``git'' anfangen, Repositories anzulegen: |
||||
\begin{verbatim} |
||||
mkdir Welt.git |
||||
cd Welt.git |
||||
git --bare init |
||||
\end{verbatim} |
||||
Du siehst hier wieder den ``init''-Befehl, diesmal jedoch mit der Option ``--bare''. Diese |
||||
Option sorgt daf"ur, dass kein sog. ``Arbeitsverzeichnis'' angelegt wird, d.h. es fehlt das |
||||
.git-Verzeichnis, daf"ur sind dort andere Dateien und Verzeichnisse erzeugt werden, die |
||||
zur Verwaltung eines GIT-Repositories n"otig sind (guck einfach mal per \textit{ls -oha} nach). |
||||
Okay, du hast keine Lust? So sieht das Verzeichnis dann aus: |
||||
\begin{verbatim} |
||||
drwxrwxr-x 7 git 4,0K Mar 22 18:11 . |
||||
drwxrwxr-x 19 git 4,0K Mar 22 18:11 .. |
||||
drwxrwxr-x 2 git 4,0K Mar 22 18:11 branches |
||||
-rw-rw-r-- 1 git 66 Mar 22 18:11 config |
||||
-rw-rw-r-- 1 git 73 Mar 22 18:11 description |
||||
-rw-rw-r-- 1 git 23 Mar 22 18:11 HEAD |
||||
drwxrwxr-x 2 git 4,0K Mar 22 18:11 hooks |
||||
drwxrwxr-x 2 git 4,0K Mar 22 18:11 info |
||||
drwxrwxr-x 4 git 4,0K Mar 22 18:11 objects |
||||
drwxrwxr-x 4 git 4,0K Mar 22 18:11 refs |
||||
\end{verbatim} |
||||
Falls du es dir noch nicht gedacht hast: Du kannst das lokal auf deinem Rechner machen! Damit |
||||
wird dein Rechner zum GIT-Server! Und was auf deinem Rechner funktioniert, klappt auch auf |
||||
einem Raspberry Pi, der in deinem Keller oder auf dem Dachboden rumliegt oder auf dem |
||||
dicken Server, der irgendwo in einem Rechenzentrum in Deutschland steht. |
||||
|
||||
\chapter{Projekt ``Welt'' auf den Server bringen} |
||||
Nachdem du also einen GIT-Server irgendwie ans Laufen gebracht hast, oder du dich bei GitHub |
||||
angemeldet hast, soll das ``Welt''-Projekt nun auf den entfernten Server gebracht werden. |
||||
|
||||
Ob dein GIT-Server nun auf deinem Raspberry oder auf deinem lokalen Server l"auft, der Unterschied |
||||
liegt in der Benennung des Rechners. Ich erkl"are dir die folgenden Schritte unter der Annahme, |
||||
dass du den GIT-Server auf deinem Rechner installiert hast. Die Transferleistung hin zum |
||||
Raspberry Pi oder einem Rootserver "uberlasse ich dir.\\ |
||||
Um dein Projekt auf den Server hochzuladen, musst du dich im Repoverzeichnis befinden, wo wir uns am |
||||
Anfang dieses Papiers aufgehalten haben. Also \textit{cd ~/git/Welt}. Zu Beginn wollen wir |
||||
den Masterbranch hochladen, also zur Sicherheit ein \textit{git checkout master} machen.\\ |
||||
Achtung, jetzt geht es los:\\ |
||||
\begin{verbatim} |
||||
git remote add origin git@localhost:Welt.git |
||||
git push origin master |
||||
\end{verbatim} |
||||
Damit hast du deinen Masterbranch auf den Masterbranch des GIT-Servers geladen, wobei der Server |
||||
daf"ur sorgt, dass deine "Anderungen mit dem bereits bestehenden Branch ``gemergt'' werden. |
||||
Bei einem krachneuen Branch ist das nat"urlich nicht n"otig, aber sp"ater einmal, wenn du |
||||
ein ganzes Team an deinem Projekt mitwerkeln l"asst, dann ist das wichtig.\\ |
||||
\\ |
||||
Also, mal die Erkl"arung:\\ |
||||
Mit der ersten Zeile hast du deinem Repository gesagt, dass unter dem Namen ``origin'' ein |
||||
entferntes (remote) Repo existiert. Und zwar beim Benutzer ``git'' auf dem Rechner ``localhost'' |
||||
im Repository ``Welt.git''.\\ |
||||
Mit der zweite Zeile hast du dann den aktuellen Branch hochgeladen (push) und zwar zu dem |
||||
entfernten Repository ``origin'' in dessen Branch ``master''.\\ |
||||
Die Bezeichnung ``origin'' f"ur ein entferntes Repository ist Standard. Du h"attest es auch |
||||
``Pizza'' oder ``Koeln'' nennen k"onnen, Namen sind Schall und Rauch. Dein ``push'' w"are dann |
||||
\textit{git push Pizza master}, bzw. \textit{git push Koeln master}. Es ist nur ein Name f"ur die |
||||
Verbindungsdaten zum Server (git@localhost:Welt.git).\\ |
||||
\\ |
||||
Jetzt hat sich deine Arbeitsweise etwas erweitert: |
||||
\begin{itemize} |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item git add . |
||||
\item git commit -a |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item Datei anlegen |
||||
\item git add . |
||||
\item git commit -a |
||||
\item git push origin master |
||||
\item ... |
||||
\end{itemize} |
||||
(Gesetzt den Fall, du bist im Masterbranch) |
||||
|
||||
\chapter{Arbeiten im Team} |
||||
Du hast bisher alleine mit GIT gearbeitet, hast aber das Projekt, bzw. |
||||
die Projekte mit einem GIT-Server verwaltet.\\ |
||||
Dann ist der Schritt hin zur Teamarbeit f"ur dich recht leicht, denn |
||||
du weisst ja, dass du mit \textit{git push ...} Ver"anderungen |
||||
hochl"adst.\\ |
||||
Da aber deine Kolleginnen und Kollegen auch fleissig waren, solltest |
||||
du deren "Anderungen mindestestens einmal am Tag herunterladen |
||||
und deine Arbeitskopie damit aktuell halten.\\ |
||||
Das gilt besonders f"ur die Zweige, die regelm"a"sigen "Anderungen |
||||
unterworfen sind. Dies sind meistens |
||||
\begin{itemize} |
||||
\item master |
||||
\item develop |
||||
\item testing |
||||
\end{itemize} |
||||
Um deine Arbeitskopie zu aktualisieren, wechselst du in den entsprechenden |
||||
Zwei (zum Beispiel ``develop'') und f"uhrst dort \textit{git pull} aus.\\ |
||||
Damit werden die "Anderungen vom Server heruntergeladen und in deinen Zweig |
||||
eingepflegt.\\ |
||||
\\ |
||||
Ein Beispiel aus dem realen Leben:\\ |
||||
Wenn man in einer Software einen Fehler findet, wird erst einmal ein |
||||
Bericht geschrieben und dieser Bericht bekommt eine sog. ``Ticketnummer''. |
||||
Zum Beispiel 4711.\\ |
||||
Du sollst nun Ticket 4711 bearbeiten. Es wird immer (meistens) aus dem |
||||
Zweig ``develop'' ein neuer Zweig erstellt. Das heisst, du wechselst |
||||
per \textit{git checkout develop} in den Entwicklungszweig und |
||||
f"uhrst hier \textit{git pull} aus. Damit ist dein Zweig aktuell und |
||||
du kannst mit \textit{git checkout -b bug-4711} den Zweig erzeugen, |
||||
um den Fehler zu beheben.\\ |
||||
Bist du irgendwann fertig damit (und hast immer wieder \textit{git |
||||
pull origin bug-4711} gemacht, kannst du deinen Zweig wieder in |
||||
den Developbranch ``zur"uckmergen'', bzw ``zur"uckmergen'' lassen. |
||||
``Lassen'' deshalb, weil in der Regel ein anderer Programmierer |
||||
erst deinen Code testet und f"ur den Merge freigibt, aber das ist |
||||
abh"angig von den Regeln der jeweiligen IT-Abteilung. |
||||
|
||||
\chapter{"Altere Version auschecken} |
||||
Es wird selten gebraucht, aber manchmal denkt man: ``Verdammt, |
||||
an dem Punkt da vor ein paar Tagen/Wochen/Monaten, da lief |
||||
das System besser!''\\ |
||||
Besonders, wenn man mal ``was ausprobieren'' will, ist es |
||||
ganz nett, wenn man eine ``uralte'' Version des Projektes |
||||
auschecken kann.\\ |
||||
Geht recht einfach!\\ |
||||
Na gut, man muss ein wenig arbeiten, denn zuerst muss man |
||||
den richtigen Commit wiederfinden. Um das Log eines GIT-Projektes |
||||
anzuzeigen, verwendet man \textit{git log}.\\ |
||||
Das sieht zum Beispiel so aus: |
||||
\begin{verbatim} |
||||
commit 43632ef9d9ed259a33d030d2e71549bba752e97b |
||||
Author: Max Mustermann <hzuehl@phone-talk.net> |
||||
Date: Tue Mar 27 18:10:22 2018 +0200 |
||||
|
||||
blah => blubb |
||||
|
||||
commit 90845d50545e2bb7069622dbe0c645241f25e9d2 |
||||
Merge: 19a30b3 201d71f |
||||
Author: Max Mustermann <hzuehl@phone-talk.net> |
||||
Date: Thu Mar 22 15:08:02 2018 +0100 |
||||
|
||||
Merge branch 'hallo' |
||||
|
||||
commit 201d71f352307d88b98aa4d1c5d5892b468948e7 |
||||
Author: Max Mustermann <hzuehl@phone-talk.net> |
||||
Date: Thu Mar 22 15:07:54 2018 +0100 |
||||
|
||||
Blah |
||||
|
||||
commit 19a30b330ab250a6d3ab3f0a9ecf1c6d9b2d9fd5 |
||||
Author: Hauke Zühl <hzuehl@phone-talk.net> |
||||
Date: Thu Mar 22 13:40:59 2018 +0100 |
||||
|
||||
LIESMICH angelegt |
||||
\end{verbatim} |
||||
Zur Info: Ich bin zur Zeit im Masterbranch.\\ |
||||
\begin{verbatim} |
||||
-rw-rw-r-- 1 hauke 0 Mar 22 15:08 blubb |
||||
-rw-rw-r-- 1 hauke 14 Mar 22 13:20 LIESMICH |
||||
\end{verbatim} |
||||
Jetzt will ich die Version vom 22.3, 13:40:59 auschecken. |
||||
Das ist der Commit\\ |
||||
19a30b330ab250a6d3ab3f0a9ecf1c6d9b2d9fd5. |
||||
Dann mal los: \textit{git checkout\\ |
||||
19a30b330ab250a6d3ab3f0a9ecf1c6d9b2d9fd5}\\ |
||||
Das ist verdammt lang, oder?\\ |
||||
An dieser Stelle ein Hinweis: Es reichen die eersten 7 Zeichen |
||||
des Hashes des Commits, also ein \textit{git checkout 19a30b3} |
||||
h"atte es auch getan!\\ |
||||
Wie dem auch sein, das Verzeichnis sieht jetzt so aus: |
||||
\begin{verbatim} |
||||
-rw-rw-r-- 1 hauke 14 Mar 22 13:20 LIESMICH |
||||
\end{verbatim} |
||||
Es fehlt also eine Datei (``blubb'')! Logisch, die gab es zu diesem |
||||
Zeitpunkt noch nicht.\\ |
||||
Aber Vorsicht: Es muss nicht sein, dass du dich dann noch in dem |
||||
gew"unschten Zweig befindest; du kannst an jeder Stelle jede |
||||
"Anderung auschecken und von da an weitermachen!\\ |
||||
Tip: Das solltest du ein wenig "uben und noch ein Tip: An |
||||
dieser Stelle sind grafische GIT-Clients sehr n"utzlich, um |
||||
dir eine gute "Ubersicht "uber dein Projekt zu geben.\\ |
||||
Wenn du aber tapfer bist und auf der Konsole bleiben willst, |
||||
bitte sch"on: \textit{git log --graph} zaubert |
||||
ein sch"ones Log auf den Bildschirm. Und wenn du die Kurzform |
||||
der Commits haben willst, dann bringt dich |
||||
\textit{git log --abbrev-commit --graph} ans Ziel. |
||||
|
||||
\chapter{Zum Ende noch ein paar Ideen und Worte} |
||||
Zum Ende hin noch ein paar Anregungen bzgl. der Einsatzzwecke |
||||
von GIT.\\ |
||||
Man kann GIT alleine nutzen, kein Problem. Das f"angt mit den |
||||
eigenen Skripten und Programmen an, geht "uber Korrespondenz |
||||
bis hin zu Konfigurationsdateien des Rechners (bzw. der Rechner). |
||||
Nimm dir zum Beispiel einen Raspberry Pi als GIT- und Puppetserver, |
||||
dann kannst du deine Linuxb"uchsen ganz einfach per Puppet |
||||
konfigurieren.\\ |
||||
Oder du willst dir nicht gleich einen Cloudserver einrichten, dann |
||||
kannst du deine pers"onlichen Dateien mit Hilfe von GIT verwalten.\\ |
||||
\\ |
||||
Ich hoffe, ich konnte dir einen kleinen Einblick in die Arbeitsweise |
||||
von GIT vermitteln. Es ist ein wenig "Ubung n"otig, aber mit der Zeit |
||||
hast du die Grundkommandos verinnerlicht und solltest keine Probleme |
||||
mehr haben.\\ |
||||
Tip: Committe oft! Damit ist nicht nur das ``commit'' gemeint, sondern |
||||
durchaus auch das ``push''. ``push'' sollte aber definitiv immer kurz |
||||
vor Feierabend gemacht werden.\\ |
||||
Mit dieser Einstellung sorgst du daf"ur, dass man deine "Anderungen |
||||
bessser nachvollziehen kann; es ist einfacher, zwei oder drei Zeilen |
||||
sp"ater nachzuvollziehen, als wenn du 234 Zeilen in 20 Dateien |
||||
"anderst und man diese "Anderungen sp"ater nachvollziehen will. |
||||
\\ |
||||
Viel Spa"s mit GIT. |
||||
|
||||
\end{document} |
Loading…
Reference in new issue