Git und GitHub

Christian Noss edited this page Sep 27, 2016 · 1 revision

WikiGit und GitHub

(Originaldokument von Christoph Jerolimov und Dominik Schilling)

Hier finden Sie weitere Informationen und [Konventionen zum Umgang mit GitHub und WBA1](/th-koeln/wba1-2015/wiki/GitHub und WBA1).

Inhaltsverzeichnis

Einführung

Was ist Git?

Git ist ein Softwareversionierungssystem das ursprünglich für die Verwaltung des Linux-Quelltextes von Linus Torvalds entwickelt wurde. Linus Torvalds begann im April 2005 mit der Entwicklung von Git, da die bisher genutze Software BitKeeper nicht mehr kostenlos verwendet werden konnte.

(Quelle: Jörn Fiege, Sascha Lemke - Git-Advanced Dokumentation WBA1 WiSe 2012)

Was kann Git?

Die Grundfunktion von git bzw. eines Systems zur Versionsverwaltung besteht darin Änderungen an Dokumenten und Dateien zu erfassen und zu verwalten. In der Softwareentwicklung wird dies üblicherweise zur Verwaltung von Quellcode eingesetzt. Git unterscheidet sich allerdings ein wenig zu den etwas tradionelleren Verwaltungssystemen. Gerade der Ansatz der nicht linearen Entwicklung ist ein großer Kern von Git.

(Quelle: Jörn Fiege, Sascha Lemke - Git-Advanced Dokumentation WBA1 WiSe 2012)

Was ist GitHub?

Die Idee hinter GitHub ist eine einfache Möglichkeit zum Teilen von Codes mit Mitarbeitern, Freunden oder komplett fremden. GitHub wurde deswegen im Jahr 2008 in San Francisco von Tom Preston-Werner, Chris Wanstrath und PJ Hyett gegründet. Mittlerweile ist GitHub der größter Hoster für Quellcode und wird immer beliebter in der Entwickler-Szene.

Mit dem Verwaltungsystem Git als ihr Kernprodukt bringen sie immer weitere Features auf den Markt rund um den Bereich "Social Coding". Neben Dingen wie Gist, einer Developer API und GitHub Pages gibt es unzählige weitere Features die Git und GitHub zur ersten Wahl machen, was die Verwaltung und Versionierung von Open Source Quellcode angeht.

(Quelle: Jörn Fiege, Sascha Lemke - Git-Advanced Dokumentation WBA1 WiSe 2012)

GitHub stellt zudem eigene Software zur sehr einfachen Benutzung von Git, inbesondere in Zusammenarbeit mit GitHub für OSX und Windows zur Verfügung.


Konfiguration: Name und E-Mail

Die Daten sind nötig, um Commits erfolgreich abzusetzen. Jeder Commit wird mit diesen Eingaben verknüpft.

$ git config --global user.name "Name"
$ git config --global user.email "E-Mail Adresse"

Die eingetragene E-Mail sollte der E-Mail Adresse bei GitHub entsprechen! (Hinweis: E-Mail wird öffentlich einsehbar sein.)

Authentifizierung

GitHub erlaubt die Authentifizierung über die beiden Protokolle SSH und HTTPS.

HTTPS: https://github.com/th-koeln/wba1-2015.git

Bei HTTPS wird bei jedem Commit Name und Passwort abgefragt. (Die GitHub GUI speichert diese Daten zur Vereinfachung.)

SSH: git@github.com:th-koeln/wba1-2015.git

Was ist ein Repository?

Ein Repository ist ein Verzeichnis, wo digitale Objekte gespeichert werden können. Ein solches Repository ist zum Beispiel wba1-2015.

Wie clone ich ein Repository?

Jedes Repository hat eine eindeutige URL. Diese kann auf GitHub gefunden werden:

Repo URL

Nutze entweder die HTTP oder die SSH Variante, siehe Authentifizierung.

In Git gibt es zum Clonen den Befehl clone welcher mit der Repository URL ergänzt wird:

$ git clone git@github.com:th-koeln/wba1-2015.git

Standardmäßig wird der Ordner gleich des Repository Namens sein. Hier also wba1-2013.

Wie halte ich meine Kopie (Clone) auf den aktuellen Stand?

Die Kopie ist nur zum Zeitpunkt des Clonens aktuell. Danach muss sie manuell auf dem Laufenden gehalten werden. Dies geht mit dem Befehl pull.

$ git pull

Was ist ein Commit?

Mit einem Commit werden deine Änderungen mit einer Nachricht versehen. Dabei bestätigst du sie gleichzeitig für die nächste Veröffentlichung.

$ git commit -am "Datei aktualisiert"

Wie füge ich Dateien zu einem Commit hinzu?

Bevor ein Commit abgesetzt werden kann, müssen die Änderungen dem Commit hinzugefügt werden. Dies geht mit dem Befehl add. Möchte man alle Änderungen hinzufügen, dann reicht ein Punkt:

