• Keine Ergebnisse gefunden

Versionsverwaltung mit git

N/A
N/A
Protected

Academic year: 2021

Aktie "Versionsverwaltung mit git"

Copied!
35
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Versionsverwaltung mit git

(2)

Versionsverwaltung

Versionsverwaltungssysteme verwalten Dateien und zeichnen alle Änderungen an den Dateien im Laufe ihrer Entwicklung auf.

I alte Versionen sind stets verfügbar

I jede Änderung ist dokumentiert

I Entwicklung wird nachvollziehber

I Koordination mehrerer Entwickler

– gleichzeitiges Arbeiten an allen Teilen des Projekts

– Zusammenführung von Änderungen an einem Projekt – Welche Versionen welcher Dateien passen zusammen?

(3)

Versionsverwaltung

Hin und her Kopieren von Dateien mit E-Mail oder Dropbox ist nicht geeignet.

class X {

p u b l i c int x;

}

class X {

p r i v a t e int x;

p u b l i c int getX () { r e t u r n x;

};

}

class X { int x;

p ub l i c void inc () { x++;

};

}

Alice Bob

Kopieren der neuesten Version überschreibt eine der Änderungen stillschweigend

(4)

Versionsverwaltungssysteme

Software wird mithilfe von Versionsverwaltungssystemen (engl. Version Control System) entwickelt.

Beispiele: CVS, SVN, git, Mercurial, . . .

I Verwaltung von Datei- und Projektversionen

I Integration von Änderungen verschiedener Entwickler

I Änderungen nachvollziehbar machen

I Erkennen von Konflikten

(5)

git

Möglichkeiten zur Benutzung von git:

I Kommandozeile

I integriert in Eclipse, IntelliJ oder Netbeans

I andere GUIs

Die grundlegenden Konzepte sind gleich.

Im Praktikum verwenden wir git

I entwickelt von Linus Torvalds u.a. für den Linux Kernel

I weit verbreitet, auch für kleine Projekte

(6)

Versionsverwaltung mit git

Ein git-Repository verwaltet verschiedene Revisionen eines Projekts.

Jede Revision hat einen eindeutigen Namen

(z.B. a679b1deed10b184bbb9f51661a130a0ba4a4222) und

speichert weitere Informationen (z.B. ein kurzer Text über die Änderungen),

Revision 1 Revision 2 Revision 3

. . .

Datei A Datei B

A.2

B.2 Datei C

A.3 B

C

. . . . . . . . .

(7)

Versionsverwaltung mit git

Revisionen werden manuell angelegt.

Arbeitsablauf:

I Dateien ändern und/oder neu angegen/

I Dateien für die nächste Revision vormerken. (staging)

I Neue Revision anlegen (commit).

Die neue Revision wird in einem kurzen Text (commit-message) kurz beschrieben.

I Revision mit anderen Repositories abgleichen – Fremde Revision herunterladen

– Eigene Revision verschicken

(8)

Anlegen eines Repositories

Kommandozeile:

git init

I macht das aktuelle Verzeichnis zu einem (leeren) git Repository

I eventuell existierende Dateien werden ignoriert

git speichert alle Repository-Daten in einem (versteckten) Unterverzeichnis.

(9)

Arbeitsablauf: git add und git commit

I Dateien bearbeiten oder anlegen (wie üblich)

I Inhalte zur nächsten Revision hinzufügen git add datei1

git add datei2 ...

I Revision fertig stellen

git commit -m "kurze Beschreibung der Revision"

Eine commit-message ist notwendig. Ruft man nur git commit

auf, so wird ein Editor gestartet, in dem man die Nachricht eingeben kann.

(10)

Revisionshistorie anzeigen: git log

Kommandozeile:

git log

Jede Revision hat einen eindeutigen Namen (z.B. b5902...).

Die aktuelle Revision heißt auch HEAD.

commit b5902ac4d86bdb84e82b453492ff7650028c4567 Author: Ulrich Schoepp <schoepp@tcs.ifi.lmu.de>

Date: Sun Oct 18 12:13:20 2015 +0200 Text uebersetzt

commit 6d118f0d2d2f5f3b97f3b032a2d3ccb3c8622e40 Author: Ulrich Schoepp <schoepp@tcs.ifi.lmu.de>

Date: Sun Oct 18 11:36:35 2015 +0200 ...

Ausgabe:

(11)

Revisionen zurückholen: git checkout

Kommandozeile:

git checkout revisionsname Beispiel:

Gehe zur ersten Revision:

git checkout 6d118f0

Zurück zur aktuellsten Revision:

git checkout master

N.B. master bezeichnet den Hauptzweig des Repositories. Es gibt auch Nebenzweige, die wir hier nicht betrachten.

(12)

Status: git status

Anzeigen des Status aller Dateien.

git status

On branch master

Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:

(use "git add <file>..." to update what will be committed)

(use "git checkout -- <file>..." to discard changes in working directory) modified: src/test/Main.java

Untracked files:

(use "git add <file>..." to include in what will be committed) src/test/Point.java

