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.

../_images/git_snapshots.png

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.

../_images/git_lifecycle.png

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.

../_images/git_branches.png

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

../_images/QT_Projekt_Erstellen.gif
  • 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 :

      #include <stdio.h>
      
      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

../_images/GIT_Repo_Initialisieren.gif
  • 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 *.c, *.h und das *.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 (*.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

../_images/GIT_push.gif
  • 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

../_images/GIT_newline.gif

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.

      #include <stdio.h>
      
      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 :

        Hello World!
        This is a new line of code!
        
  • In Smartgit ist die Modifikation nun ersichtlich.

    ../_images/Screenshot_Smartgit_Modified.png
    • 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

../_images/GIT_branch.gif
  • 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

Legal Information