$ git add .

Möchte man eine spezielle Datei ansprechen, dann nur die jeweilige Datei angeben:

$ git add /pfad/zur/datei.txt

Wie setze ich einen Commit zurück?

Hier gibt es zwei Varianten - die "softe" und die "harte" Variante. Bei der soften Vaiante wird nur der Commit zurückgesetzt, die Ändernungen bleiben bestehen. Bei der harten Variante hingegen werden auch die Ändernungen verworfen. Vorsicht also.

$ git reset --soft HEAD~1
# oder
$ git reset --hard HEAD~1

Die 1 entspricht dabei der Anzahl der Commits, die zurückgesetzt werden sollen.

Was ist ein Push?

Die Änderungen sind bis Dato in deinem lokalen Repository. Um die Änderungen an das entfernte Repository, hier GitHub, zu senden, wird der push Befehl benötigt.

$ git push

Was ist ein Branch?

Als Branch bezeichnet man einen Zweig im Repository. Der Hauptzweig ist der Master Branch.

Das Problem: Der Master ist keine Spielwiese! Die Lösung: Einen eigenen, temporären „Entwicklungszweig“ erstellen.

Vorteile:

  • Lokal und unabhängig
  • Pushen prinzipell optional, aber ideal für (Sub-)Teams
  • Umkehrschluss: Nicht alle branches sind lokal verfügbar!

Branches werden in Git mit dem Befehl branch verwaltet. git branch zeigt zum Beispiel die lokalen Branches an.

Wie erstelle und veröffentliche ich einen Branch?

Zunächst erstellt man lokal einen Branch vom Master Branch:

$ git branch branch_name
$ git checkout branch_name

Danach kann dieser mit dem Push Befehl veröffentlicht werden:

$ git push origin branch_name

Wie ziehe ich einen externen Branch auf meinen lokalen Rechner?

Dies setzt voraus, dass der Remote Branch existiert.

$ git branch branch_name origin/branch_name
$ git checkout branch_name

Was darf ich in meinem Branch NICHT machen?

Auch wenn der eigene Branch eine größere „Spielwiese“ darstellt, solltest du folgende Dinge trotzdem nicht machen:

  • Lösche keine vorhanden Ordner
  • Ändere nicht die Stylesheets im revealjs-template Verzeichnis
  • Ändere keine Dateien außerhalb deines speziell für den Vortrag angelegten Ordner

Warum? Dein Branch soll wieder mit dem Master vereint werden. Änderungen obiger Art würden später in Konflikten und Mehrarbeit enden.

Wie stelle ich meine lokalen Änderungen öffentlich?

$ git add .
$ git commit -am "Branch aktualisiert"
$ git push origin branch_name

Wie kann ich den lokalen Branch wechseln?

Git stellt dafür den Befehl checkout zur Verfügung:

$ git checkout master
$ git checkout branch_name
$ git checkout master

Wie kann ich einen Branch löschen?

Falls der Branch schon veröffentlicht wurde:

$ git push origin --delete branch_name

Einen lokalen Branch löschen:

$ git branch -d branch_name

Was ist ein Merge?

Unter einem Merge versteht man die Zusammenlegung zweier Versionszweige/Branches. Merges passieren meistens automatisch.

  • Bei parallelen Arbeiten (gleicher Branch)
  • Ergebnisse veröffentlichen (eigener Branch → Master)
  • Branch aktualisieren (Master → eigener Branch)

Git stellt dafür den Befehl merge bereit.

Wie überführe ich meine Änderungen aus Branch X in den Master Branch?

Zunächst sollte man sich im richtigen Branch befinden, nämlich im Master Branch. (Annahme: Der Master Branch ist vorhanden und der Branch branch_name.)

$ git branch
* master
branch_name
$ git merge branch_name
$ git push origin master

Wie löse ich Konflikte?

Konflikte enstehen meistens, wenn Änderungen an Dateien noch nicht lokal gezogen worden. Git wird das Pushen dann unterbinden. Ein git pull ist nötig. Dann wird Git die betroffenen Dateien markieren.

Eine markierte Datei hat folgendes Schema:

<<<<<<< HEAD
Ciao Mama
=======
Ciao Bella
>>>>>>> f53e906557375ba556372320d1d96ef265365d4a

Was zwischen <<<<<<< HEAD und ======= sind unsere Änderungen, zwischen ======= und >>>>>>> die entfernten Änderungen, die noch nicht gezogen waren. Hier musst du dich nun entscheiden, was wirklich in die Datei soll. Nach dem Säubern der Datei (Git Zeichen auch entferen):

$ git commit -a

Ein Editor öffnet sich mit einer schon vorbereiteten Commit Nachricht. Dies einfach schließen und den Merge Vorgang beenden:

$ git push
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.