no changes added to commit (use "git add" and/or "git commit -a")

(13)

Anzeigen von Änderungen: git diff

Alle Änderungen seit der letzten Revision:

git diff

Änderungen an einer Datei seit der letzten Revision:

git diff dateiname

Änderungen seit einer bestimmten Revisionen:

git diff rev1

git diff HEAD@{yesterday}

Änderungen zwischen zwei Revisionen:

git diff rev1..rev2

(14)

Verteilte Versionsverwaltung

Daten können zwischen verschiedenen git-Repositories ausgetauscht werden.

I clone: duplizieren eines git-Repositories in einem eigenen Verzeichnis

I pull: neue Revisionen von einem anderen Repository übernehmen

I push: neue Revisionen auf ein anderes Repository übertragen

Bei der Entwicklung hat jeder ein eigenes Repository.

Die Daten werden zwischen den Repositories ausgetauscht.

(15)

Remote Repositories

Kopieren eines Repositories:

git clone url

Lädt den Inhalt eines gesamten git-Repositories von url, inklusive der kompletten Versionsgeschichte.

Beispiel:

I Dienste wie github oder gitlab bieten die zentrale Speicherung von git-Repositories an.

I Zum Zugriff auf das Repository wird eine url für git clone angegeben.

Es wird eine Referenz auf das remote Repository gespeichert.

Diese hat oft den Namen origin.

(16)

Remote Repositories

Normales Arbeiten mit dem git-Repository:

Änderungen, add, commit, Änderungen, add, commit, . . .

Hat man Schreibzugriff auf das remote Repository, so kann man die neuen Revisionen dort hochladen.

git push

Dies ist nur möglich, wenn das lokale Repository auf dem neuesten Stand ist (evtl. pull nötig).

Neue Revisionen können vom remote Repository in das lokale übernommen werden.

git pull

(17)

Möglicher Arbeitsablauf

Hauptrepository (z.B. gitlab)

Entwickler 1 Entwickler 2 Entwickler 3

clone clone clone

(18)

Möglicher Arbeitsablauf

pull Arbeit

add, commit Arbeit

add, commit pull

push

Hauptrepository (z.B. gitlab)

Entwickler 1 Entwickler 2 Entwickler 3

pull Arbeit

add, commit Arbeit

add, commit pull

push

pull Arbeit

add, commit Arbeit

add, commit pull

push

(19)

Konflikte

Bei der parallelen Arbeit an einem Projekt kann es zu Konflikten kommen.

class X {

p u b l i c int x;

}

class X {

p r i v a t e int x;

p u b l i c int getX () { r e t u r n x;

};

}

class X { int x;

p ub l i c void inc () { x++;

};

}

Alice Bob

(20)

git pull führt ein merge aus

r1

r1

r1 Hauptrepository

Alice Bob

. . .

. . . .

pull pull

(21)

git pull führt ein merge aus

r1 r2

r1

r1 Hauptrepository

Alice Bob

. . .

. . . .

pull

add, commit

pull

(22)

git pull führt ein merge aus

r1 r2

r1

r1 r3

Hauptrepository

Alice Bob

. . .

. . . .

pull

add, commit add, commit

pull

add, commit

(23)

git pull führt ein merge aus

r1 r2

r1

r1 r3

Hauptrepository

Alice Bob

. . .

. . . .

pull

add, commit add, commit

push

r2

pull

add, commit

(24)

git pull führt ein merge aus

r1 r2

r1

r1 r3

r2 Hauptrepository

Alice Bob

. . .

. . . .

pull

add, commit add, commit

push pull

r2

pull

add, commit

(25)

git pull führt ein merge aus

r1 r2

r1

r1 r3

r2 Hauptrepository

Alice Bob

. . .

. . . .

pull

add, commit add, commit

push pull

merger1(r2, r3) r2

pull

add, commit

(26)

git pull führt ein merge aus

r1 r2

r1

r1 r3

r2 Hauptrepository

Alice Bob

. . .

. . . .

pull

add, commit add, commit

push pull

merger1(r2, r3)

push

r2

r3 merger1(r2, r3)

pull

add, commit

(27)

Konflikte

Bei einem merge können Konflikte auftreten, wenn es in beiden Revisionen Änderungen an der gleichen Stelle gibt.

I git kennzeichnet die Konflikte in der Datei selbst.

Hinweis: Es gibt mit rebase eine Alternative zu merge, siehe Dokumentation.

class X {

<<<<<<< HEAD

private int x;

public int getX() { return x; };

=======

public int x;

public void inc() { x++; }

>>>>>>> 41bff37efee048db1ef40c779e63a1686028af97 }

I Konflikte müssen manuell behoben werden:

Ersetze alle markierten Teile durch den gewünschten Text.

I Das Merge wird mit add, commit abgeschlossen.

(28)

Konflikte

Bei einem merge können Konflikte auftreten, wenn es in beiden Revisionen Änderungen an der gleichen Stelle gibt.

I git kennzeichnet die Konflikte in der Datei selbst.

I Konflikte müssen manuell behoben werden:

