GIT ============ Warum Git? ----------- Git wurde 2005 von Linus Torwalds entwickelt, als er ein Werkzeug zur Quellcodeverwaltung des Linux Kernels benötigte. Seither ist die freie Software Git aus der Softwareentwicklung nicht mehr wegzudenken. Neben der Versionsverwaltung bietet Git viele nützliche Features wie beispielsweise paralleles Arbeiten von mehreren Entwicklern. Zentrale Elemente ------------------- Remote ....... Als *Remote* wird das zentrale Git-Repository bezeichnet. Hier liegen einerseits die Daten und andererseits werden die Rechte verwaltet. Die Berner Fachhochschule bietet hierfür `gitlab.ti.bfh.ch `_ und `git.bfh.ch `_ an. Weitere bekannte Git-Hoster sind unter anderem `Github `_, `Gitlab `_ und `Bitbucket `_. Files ....... Die zu verwaltenden Files werden in Git als sogenannte Snapshots gespeichert. Ändert ein File nicht, wird lediglich auf den Snapshot referenziert. .. figure:: _files/images/git_snapshots.png :width: 600 px :align: center :figclass: align-center Quelle : git-scm.com Ein File kann vier verschiedene Status haben. * **Untracked** * File wird nicht von Git verwaltet. Files müssen explizit geaddet werden. * **Unmodified** * File wurde nicht verändert. * **Modified** * File wurde verändert. * **Staged** * Neue Version des Files ist bereit für einen Commit. .. figure:: _files/images/git_lifecycle.png :width: 600 px :align: center :figclass: align-center Quelle : git-scm.com Commit ........ Ein Snapshot einer Softwareversion wird als *Commit* bezeichnet. Er kann als eine gespeicherte Version des Projekts betrachtet werden. Mehrere aufeinanderfolgende Commits bilden einen Branch. Branch ....... Ein *Branch* ist eine Versionslinie, in welcher unabhängig der anderen Linien entwickelt werden kann. Auf dem *Master-Branch* werden die einzelnen, lauffähigen Softwarerelases verwaltet. Im *Develop-Branch* wird die Software aktiv entwickelt. Ist ein neuer Release im Develop fertig gestellt, wird dieser in den Master-Branch gezogen. Hier spricht man vom sogenannten *Merging*. Einzelne Bugfixes, Features etc. können weiteren Branches entwickelt und getestet werden, bevor diese in den Develop-Branch gemerged werden. .. figure:: _files/images/git_branches.png :width: 600 px :align: center :figclass: align-center Quelle : git-scm.com .gitignore ........... Das ``.gitignore``-File wird im Hauptverzeichnis des Repositories abgelegt. Es beschreibt Files und Ordner, welche von Git ingoriert werden sollen. Solche Files tauchen nicht mehr als *untracked* auf. Es lohnt sich, nicht direkt projektrelevante Dateien wie Konfigurationsdateien oder Build-Outputs in das Ignore-File zu schreiben. Folgende Wildcards und Syntax werden unterstützt: * ``*.o`` * Alle Files mit der Endung .o werden ignoriert * ``build/`` * Alle Dateien innerhalb des Build-Ordners werden ignoriert. Tutorial --------- Es gibt verschiedenste Git-Workflows. Dieses Tutorial beschreibt den Git-Workflow des I3S und mit Hilfe des Programms *SmartGit*. Als Projektbeispiel wird ein *plain-C* Projekt mit QT-Creator erstellt. Es kann aber auch ein anderes Programm und Projekt verwendet werden. QT-Projekt erstellen ....................... .. figure:: _files/images/QT_Projekt_Erstellen.gif :align: center :figclass: align-center * QT Creator Starten und neues Projekt erstellen * ``File->New File or Project`` * ``Non-Qt Project, Plain C Application`` markieren und ``Choose`` klicken * Projektname: ``Git_Tutorial``, gewünschter Repository-Pfad angeben und mit ``Next`` bestätigen * Build system: ``qmake``, mit ``Next`` bestätigen * Kit: ``Desktop Qt xy`` auswählen und mit ``Next`` bestätigen * Mit ``Finish`` das Erstellen finalisieren. * Der Sorucecode sollte wie folgt aussehen : .. code-block:: c #include int main() { printf("Hello World!\n"); return 0; } * Projekt Builden und Ausführen * ``Build->Build Project "Git_Tutorial"`` * ``Build->Run`` * Nun sollte auf einer Konsole die Ausgabe ``Hello World`` erscheinen. Lokales Git-Repository erzeugen ................................. .. figure:: _files/images/GIT_Repo_Initialisieren.gif :align: center :figclass: align-center * SmartGit starten * Repository hinzufügen * ``Repository->Add or Create`` * Als Repository-Pfad den Pfad des QT-Projektes angeben und mit ``OK`` bestätigen. * Mit ``Initialize`` das Repository initialisieren * Nun listet QT alle gefundenen Files im Projektordner als *untracked* auf. * Relevante Files dem Repository hinzufügen * Bei QT-Projekten sind die :code:`*.c`, :code:`*.h` und das :code:`*.pro` File wichtig. * Mittels der ``ctrl``-Taste können diese Files markiert werden. * Mit ``Rechtsklick->Stage`` können diese Files *gestaged* werden. * Nicht relevante Files können dem ``.gitignore`` File hinzugefügt werden. Als nicht relevante Files werden von QT generierte Files, sowie die Einstellungen des Creators (:code:`*.pro.user`) betrachtet. * ``Rechtsklick->Ignore`` auf das File ``Git_Tutorial.pro.user`` * ``Ignore as pattern : *.pro.user`` * ``Ignore File: .gitignore in repository root directory`` * ``Ignore`` klicken * Durch Doppelklick auf das File, wird ein Editor geöffnet. * Folgende Zeile hinzufügen ``build-*/``. Somit ignoriert Git alle Ordner und darunterliegenden Files, welche mit ``build-`` beginnen. * Das ``.gitignore``-File kann nun ebenfalls gestaged werden. * Mit der Schaltfläche ``Commit`` können diese Files nun dem lokalen Repository hinzugefügt werden. * Es empfiehlt sich, eine kurze und verständliche Commit Message zu schreiben und mit dem Button ``Commit`` zu comitten. * Nun haben alle Files den Status *Unchanged* Lokales Git-Repository auf Remote pushen .......................................... .. figure:: _files/images/GIT_push.gif :align: center :figclass: align-center * Mit persönlichem BFH-Account auf `gitlab.ti.bfh.ch `_ einloggen * Neues Projekt erstellen mit der Schaltfläche ``New Project`` * ``Project Name : Git_Tutorial`` * Wenn gewünscht, eine Kurzbeschreibung eintragen * ``Create Project`` * Nun wird das leere Repository angezeigt. Unter dem Titel *Push an existing Git repository* steht eine Anleitung, wie man das Repository mittels Konsole auf den Remote pushen kann. * Der Link auf der Zeile ``git remote add origin`` kann mit ``ctrl+c`` in die Zwischenablage kopiert werden. * Beispiel Link ``git@gitlab.ti.bfh.ch:sam2/git_tutorial.git`` * Remote in SmartGit hinzufügen * ``Remote->Add`` * ``URL or Path`` den Link aus der Zwischenablage hineinkopieren und ``add`` klicken * Anschliessend mit der Schaltfläche ``Push`` das Repository auf den Remote laden * Nun sollten die Projektdateien im Gitlab ersichtlich sein Arbeiten mit GIT .......................................... .. figure:: _files/images/GIT_newline.gif :align: center :figclass: align-center Wurden die vorhergegangen Schritte alle erfolgreich abgeschlossen, ist das Repository nun eingerichtet und kann für produktives Arbeiten verwendet werden. * Modifikation des Codes * Als erstes wird nun im Sourcecode des Projektes im *QT Creator* gearbeitet. Hierfür kann beispielsweise eine neue Codezeile hinzugefügt werden. Der Sourcecode sieht nun folgendermassen aus. .. code:: c #include int main() { printf("Hello World!\n"); printf("This is a new line of code!\n"); return 0; } * Im *QT Creator* das Projekt kompilieren und ausführen. * ``Build->Build Project "Git_Tutorial"`` * ``Build->Run`` * Nun sollte in der Konsole folgendes ausgegeben werden : .. code:: bash Hello World! This is a new line of code! * In *Smartgit* ist die Modifikation nun ersichtlich. .. figure:: _files/images/Screenshot_Smartgit_Modified.png :width: 600 px :align: center :figclass: align-center * Duch Klicken auf ``Commit`` können die Änderungen in das lokale Repository übernommen werden. Es ist Empfohlen, eine aussagekräftige Commit Message anzugeben. Durch Klicken auf ``Commit`` werden die Änderungen übernommen. * Der Status der Datei ``main.c`` sollte nun auf ``Unchanged`` gewechselt haben. * Mittels der Schaltfläche ``Push`` kann das Repository nun auf den Gitserver geladen werden. Branching and Merging ...................... .. figure:: _files/images/GIT_branch.gif :align: center :figclass: align-center * ``Branch->Add Branch...`` und Branchname einfügen (bsp. feature/introtext). Anschliessend ``Add Branch & Checkout`` auswählen. * Im *QT Creator* Code-Änderungen /-Ergänzungen durchführen * Die Änderungen in *Smartgit* dem Repository hinzufügen. * ``Checkout`` Master Branch * Merge Branch feature/introtext (Create Merge Commit) * Commit * Push