Ersetze alle markierten Teile durch den gewünschten Text.

I Das Merge wird mit add, commit abgeschlossen.

class X {

private int x;

public void inc() { x++; } }

(29)

Zusammenfassung: git

I Repository anlegen oder klonen (nur einmal)

⇒ git init oder git clone <url>

I Dateien für die nächste Revision vormerken

⇒ git add <dateiname>

I Neue Revision anlegen

⇒ git commit

I Fremde Revision herunterladen

⇒ git git pull

I Eigene Revision verschicken

⇒ git push

I Spezielle Revision laden

⇒ git checkout <versionsname>

(30)

Allgemeine Hinweise

I Repository regelmäßig mit pull aktualisieren

I viele kleine Commits

I push nur wenn Projekt in konsistentem Zustand

I aussagekräftige Commit-Nachrichten

I alten Programmcode nicht auskommentieren; gleich löschen

(31)

git im Praktikum

I Alle Teilnehmer registrieren sich auf:

https://gitlab.cip.ifi.lmu.de

I Für jedes Projekt wir ein eigenes git-Repository angelegt mit Namen <gruppenname>-<nachname>-<vorprojekt>

I Repository freigegeben für:

Stephan Barth, Steffen Jost und den jeweiligen Gruppentutor. Vollzugriff erforderlich!

Members > Add Members als Developer Abgabe Einzelprojekte

erfolgt automatisch über das freigegebene Repository!

(32)

.gitignore

Vorsicht, nicht alle Dateien ins Repository einstellen!

Ins Repository gehören:

I Alle .java und .fxml Dateien Niemals ins Repository:

I keine IDE-Dateien (z.B. bei intellij nicht .idea)

I keine Konfigurationsdateien mit absoluten Pfadangaben

I keine temporären/erzeugten Dateien

In einer Datei .gitignore kann angegeben werden, welche Dateien und Pfade von git ignoriert werden sollen.

Vorlage auf SEP Homepage verfügbar.

(33)

git für Gruppenprojekte

Für jedes Gruppenprojekt wird erneut jeweils ein frisches Projekt in gitlab angelegt: <gruppenname>-<projektname>

Ein Gruppenmitglied erstellt es und gewährt anderen Gruppenmitgliedern Schreibzugriff, Tutoren Lesezugriff Members > Add Members

Gruppenmitglieder: git clone <url des projekts>

Gruppenrepsitory auf gitlab.cip.ifi.lmu.de

jedes Gruppenmitglied hat ein lokales Repository

(34)

git mit intellij oder Eclipse

Anlegen eines gemeinsamen Eclipse-Projekts:

(Details siehe Screencast auf Praktikumshomepage)

Einmal für jede Gruppe:

I In Editor ein Java-Projekt anlegen

I Projektdateien in ein lokales git-Repository einchecken

I .gitignore nicht vergessen, ggf. anpassen

I git-Repository auf gitlab.cip.ifi.lmu.de anlegen

I Push vom lokalen git-Repository auf das gitlab-Repository Rest der Gruppe:

I Import des Java-Projekts direkt von gitlab

I das Hauptrepository wird dabei gecloned

(35)

git mit intellij

Durch die Entwicklungsumgebung vereinfachen sich viele

Arbeitsschritte: z.B. bietet intellij zwei Knöpfe für pull und push an, wobei letzterer mit Hilfe der Dialoge eine Kombination von add + commit + push ist.

Auch Merging im Falle von Konflikten wird bequem grafisch dargestellt.

Status der Dateien ist Farbcodiert:

Rot Datei nicht im Repository

Grün Datei added, aber noch nicht committed

Blau Datei seit letzter Revision geändert, noch nicht committed Schwarz Datei im Repository und unverändert

Referenzen

ÄHNLICHE DOKUMENTE

Der remote branch enthält 7 commits die lokal nicht verfügbar sind, es sind keine lokalen Änderungen gemacht worden. • Your branch and 'origin/master' have diverged, and have 2 and 3

git branch NAME neuen Branch anlegen (Zeiger auf aktuellen Commit) git checkout NAME zu Branch NAME wechseln (HEAD-Zeiger setzen). Mergen (Zusammenf¨ uhren

git pull origin master # Hier wird eventuell Konflikt angezeigt git push origin master.

- Erst jetzt kommuniziert das lokale Repository mit dem online Repository - Öffnen mit Rechtsklick auf Projekt → Team → Push Branch „master“.

commit: 24b9da commit: 31fa5a commit: 8b5cx3 commit: d3aff1 commit: aa85fg.

Auch wenn das Gelingen der Arbeitsphase an Gruppentischen belohnt wird, sollte man sensibel da- für sein, dass nicht immer wieder Einzelne stigmatisiert werden, weil sie es

Zusammenfassung: Wasser, Konflikte und soziales Kapital im Hohen Atlas Südmarokkos In diesem Beitrag über den ungleichen Zugang zu Trinkwasser stehen die sozialen und politischen

Überlegen Sie sich für jedes Beispiel drei Gründe, die zum Streit führen können3. In der Schule kommen unterschiedliche