Arbeiten mit Git
Arbeiten mit Git Member of the Helmholtz-Association 28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) PGI/JCNS
- Seite 2 und 3: Arbeiten mit Git Vortragsteile Teil
- Seite 4 und 5: Inhaltsverzeichnis Was ist Git? Wie
- Seite 6 und 7: Wieso Versionsverwaltung? Vorteile
- Seite 8 und 9: Git Konzepte Verteiltes Versionsver
- Seite 10 und 11: Git Konzepte Snapshots statt Diffs
- Seite 12 und 13: Git Konzepte Hashes Jedes Objekt (D
- Seite 14 und 15: Git Konzepte Volle Kontrolle Git f
- Seite 16 und 17: Git Konzepte Staging Area Repositor
- Seite 18 und 19: Git Basics Neues Git-Repository anl
- Seite 20 und 21: Git Basics Zentrales Repository ini
- Seite 22 und 23: Git Basics Zustand als Commit siche
- Seite 24 und 25: Git Basics Aktuellen Repository-Sta
- Seite 26 und 27: Git Basics History ab aktuellem Com
- Seite 28 und 29: Git Basics Dateien/Verzeichnisse ig
- Seite 30 und 31: Git Basics Branching - Einige Inter
- Seite 32 und 33: Git Basics Branching - Einige Inter
- Seite 34 und 35: Git Basics Branching - Einige Inter
- Seite 36 und 37: Git Basics Branching - Einige Inter
- Seite 38 und 39: Git Basics Branching - Einige Inter
- Seite 40 und 41: Git Basics Branching - Zweig erstel
- Seite 42 und 43: Git Basics Branching - Aktiven Zwei
- Seite 44 und 45: Git Basics Branching - Detached HEA
- Seite 46 und 47: Git Basics Branching - Detached HEA
- Seite 48 und 49: Git Basics Zweige zusammenführen G
- Seite 50 und 51: Git Basics Zweige zusammenführen -
<strong>Arbeiten</strong> <strong>mit</strong> <strong>Git</strong><br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) PGI/JCNS
<strong>Arbeiten</strong> <strong>mit</strong> <strong>Git</strong><br />
Vortragsteile<br />
Teil I:<br />
Einführung in die Grundlagen<br />
Teil II:<br />
Grundlagen sinnvoll in der Praxis anwenden<br />
Mögliche Workflows<br />
Vorstellung von Tools, die auf <strong>Git</strong> aufbauen<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 2
<strong>Arbeiten</strong> <strong>mit</strong> <strong>Git</strong><br />
Teil I: Einführung in <strong>Git</strong><br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de)
Inhaltsverzeichnis<br />
Was ist <strong>Git</strong>?<br />
Wieso Versionsverwaltung?<br />
<strong>Git</strong> Konzepte<br />
<strong>Git</strong> Basics<br />
Member of the Helmholtz-Association<br />
Nützliches<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 4
Was ist <strong>Git</strong>?<br />
Verteiltes Versionsverwaltungssystem<br />
Zur Verwaltung der Linux-Kernel-Sourcen entwickelt<br />
Member of the Helmholtz-Association<br />
Engl. Ausdruck für Depp/Idiot,<br />
Grund für die Namensgebung:<br />
Linus Torvalds:<br />
„I name all my projects after myself. First ‘Linux’, now ‘<strong>Git</strong>’.“<br />
Kurz, gut auf einer Tastatur als Kommando zu tippen<br />
In der Software-Welt bisher unbenutzt<br />
Von vielen bekannten Projekten genutzt, wie<br />
Android, Gnome, KDE, LibreOffice, Qt, VLC . . .<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 5
Wieso Versionsverwaltung?<br />
Vorteile für jeden einzelnen Entwickler<br />
Sicherung des Arbeitsstandes in Form logischer Schritte<br />
⇒ Rückkehr zu älteren Entwicklungsständen jederzeit möglich<br />
Code eines Projektes kann einfach auf mehreren Rechnern<br />
synchron gehalten werden (→ rsync <strong>mit</strong> Extras)<br />
Member of the Helmholtz-Association<br />
Rücksprung zur letzten lauffähigen Version, indem der<br />
aktuelle Arbeitsstand temporär aufgehoben wird (→<br />
Stashing)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 6
Wieso Versionsverwaltung?<br />
Vorteile für eine Gruppe von Entwicklern<br />
Leichter Code-Austausch zwischen allen Entwicklern<br />
Arbeitsschritte aller Entwickler nachvollziehbar (Logs)<br />
Verschiedene Entwicklungsweisen möglich:<br />
Isoliertes <strong>Arbeiten</strong> an einem Feature (→ Branching)<br />
Zusammenarbeit an einem Feature<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 7
<strong>Git</strong> Konzepte<br />
Verteiltes Versionsverwaltungssystem<br />
Vollständige Verteilung<br />
⇒ Jeder Entwickler hat lokale Kopie des gesamten Repositories<br />
Repository: Container <strong>mit</strong> gesamter Entwicklungsgeschichte<br />
⇒ <strong>Arbeiten</strong> ohne Netzwerkanbindung möglich;<br />
Netzwerk nur zur Synchronisierung notwendig<br />
Member of the Helmholtz-Association<br />
Es kann dennoch ein zentrales Repository existieren<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 8
<strong>Git</strong> Konzepte<br />
Verteiltes Versionsverwaltungssystem<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 9
<strong>Git</strong> Konzepte<br />
Snapshots statt Diffs<br />
Konventioneller Ansatz:<br />
Konventionelle Versionierungssysteme sind Datei-basiert<br />
⇒ Revisionszähler für jede Datei<br />
⇒ Intern: Speicherung von Diffs zwischen Versionen einer Datei<br />
Com<strong>mit</strong> 1 Com<strong>mit</strong> 2 Com<strong>mit</strong> 3<br />
File A<br />
∆ A<br />
Member of the Helmholtz-Association<br />
File B<br />
∆ B<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 10
<strong>Git</strong> Konzepte<br />
Snapshots statt Diffs<br />
Ansatz bei <strong>Git</strong>:<br />
Gesamtes Projekt als Belegung eines Dateisystems ansehen<br />
Speichern des Arbeitsstandes führt zum Abbild der aktuellen<br />
Dateisystembelegung als Ganzes (→ Com<strong>mit</strong>)<br />
⇒ Führt zur Vereinfachung anderer Konzepte (s. Branching)<br />
Com<strong>mit</strong> 1 Com<strong>mit</strong> 2 Com<strong>mit</strong> 3<br />
Member of the Helmholtz-Association<br />
File A<br />
File A2<br />
File A2<br />
File B<br />
File B<br />
File B2<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 11
<strong>Git</strong> Konzepte<br />
Hashes<br />
Jedes Objekt (Datei, Com<strong>mit</strong> usw.) erhält einen Hashwert<br />
⇒ Direkte Referenzierung einzelner Objekte über Hash möglich<br />
Jede Projektänderung führt zur Änderung der Hash-Werte<br />
⇒ <strong>Git</strong> erkennt sofort, dass und wie Änderungen vorgenommen<br />
wurden (z. B. Dateiverschiebungen)<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 12
<strong>Git</strong> Konzepte<br />
Nicht-lineare Entwicklung<br />
Für jedes Feature ein eigener, isolierter Zweig möglich<br />
⇒ Features, die parallel entwickelt werden, behindern sich nicht<br />
⇒ Releases und Entwicklungsversionen können voneinander<br />
getrennt werden<br />
Member of the Helmholtz-Association<br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 13
<strong>Git</strong> Konzepte<br />
Volle Kontrolle<br />
<strong>Git</strong> fügt nur Daten zu einem Repository hinzu; alte Versionen<br />
bleiben erhalten<br />
Über force-Parameter kann Löschen von Daten erzwungen<br />
werden<br />
Gelöschte Objekte verweilen noch eine Zeit im Repository,<br />
bevor sie endgültig entfernt werden<br />
Member of the Helmholtz-Association<br />
⇒ Können über ihren Hash weiterhin adressiert werden<br />
(s. reflog)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 14
<strong>Git</strong> Konzepte<br />
Staging Area<br />
Staging Area: Bereich <strong>mit</strong> den Daten, die in den nächsten<br />
Com<strong>mit</strong> aufgenommen werden<br />
⇒ Geänderte / Neue Dateien müssen zunächst zur Staging Area<br />
hinzugefügt werden, bevor sie in einen Com<strong>mit</strong> wandern<br />
Änderungen an bereits zur Staging Area hinzugefügten<br />
Dateien werden nicht automatisch übernommen<br />
Member of the Helmholtz-Association<br />
⇒ Zusätzliche Komplexität, ermöglicht aber, nur<br />
Teiländerungen zu com<strong>mit</strong>ten<br />
Komplexität kann fast vollständig eliminiert werden<br />
(→ git com<strong>mit</strong> -a)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 15
<strong>Git</strong> Konzepte<br />
Staging Area<br />
Repository<br />
com<strong>mit</strong><br />
checkout<br />
Staging Area<br />
add<br />
Member of the Helmholtz-Association<br />
Working Copy<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 16
<strong>Git</strong> Basics<br />
Neues <strong>Git</strong>-Repository anlegen<br />
Lokales Repository ohne zentralen Server anlegen:<br />
cd <br />
git init<br />
Member of the Helmholtz-Association<br />
Legt .git-Unterverzeichnis an<br />
⇒ Umwandlung eines bestehenden, u. U. belegten Verzeichnisses in<br />
ein <strong>Git</strong>-Repository<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 17
<strong>Git</strong> Basics<br />
Neues <strong>Git</strong>-Repository anlegen<br />
Zentrales Repository erstellen:<br />
mkdir . git<br />
cd . git<br />
git init -- bare<br />
Member of the Helmholtz-Association<br />
Erstellung immer <strong>mit</strong> --bare<br />
⇒ Repository hat keine eigene Working Copy<br />
Zwingend erforderlich, um in das Repository pushen zu können<br />
Anschließend muss eine lokale Kopie geklont werden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 18
<strong>Git</strong> Basics<br />
Zentrales Repository klonen<br />
Klonen:<br />
Vollständige, lokale Kopie eines anderen Repositories erstellen<br />
git clone @: < Repository -Pfad ><br />
[ Verzeichnis - Name ]<br />
Verbindet sich per Default über ssh (read+write <strong>mit</strong> User-ID)<br />
Alternative: git-Protokoll über speziellen Dienst<br />
(read only, keine Authentifizierung)<br />
Member of the Helmholtz-Association<br />
Beispiel:<br />
git clone heimbach@ifflinux : git_vortrag . git<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 19
<strong>Git</strong> Basics<br />
Zentrales Repository initialisieren<br />
Einige <strong>Git</strong>-Kommandos erfordern Vorhandensein min. eines<br />
Com<strong>mit</strong>s<br />
⇒ Ist das geklonte Repository noch vollständig unbeschrieben,<br />
so sollte es initialisiert werden:<br />
Member of the Helmholtz-Association<br />
touch . gitignore<br />
git add . gitignore<br />
git com<strong>mit</strong> -m " Initial com<strong>mit</strong> "<br />
git push -u origin master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 20
<strong>Git</strong> Basics<br />
Dateien/Verzeichnisse unter Versionsverwaltung stellen<br />
Dateien müssen explizit unter <strong>Git</strong>-Verwaltung gestellt werden:<br />
git add <br />
⇒ Aktuellen Stand zur Staging Area hinzufügen<br />
(→ für den nächsten Com<strong>mit</strong> vormerken)<br />
git add auf Verzeichnisse wirkt rekursiv<br />
Member of the Helmholtz-Association<br />
Problem: <strong>Git</strong> arbeitet Datei-basiert<br />
⇒ Leere Verzeichnisse können nicht verwaltet werden!<br />
Workaround: Leere .gitignore im Verzeichnis anlegen<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 21
<strong>Git</strong> Basics<br />
Zustand als Com<strong>mit</strong> sichern<br />
Inhalt der Staging Area sichern:<br />
git<br />
com<strong>mit</strong><br />
Anschließend Abfrage einer Com<strong>mit</strong>-Message<br />
Alternativ: Angabe der Option -m ""<br />
⇒ Vor jedem Com<strong>mit</strong> muss jede zu sichernde Datei erneut <strong>mit</strong><br />
git add zur Staging Area hinzugefügt werden<br />
Abgekürztes Verfahren:<br />
Member of the Helmholtz-Association<br />
git com<strong>mit</strong> -a<br />
Jede jemals <strong>mit</strong> git add hinzugefügte Datei wird in den<br />
Com<strong>mit</strong> aufgenommen<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 22
<strong>Git</strong> Basics<br />
Verwaltete Dateien löschen/verschieben<br />
<strong>Git</strong>-Befehle zum Löschen/Verschieben sind identisch zu den<br />
entsprechenden Unix-Befehlen<br />
Datei/Verzeichnis löschen:<br />
git rm <br />
git rm -r <br />
Datei/Verzeichnis verschieben:<br />
git mv <br />
Member of the Helmholtz-Association<br />
Änderungen werden in der Staging Area vermerkt<br />
Standard rm / mv auch verwendbar, da <strong>Git</strong> Änderungen<br />
nachträglich meist richtig zuordnen kann (→ Hashing)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 23
<strong>Git</strong> Basics<br />
Aktuellen Repository-Status abfragen<br />
git<br />
status<br />
Gibt Informationen zum Zustand der eigenen Arbeitskopie<br />
aus:<br />
Dateien, die nicht von <strong>Git</strong> verwaltet werden<br />
Gegenüber dem letzten Com<strong>mit</strong> modifizierte Dateien<br />
Dateien, die sich in der Staging Area befinden<br />
Synchronisierungsstand <strong>mit</strong> Remote-Repositories<br />
Member of the Helmholtz-Association<br />
⇒ Sollte vor jedem Com<strong>mit</strong> aufgerufen werden, da<strong>mit</strong> kein<br />
git add vergessen werden kann!<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 24
<strong>Git</strong> Basics<br />
History ab aktuellem Com<strong>mit</strong> betrachten<br />
History ab dem aktuellen Com<strong>mit</strong> anzeigen:<br />
git<br />
log<br />
Listet alle Com<strong>mit</strong>s in der Form<br />
com<strong>mit</strong> 7 b248e002e56a1ed23d32f317e6a1eace1917b4e<br />
Author : Ingo Heimbach <br />
Date : Thu Mar 20 10:48:25 2014 +0100<br />
Hallo Welt hinzugefuegt<br />
Member of the Helmholtz-Association<br />
--graph zeigt zusätzlich Verzweigungen als ASCII-Art<br />
--oneline gibt jeden Com<strong>mit</strong> kompakt in nur einer Zeile aus<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 25
<strong>Git</strong> Basics<br />
History ab aktuellem Com<strong>mit</strong> betrachten<br />
Beispiel für git log --graph --oneline:<br />
Member of the Helmholtz-Association<br />
* b895d43 Merge branch ’develop’<br />
|\<br />
| * 1afabc4 Merge branch ’feature-hallo_welt’ into develop<br />
| |\<br />
| | * fc78310 Hallo Welt <strong>mit</strong> persoenlicher Begruessung!<br />
| | * 99c432f Hallo Welt hinzugefuegt<br />
| |/<br />
| * 89d2759 .gitignore angepasst<br />
|/<br />
* 63cfced Initial com<strong>mit</strong><br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 26
<strong>Git</strong> Basics<br />
Dateien/Verzeichnisse ignorieren<br />
Manche Dateien/Dateitypen sollten nicht versioniert werden<br />
Compiler-Output (*.o, *.so, main)<br />
Temporärer L A TEX-Output (*.aux, *.log, *.lof usw.)<br />
. . .<br />
Member of the Helmholtz-Association<br />
Probleme:<br />
git add auf ein Verzeichnis würde diese Dateien hinzufügen<br />
git status listet alle temporären Dateien immer auf<br />
⇒ Wird unbrauchbar durch die Masse<br />
Lösung: Pflege einer .gitignore-Datei<br />
Liste von ignorierten Dateien/Verzeichnissen<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 27
<strong>Git</strong> Basics<br />
Dateien/Verzeichnisse ignorieren<br />
Syntax an regulären Ausdrücken der Bash angelehnt:<br />
# Comment<br />
*. so<br />
*.[ oa] # *.o und *.a ignorieren<br />
! libgr .so # nicht ignorieren<br />
build / # Verzeichnis muss <strong>mit</strong> / beendet werden<br />
/ manual /*. pdf # pdf nur in manual / ignorieren<br />
Nachträgliches Ignorieren von Dateien:<br />
git rm -- cached <br />
Member of the Helmholtz-Association<br />
Das Versionieren ignorierter Dateien kann <strong>mit</strong> --force<br />
(Kurzform: -f) erzwungen werden:<br />
git add -f <br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 28
<strong>Git</strong> Basics<br />
Branching<br />
Behandelt die Verzweigung des Arbeitsflusses in parallele<br />
Pfade und deren anschließendes Zusammenführen<br />
⇒ Nicht-lineare Entwicklung <strong>mit</strong> isolierten Arbeitsumgebungen<br />
Kann zu einer unübersichtlichen Entwicklungs-History führen<br />
Die History kann jedoch nachträglich linearisiert werden<br />
(→ git rebase)<br />
Member of the Helmholtz-Association<br />
Erzeugt zusätzlichen Overhead bei der Entwicklung,<br />
für die Vorteile aber vollkommen vertretbar<br />
Branching sollte in den normalen Arbeitsfluss integriert sein<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 29
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
<strong>Git</strong> speichert Com<strong>mit</strong>s als einfach verkettete Liste:<br />
head / branch<br />
Com<strong>mit</strong> Com<strong>mit</strong> Com<strong>mit</strong><br />
Zeit<br />
Member of the Helmholtz-Association<br />
Zeigerrichtung ist entgegen der Zeitrichtung<br />
⇒ Com<strong>mit</strong>s kennen ihre Vergangenheit, aber nicht ihre Zukunft<br />
Interpretation des Listenanfangs (head-Zeiger) als Branch<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 30
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
Beliebige Anzahl von Branches in <strong>Git</strong> möglich<br />
Ein Zweig kann als aktiver gesetzt werden<br />
Ein neu erstellter Com<strong>mit</strong> zeigt auf den letzten head-Com<strong>mit</strong><br />
des aktiven Zweiges<br />
Branch-Zeiger wird danach auf neuen Com<strong>mit</strong> gesetzt<br />
Aktiver Zweig wird <strong>mit</strong> HEAD referenziert<br />
head / branch1 head / branch2 HEAD<br />
Member of the Helmholtz-Association<br />
Com<strong>mit</strong><br />
Com<strong>mit</strong><br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 31
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
Beliebige Anzahl von Branches in <strong>Git</strong> möglich<br />
Ein Zweig kann als aktiver gesetzt werden<br />
Ein neu erstellter Com<strong>mit</strong> zeigt auf den letzten head-Com<strong>mit</strong><br />
des aktiven Zweiges<br />
Branch-Zeiger wird danach auf neuen Com<strong>mit</strong> gesetzt<br />
Aktiver Zweig wird <strong>mit</strong> HEAD referenziert<br />
head / branch1<br />
HEAD<br />
head / branch2<br />
Member of the Helmholtz-Association<br />
Com<strong>mit</strong> Com<strong>mit</strong> Com<strong>mit</strong><br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 31
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
Die Nutzung mehrerer Branches ermöglicht so<strong>mit</strong> eine<br />
Verzweigung der Liste<br />
head / branch1<br />
HEAD<br />
Com<strong>mit</strong><br />
Member of the Helmholtz-Association<br />
head / branch2<br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 32
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
Die Nutzung mehrerer Branches ermöglicht so<strong>mit</strong> eine<br />
Verzweigung der Liste<br />
Com<strong>mit</strong><br />
head / branch1<br />
Com<strong>mit</strong><br />
HEAD<br />
Member of the Helmholtz-Association<br />
head / branch2<br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 32
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
Die Nutzung mehrerer Branches ermöglicht so<strong>mit</strong> eine<br />
Verzweigung der Liste<br />
Com<strong>mit</strong><br />
head / branch1<br />
Com<strong>mit</strong><br />
Member of the Helmholtz-Association<br />
head / branch2 HEAD<br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 32
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
Die Nutzung mehrerer Branches ermöglicht so<strong>mit</strong> eine<br />
Verzweigung der Liste<br />
Com<strong>mit</strong><br />
head / branch1<br />
Com<strong>mit</strong><br />
HEAD<br />
Member of the Helmholtz-Association<br />
Com<strong>mit</strong> head / branch2<br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 32
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
Com<strong>mit</strong>s können mehrere Vorgänger haben<br />
⇒ Zusammenführen von Verzweigungen möglich<br />
Com<strong>mit</strong><br />
head / branch1<br />
Com<strong>mit</strong><br />
HEAD<br />
Member of the Helmholtz-Association<br />
Com<strong>mit</strong> head / branch2<br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 33
<strong>Git</strong> Basics<br />
Branching – Einige Interna zum besseren Verständnis<br />
Com<strong>mit</strong>s können mehrere Vorgänger haben<br />
⇒ Zusammenführen von Verzweigungen möglich<br />
head / branch1<br />
Com<strong>mit</strong><br />
HEAD<br />
Com<strong>mit</strong><br />
Com<strong>mit</strong><br />
Member of the Helmholtz-Association<br />
Com<strong>mit</strong> head / branch2<br />
Zeit<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 33
<strong>Git</strong> Basics<br />
Branching – Zweig erstellen<br />
master: Default-Zweig, aktiv nach git init/clone<br />
Erstellen eines neuen Zweiges:<br />
git branch <br />
Der Zweig zeigt auf den Com<strong>mit</strong>, auf den auch HEAD zeigt<br />
H<br />
master<br />
Member of the Helmholtz-Association<br />
test<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 34
<strong>Git</strong> Basics<br />
Branching – Zweig erstellen<br />
Auflisten aller schon vorhandenen Zweige über<br />
git branch -a<br />
Ohne -a werden nur lokale Zweige aufgelistet<br />
Löschen eines Zweiges:<br />
git branch -d <br />
Member of the Helmholtz-Association<br />
Aktion nicht möglich bei resultierendem Datenverlust<br />
Datenverlust kann <strong>mit</strong> -D erzwungen werden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 35
<strong>Git</strong> Basics<br />
Branching – Aktiven Zweig setzen<br />
Auf einen Zweig wechseln (→ HEAD setzen):<br />
git checkout <br />
H<br />
master<br />
test<br />
Member of the Helmholtz-Association<br />
Zweig erstellen und direkt als aktiv setzen:<br />
git checkout -b <br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 36
<strong>Git</strong> Basics<br />
Branching – Aktiven Zweig setzen<br />
Auf einen Zweig wechseln (→ HEAD setzen):<br />
git checkout <br />
master<br />
H<br />
test<br />
Member of the Helmholtz-Association<br />
Zweig erstellen und direkt als aktiv setzen:<br />
git checkout -b <br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 36
<strong>Git</strong> Basics<br />
Branching – Detached HEAD<br />
Member of the Helmholtz-Association<br />
Statt auf einen Zweig kann HEAD auch direkt auf einen<br />
beliebigen Com<strong>mit</strong> gesetzt werden<br />
Auswahl eines Com<strong>mit</strong>s möglich über:<br />
Hash-Wert<br />
relativ zu Zeigern (z. B. Zweigen)<br />
über Logbuch<br />
⇒ Entwicklungen auf Basis alter Com<strong>mit</strong>s möglich<br />
Beispiele:<br />
git checkout c00cfe # Teil - Hash moeglich<br />
git checkout master ~ # Com<strong>mit</strong> vor master<br />
git checkout HEAD ~3 # 3 Com<strong>mit</strong>s vor HEAD<br />
git checkout master ^2 # 2. Eltern - Com<strong>mit</strong><br />
git checkout master@ {5} # master vor 5 Com<strong>mit</strong>s<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 37
<strong>Git</strong> Basics<br />
Branching – Detached HEAD<br />
Praktisches Beispiel:<br />
H<br />
master<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 38
<strong>Git</strong> Basics<br />
Branching – Detached HEAD<br />
Praktisches Beispiel:<br />
git checkout master ~ # Com<strong>mit</strong> vor master<br />
H<br />
master<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 38
<strong>Git</strong> Basics<br />
Branching – Detached HEAD<br />
Praktisches Beispiel:<br />
git checkout master ~ # Com<strong>mit</strong> vor master<br />
git com<strong>mit</strong><br />
master<br />
Member of the Helmholtz-Association<br />
H<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 38
<strong>Git</strong> Basics<br />
Branching – Detached HEAD<br />
Praktisches Beispiel:<br />
git checkout master ~ # Com<strong>mit</strong> vor master<br />
git com<strong>mit</strong><br />
git branch dev # Com<strong>mit</strong> sichern<br />
master<br />
Member of the Helmholtz-Association<br />
H<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 38<br />
dev
<strong>Git</strong> Basics<br />
Zweige zusammenführen<br />
<strong>Git</strong> kennt zwei Arten, Zweige zusammenzuführen:<br />
Merging:<br />
Verzweigungen bleiben in der History erhalten<br />
Erstellung eines Merge-Com<strong>mit</strong>s, falls notwendig<br />
Member of the Helmholtz-Association<br />
Rebasing:<br />
Erstellt aus einem Zweig eine Art Diff-Patch und wendet diesen<br />
auf einen zweiten Zweig an<br />
⇒ Linearisierung der History<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 39
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Merging<br />
Angegebenen Zweig <strong>mit</strong> dem aktiven Zweig zusammenführen:<br />
git merge <br />
<strong>Git</strong> entscheidet automatisch über die Merge-Strategie:<br />
Fast-Forward-Merge:<br />
Wird verwendet, wenn der aktive Zweig in der Vergangenheit des<br />
angegebenen Zweigs vollständig enthalten ist<br />
⇒ Setze aktiven Zweig auf die Position des angegebenen vor<br />
Member of the Helmholtz-Association<br />
Three-Way-Merge:<br />
Wird ansonsten eingesetzt<br />
⇒ Findet die gemeinsame Wurzel und macht darüber einen Abgleich<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 40
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Merging<br />
Beispiel (Fast-Forward-Merge):<br />
dev<br />
H<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 41
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Merging<br />
Beispiel (Fast-Forward-Merge):<br />
git checkout master<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 41<br />
H
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Merging<br />
Beispiel (Fast-Forward-Merge):<br />
git checkout master<br />
git merge dev<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 41<br />
H
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Merging<br />
Beispiel (Three-Way-Merge):<br />
H<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 42
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Merging<br />
Beispiel (Three-Way-Merge):<br />
git checkout master<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 42<br />
H
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Merging<br />
Beispiel (Three-Way-Merge):<br />
git checkout master<br />
git merge dev<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 42<br />
H
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Merging<br />
Beispiel (Three-Way-Merge):<br />
git checkout master<br />
git merge dev<br />
dev<br />
H<br />
master<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 42
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing<br />
Aktiven Zweig auf einen anderen Zweig neu aufsetzen:<br />
git rebase <br />
Member of the Helmholtz-Association<br />
Rebasing ähnelt dem Einspielen von Patches:<br />
1 <strong>Git</strong> sucht den gemeinsamen Vorfahren beider Zweige<br />
2 Von dieser Wurzel aus werden die Änderungen im aktiven<br />
Zweig aus jedem Com<strong>mit</strong> extrahiert (Diff-Patch)<br />
3 Die Patches werden auf den ausgewählten Zweig aufgespielt<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 43
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing<br />
Beispiel:<br />
H<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 44
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing<br />
Beispiel:<br />
git rebase master<br />
H<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 44
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing<br />
Beispiel:<br />
git rebase master<br />
H<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 44
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing<br />
Beispiel:<br />
git rebase master<br />
git checkout master<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 44<br />
H
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing<br />
Beispiel:<br />
git rebase master<br />
git checkout master<br />
git merge dev<br />
dev<br />
Member of the Helmholtz-Association<br />
H<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 44
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Advanced Rebasing<br />
Rebasing kann präzise gesteuert werden:<br />
git rebase [< Checkout >] [-- onto<br />
]<br />
:<br />
:<br />
Wird vor dem Rebase ausgecheckt<br />
Zweig, auf dem die Patches aufgespielt werden<br />
(Default: )<br />
Übertragung eines Com<strong>mit</strong>-Bereichs auf eine neue Basis<br />
Member of the Helmholtz-Association<br />
-i startet interaktive Shell, <strong>mit</strong> der die Reihenfolge und die<br />
Art des Aufspielens gesteuert werden kann<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 45
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Advanced Rebasing<br />
Beispiel:<br />
H<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 46
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Advanced Rebasing<br />
Beispiel:<br />
git rebase dev ~2 dev -- onto master<br />
H<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 46
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Advanced Rebasing<br />
Beispiel:<br />
git rebase dev ~2 dev -- onto master<br />
dev<br />
H<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 46
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing von Merge-Com<strong>mit</strong>s<br />
Rebasing von Merge-Com<strong>mit</strong>s<br />
Rebasing erzeugt (per Default) ein vollständig lineares<br />
Ergebnis!<br />
⇒ Merge-Com<strong>mit</strong>s werden beim Rebasing verworfen<br />
Aus allen anderen Com<strong>mit</strong>s werden Diff-Patches extrahiert,<br />
die chronologisch aufgespielt werden<br />
Member of the Helmholtz-Association<br />
Option -p: Merge-Com<strong>mit</strong>s werden nachgebildet<br />
(-p ̂= --preserve-merges)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 47
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing von Merge-Com<strong>mit</strong>s<br />
Beispiel:<br />
1 dev H<br />
2<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 48
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing von Merge-Com<strong>mit</strong>s<br />
Beispiel:<br />
git rebase master<br />
1 dev H<br />
2<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 48
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing von Merge-Com<strong>mit</strong>s<br />
Beispiel:<br />
git rebase master<br />
H<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
1 2<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 48
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing von Merge-Com<strong>mit</strong>s<br />
Beispiel <strong>mit</strong> Option -p:<br />
dev<br />
H<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 49
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing von Merge-Com<strong>mit</strong>s<br />
Beispiel <strong>mit</strong> Option -p:<br />
git rebase -p master<br />
dev<br />
H<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 49
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Rebasing von Merge-Com<strong>mit</strong>s<br />
Beispiel <strong>mit</strong> Option -p:<br />
git rebase -p master<br />
Member of the Helmholtz-Association<br />
master<br />
H dev<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 49
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Konflikte<br />
<strong>Git</strong>’s Merging/Rebasing-Algorithmus arbeitet zeilenbasiert<br />
⇒ Änderungen auf parallelen Zweigen<br />
in derselben Datei und<br />
in derselben Zeile<br />
erzeugen einen Konflikt beim Zusammenführen<br />
<strong>Git</strong> markiert betroffene Zeilen und trägt beide Versionen ein<br />
Member of the Helmholtz-Association<br />
git status liefert zu editierende Dateien<br />
Weiteres Vorgehen von der Art der Zusammenführung<br />
abhängig (Merge oder Rebase)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 50
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Konflikte<br />
Beispiel eines eingetragenen Konfliktes:<br />
> feature - hallo - welt<br />
<strong>Git</strong> trennt Versionsblöcke durch Zeilen <strong>mit</strong> <br />
Member of the Helmholtz-Association<br />
Hinter > steht der Zweig, aus dem die Änderung<br />
stammt<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 51
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Konflikte bei Merge<br />
Member of the Helmholtz-Association<br />
Bei einem Merge werden alle Änderungen auf einmal<br />
zusammengeführt<br />
⇒ <strong>Git</strong> meldet alle Konflikte gemeinsam<br />
Bei Konflikten befindet sich <strong>Git</strong> weiterhin im Merge-Modus<br />
Ablauf:<br />
1 Konfliktbehaftete Dateien editieren<br />
2 Gelöste Konflikte durch git add anzeigen<br />
3 git com<strong>mit</strong> aufrufen, um den Merge-Com<strong>mit</strong> abzuschließen<br />
Alternativ kann der Merge-Modus durch<br />
git merge -- abort<br />
verlassen und der Merge rückgängig gemacht werden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 52
<strong>Git</strong> Basics<br />
Zweige zusammenführen – Konflikte bei Rebase<br />
Member of the Helmholtz-Association<br />
Rebasing führt Änderungen in Form einzelner Patches ein<br />
⇒ Jeder Patch kann neue Konflikte erzeugen<br />
Ablauf:<br />
1 Konfliktbehaftete Dateien editieren<br />
2 Gelöste Konflikte durch git add anzeigen<br />
3 Einspielen <strong>mit</strong> git rebase --continue fortsetzen<br />
4 1-3 <strong>mit</strong> allen konfliktbehafteten Patches wiederholen<br />
Vorzeitiger Abbruch des Rebasing <strong>mit</strong><br />
git rebase -- abort<br />
<strong>mit</strong> Wiederherstellung des Standes vor dem Rebase<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 53
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories<br />
Remote Repository: <strong>Git</strong>-Repository, welches vom eigenen<br />
lokalen Repository referenziert wird<br />
Datenabgleich <strong>mit</strong> anderen Entwicklern, indem Daten geholt<br />
(fetch) oder geschoben (push) werden<br />
Geklonte Repositories verfügen über eine Standard-Referenz<br />
auf die Quelle (origin)<br />
Member of the Helmholtz-Association<br />
Mit git remote können Referenzen beliebig verändert,<br />
gelöscht und hinzugefügt werden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 54
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – zentral vs. dezentral<br />
push<br />
fetch<br />
fetch<br />
push<br />
Member of the Helmholtz-Association<br />
fetch<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 55
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Entfernte Referenzen anpassen<br />
Eintragene Remote Repositories inkl. URLs ausgeben:<br />
git remote -v<br />
Entferntes Repository hinzufügen:<br />
git remote add <br />
Referenz entfernen:<br />
git remote remove <br />
Member of the Helmholtz-Association<br />
URL korrigieren:<br />
git remote set - url <br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 56
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Fetching<br />
git fetch <br />
Holt die gesamte History vom angegebenen Repository<br />
Holt nur die Änderungen zum aktuellen Stand<br />
git fetch ergänzt nur die lokale History<br />
– um entfernte Com<strong>mit</strong>s, Zweige, Tags . . .<br />
Member of the Helmholtz-Association<br />
⇒ Der lokale Stand bleibt unverändert erhalten!<br />
Mit --all werden alle eingetragenen Repositories abgefragt<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 57
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Fetching<br />
Beispiel:<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 58<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Fetching<br />
Beispiel:<br />
git remote add origin ifflinux : test_project<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 58<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Fetching<br />
Beispiel:<br />
git remote add origin ifflinux : test_project<br />
git fetch origin<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 58<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Geholte Daten verwenden<br />
Zweige entfernter Repositories werden über Präfixe<br />
konfliktfrei in das lokale Repository integriert (z. B. origin/)<br />
Diese können nicht wie lokal erstellte Zweige benutzt werden:<br />
Nur für den Abgleich <strong>mit</strong> entfernten Daten<br />
<strong>Git</strong>-Kommandos <strong>mit</strong> nur lokaler Wirkung haben keinen Effekt<br />
⇒ git checkout führt zu einem Detached HEAD<br />
Member of the Helmholtz-Association<br />
Es muss lokale Kopie des entfernten Zweigs erstellt werden<br />
Lokaler und entfernter Zweig werden meist verknüpft<br />
(Tracking Branch)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 59
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches<br />
Tracking Branch erstellen:<br />
git checkout -- track / < Zweig ><br />
Member of the Helmholtz-Association<br />
Die lokale Kopie kann wie ein gewöhnlicher Zweig<br />
bearbeitet werden<br />
Besonderheiten eines Tracking Branches:<br />
<strong>Git</strong> legt eine Verknüpfung zwischen lokalem und entferntem<br />
Zweig an<br />
git status gibt aus, wie der Synchronisierungsstand ist<br />
git fetch, pull, push können in verkürzter Form verwendet<br />
werden (später)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 60
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
git fetch ändert nur die Position der Remote Branches<br />
⇒ Änderungen müssen über Merging oder Rebasing in die<br />
lokalen Tracking Branches integriert werden<br />
Member of the Helmholtz-Association<br />
Um den Arbeitsauflauf zu vereinfachen, existiert git pull:<br />
Führt zunächst ein Fetch und dann ein Merge (Default) bzw.<br />
Rebase aus<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 61
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
Beispiel <strong>mit</strong> Merging:<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 62<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
Beispiel <strong>mit</strong> Merging:<br />
git fetch origin<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 62<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
Beispiel <strong>mit</strong> Merging:<br />
git fetch origin<br />
git merge origin / master<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 62<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
Beispiel <strong>mit</strong> Merging:<br />
# Alternativ :<br />
git pull<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 62<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
Beispiel <strong>mit</strong> Rebasing:<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 63<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
Beispiel <strong>mit</strong> Rebasing:<br />
git fetch origin<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 63<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
Beispiel <strong>mit</strong> Rebasing:<br />
git fetch origin<br />
git rebase origin / master<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 63<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Tracking Branches synchronisieren<br />
Beispiel <strong>mit</strong> Rebasing:<br />
# Alternativ :<br />
git pull -- rebase<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 63<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Eigene Änderungen verteilen<br />
Member of the Helmholtz-Association<br />
Dezentrale Arbeitsweise:<br />
Jeder kann auf die lokalen Repositories der anderen<br />
Team-Mitglieder lesend zugreifen<br />
Jeder holt <strong>mit</strong> git fetch die Daten von jedem anderen<br />
Integration der geholten Daten über Merging oder Rebasing<br />
Es findet kein Schieben von Daten statt (Push)<br />
Vorteile:<br />
Kein zentraler <strong>Git</strong>-Server nötig<br />
Kein Single-Point-of-Failure<br />
Nachteile:<br />
Kein Punkt, an dem alle Änderungen zusammengetragen werden<br />
⇒ Weniger Struktur, keine direkte Code-Basis<br />
Rechner aller Entwickler müssen direkt erreichbar sein<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 64
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Eigene Änderungen verteilen<br />
Member of the Helmholtz-Association<br />
Zentrale Arbeitsweise:<br />
Zentraler Server verwaltet Änderungen aller Team-Mitglieder<br />
Com<strong>mit</strong>s werden aktiv auf den Server geschoben (Push)<br />
Alle laden regelmäßig <strong>mit</strong> git fetch oder pull neue Daten<br />
Vorteile:<br />
Immer erreichbare Anlaufstelle, um die Entwicklung zu verfolgen<br />
Nachteile:<br />
Verwaltung des Servers notwendig<br />
Übliche Vorgehensweise für Projekte <strong>mit</strong> mehreren<br />
Mitarbeitern<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 65
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Eigene Änderungen verteilen<br />
Daten auf zentralen Server schieben:<br />
git push : < Entf . Zweig ><br />
Sendet alle zum lokalen Zweig gehörenden Daten zum Server<br />
und erstellt dort einen neuen Zweig <br />
Existiert der Zweig, so wird er umgesetzt, sofern dadurch<br />
keine Com<strong>mit</strong>s verloren gehen<br />
Member of the Helmholtz-Association<br />
Bei identischen Namen kann der Teil ab : weggelassen werden<br />
Option -u richtet einen Tracking Branch ein<br />
Pushen ist nur zu Bare-Repositories erlaubt!<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 66
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Eigene Änderungen verteilen<br />
Beispiel:<br />
git fetch origin<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 67<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Eigene Änderungen verteilen<br />
Beispiel:<br />
git fetch origin<br />
git merge origin / master<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 67<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Eigene Änderungen verteilen<br />
Beispiel:<br />
git fetch origin<br />
git merge origin / master<br />
git push -u origin master<br />
origin/master<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 67<br />
H
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Eigene Änderungen verteilen<br />
Situation, in der ein Push zurückgewiesen wird:<br />
origin/master<br />
master<br />
H<br />
Push würde einzigen Zeiger auf grüne Com<strong>mit</strong>s entfernen<br />
⇒ Die grünen Com<strong>mit</strong>s wären nicht mehr referenzierbar<br />
Member of the Helmholtz-Association<br />
⇒ Remote-Änderungen immer zuerst integrieren!<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 68
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Eigene Änderungen verteilen<br />
Situation, in der ein Push durchgeführt werden kann:<br />
origin/master<br />
master<br />
H<br />
Push würde einzigen Zeiger auf grüne Com<strong>mit</strong>s entfernen<br />
⇒ Die grünen Com<strong>mit</strong>s wären nicht mehr referenzierbar<br />
Member of the Helmholtz-Association<br />
⇒ Remote-Änderungen immer zuerst integrieren!<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 68
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Push und Rebase<br />
Push und Rebase<br />
Auf Com<strong>mit</strong>s, die bereits gepusht worden sind, darf kein Rebase<br />
angewendet werden!<br />
Rebasing verändert die History eines Zweigs:<br />
Com<strong>mit</strong>s des Zweigs werden als Patches extrahiert<br />
Die Patches werden auf einen anderen Zweig aufgespielt<br />
Push würde History des Servers überschreiben<br />
Member of the Helmholtz-Association<br />
⇒ Wird vom <strong>Git</strong>-Server verweigert<br />
⇒ Richtige Vorgehensweisen:<br />
Erst Rebase, dann Push oder<br />
Merge statt Rebase verwenden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 69
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Push und Rebase<br />
Demonstration der Problematik:<br />
origin/dev<br />
dev<br />
H<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 70
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Push und Rebase<br />
Demonstration der Problematik:<br />
git rebase master<br />
origin/dev<br />
dev<br />
H<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 70
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Push und Rebase<br />
Demonstration der Problematik:<br />
git rebase master<br />
origin/dev<br />
H<br />
dev<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 70
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Entfernte Zweige löschen<br />
Entfernte Zweige <strong>mit</strong> git push löschen:<br />
git push :< Entf . Zweig ><br />
→ Zweignamen ein „:“ vorstellen<br />
Eselsbrücke für die Syntax:<br />
Pushe „nichts“ an die Stelle des entfernten Zweiges<br />
Vorsicht<br />
Kann ohne Nachfrage zur Löschung von Com<strong>mit</strong>s führen!<br />
Member of the Helmholtz-Association<br />
⇒ Vorher sicher gehen, dass<br />
anderer Zweig die Com<strong>mit</strong>s beinhaltet oder<br />
die Com<strong>mit</strong>s nicht mehr benötigt werden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 71
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Gelöschte Zweige synchronisieren<br />
Auf Server gelöschte Zweige werden nicht <strong>mit</strong> git fetch<br />
auch bei anderen Team-Mitgliedern entfernt<br />
⇒ Synchronisierung gelöschter Zweige erfolgt manuell:<br />
git remote prune <br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 72
<strong>Git</strong> Basics<br />
<strong>Arbeiten</strong> <strong>mit</strong> Remote-Repositories – Kurzformen für fetch und push<br />
Auf Tracking Branches können git fetch und git pull<br />
ohne Argument aufgerufen werden<br />
Beziehen sich auf das Remote-Repository des aktiven Zweiges<br />
→ git fetch fragt das Remote-Repository des Tracking<br />
Branches ab<br />
Member of the Helmholtz-Association<br />
→ git push überträgt den Stand aller lokalen Zweige, sofern<br />
gleich benannte Zweige auf dem Server existieren (matching)<br />
git push kann auf den aktiven Zweig begrenzt werden<br />
(später)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 73
<strong>Git</strong> Basics<br />
Tagging<br />
Com<strong>mit</strong>s können markiert werden (Tagging)<br />
Member of the Helmholtz-Association<br />
3 Arten von Tags möglich:<br />
Lightweight Tags:<br />
Konstanter Zeiger auf einen bestimmten Com<strong>mit</strong><br />
⇒ Verhält sich wie ein unbeweglicher Zweig<br />
Annotated Tags:<br />
Zeiger <strong>mit</strong> eigenem Tag-Objekt<br />
⇒ Tags erhalten einen Hash, Ersteller, Datum, Nachricht, . . .<br />
Sollten immer bevorzugt genutzt werden<br />
Signed Tags:<br />
Annotated Tag <strong>mit</strong> GPG-Signatur<br />
⇒ Ersteller kann verifiziert werden<br />
Hier nicht weiter behandelt<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 74
<strong>Git</strong> Basics<br />
Tagging – Annotated Tag erstellen, Tags listen und löschen<br />
Annotated Tag erstellen:<br />
git tag -a <br />
Der Tag zeigt auf den aktuell ausgecheckten Com<strong>mit</strong><br />
-a wichtig, sonst wird ein Lightweight Tag erstellt!<br />
Alle erstellten Tags anzeigen:<br />
git tag<br />
Member of the Helmholtz-Association<br />
Tag wieder löschen:<br />
git tag -d <br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 75
<strong>Git</strong> Basics<br />
Tagging – Tags verteilen<br />
Tags zu einem Remote-Repository schicken:<br />
git push -- tags <br />
Ohne --tags überträgt git push keine Tags!<br />
Alle anderen erhalten die Tags über das nächste git fetch<br />
Löschen von Remote-Tags ähnelt Löschen von Zweigen:<br />
git push : refs / tags /<br />
Member of the Helmholtz-Association<br />
Remote gelöschte Tags werden nicht auch lokal entfernt<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 76
<strong>Git</strong> Basics<br />
Tagging – Gelöschte Tags synchronisieren<br />
Synchronisierung gelöschter Tags ist manuell möglich:<br />
1 Alle lokalen Tags löschen<br />
2 Alle Remote-Tags neu übertragen<br />
git tag | xargs git tag -d<br />
git fetch <br />
Member of the Helmholtz-Association<br />
xargs nimmt die Ausgabe von git tag zeilenweise entgegen<br />
und wendet sie als Argument auf git tag -d an<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 77
<strong>Git</strong> Basics<br />
Aktuellen Arbeitsstand <strong>mit</strong> letztem Com<strong>mit</strong> vergleichen<br />
Inhalt einer Datei <strong>mit</strong> dem Stand des letzten Com<strong>mit</strong>s<br />
vergleichen:<br />
git diff <br />
Alle Änderungen seit dem letzten Com<strong>mit</strong> anzeigen:<br />
git diff HEAD<br />
Member of the Helmholtz-Association<br />
Statt HEAD können beliebige Com<strong>mit</strong>s/Zweige/Tags als<br />
Vergleichsbasis angegeben werden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 78
<strong>Git</strong> Basics<br />
Aktuelle Änderungen temporär aufheben<br />
Alle Änderungen seit letztem Com<strong>mit</strong> wegspeichern:<br />
git<br />
stash<br />
Erzeugt einen neuen Eintrag im Stash (Stack)<br />
Änderungen erneut anwenden:<br />
git stash apply<br />
Member of the Helmholtz-Association<br />
Alle gespeicherten Einträge anzeigen:<br />
git stash list<br />
Inhalt des letzten Eintrages anzeigen:<br />
git stash show<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 79
<strong>Git</strong> Basics<br />
Aktuelle Änderungen temporär aufheben<br />
apply löscht angewandte Änderungen nicht vom Stack;<br />
manuelles Löschen des letzten Eintrages:<br />
git stash drop<br />
Kurzform für apply gefolgt von drop:<br />
git stash pop<br />
Anzuwendender Eintrag kann selektiert werden:<br />
Member of the Helmholtz-Association<br />
git stash apply / pop / show stash@ {n}<br />
Default ist n = 0<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 80
<strong>Git</strong> Basics<br />
Zweig auf anderen Com<strong>mit</strong> setzen<br />
Aktiven Zweig auf einen anderen Com<strong>mit</strong> umsetzen:<br />
git reset <br />
wird in Form eines Hashes, Zweigs, . . . referenziert<br />
Member of the Helmholtz-Association<br />
Optionen:<br />
--soft:<br />
--mixed:<br />
--hard:<br />
Behält die Staging Area und alle Modifikationen<br />
bei<br />
Verwirft die Staging Area, aber behält Dateiänderungen<br />
(default)<br />
Setzt die Working Copy vollständig auf den<br />
Stand des angegebenen Com<strong>mit</strong>s zurück<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 81
<strong>Git</strong> Basics<br />
Zweig auf anderen Com<strong>mit</strong> setzen<br />
Beispiel:<br />
master<br />
H<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 82
<strong>Git</strong> Basics<br />
Zweig auf anderen Com<strong>mit</strong> setzen<br />
Beispiel:<br />
git reset HEAD ~<br />
master<br />
H<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 82
<strong>Git</strong> Basics<br />
Änderungen rückgängig machen<br />
Änderungen an einer bestimmten Datei verwerfen:<br />
git checkout -- <br />
-- zur Unterscheidung von Zweig- und Dateinamen<br />
Datei aus der Staging Area entfernen ohne Änderungen zu<br />
verwerfen:<br />
git reset HEAD <br />
Member of the Helmholtz-Association<br />
Alle Änderungen seit dem letzten Com<strong>mit</strong> verwerfen:<br />
git reset -- hard HEAD<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 83
<strong>Git</strong> Basics<br />
Letzten Com<strong>mit</strong> rückgängig machen<br />
Member of the Helmholtz-Association<br />
2 Möglichkeiten: reset oder revert<br />
git reset:<br />
Setzt den Zweig um (s. letztes Beispiel)<br />
⇒ Com<strong>mit</strong> wird aus der History des Zweigs entfernt<br />
(Datenverlust!)<br />
⇒ Nur verwenden, wenn der Com<strong>mit</strong> nicht gepusht wurde<br />
git revert:<br />
Erstellt einen Undo-Com<strong>mit</strong><br />
⇒ Kein Datenverlust, Push stellt kein Problem dar<br />
⇒ Bläht die History auf<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 84
<strong>Git</strong> Basics<br />
Letzten Com<strong>mit</strong> um Änderungen erweitern<br />
Aktuelle Änderungen noch zum letzten Com<strong>mit</strong> hinzufügen:<br />
git com<strong>mit</strong> -- amend<br />
Verhält sich wie:<br />
git reset -- soft HEAD ~<br />
git com<strong>mit</strong><br />
Member of the Helmholtz-Association<br />
Alter Com<strong>mit</strong> nur dann verloren, wenn in keinem weiteren<br />
Zweig mehr enthalten<br />
Nur verwenden, wenn der Com<strong>mit</strong> noch nicht gepusht wurde<br />
Kann <strong>mit</strong> -a kombiniert werden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 85
<strong>Git</strong> Basics<br />
Letzten Com<strong>mit</strong> um Änderungen erweitern<br />
Beispiel:<br />
master<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 86<br />
dev<br />
H
<strong>Git</strong> Basics<br />
Letzten Com<strong>mit</strong> um Änderungen erweitern<br />
Beispiel:<br />
git com<strong>mit</strong> -- amend<br />
dev<br />
H<br />
master<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 86
<strong>Git</strong> Basics<br />
Gelöschte Com<strong>mit</strong>s retten<br />
Wird in <strong>Git</strong> ein Zweig/Tag gelöscht/umgesetzt, so werden<br />
nicht mehr erreichbare Com<strong>mit</strong>s nicht sofort gelöscht<br />
<strong>Git</strong> speichert den Verlauf aller Zweige und des HEAD-Zeigers,<br />
einsehbar <strong>mit</strong><br />
git reflog <br />
Per Default wird der Verlauf von HEAD ausgegeben<br />
Member of the Helmholtz-Association<br />
Liefert eine Ausgabe der Form:<br />
c718f8e HEAD@ {0}: com<strong>mit</strong> : Neue Version<br />
7 b248e0 HEAD@ {1}: com<strong>mit</strong> : Tolles Feature eingebaut<br />
c91a17b HEAD@ {2}: com<strong>mit</strong> : Readme update<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 87
<strong>Git</strong> Basics<br />
Gelöschte Com<strong>mit</strong>s retten<br />
HEAD@{0} ist die gegenwärtige HEAD-Position<br />
Die übrigen HEAD@{n} referenzieren die Vergangenheit des<br />
HEAD-Zeigers<br />
Beispiel:<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 88<br />
H
<strong>Git</strong> Basics<br />
Gelöschte Com<strong>mit</strong>s retten<br />
HEAD@{0} ist die gegenwärtige HEAD-Position<br />
Die übrigen HEAD@{n} referenzieren die Vergangenheit des<br />
HEAD-Zeigers<br />
Beispiel:<br />
git reset HEAD ~<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 88<br />
H
<strong>Git</strong> Basics<br />
Gelöschte Com<strong>mit</strong>s retten<br />
HEAD@{0} ist die gegenwärtige HEAD-Position<br />
Die übrigen HEAD@{n} referenzieren die Vergangenheit des<br />
HEAD-Zeigers<br />
Beispiel:<br />
git reset HEAD ~<br />
git checkout HEAD@ {1}<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 88<br />
H
<strong>Git</strong> Basics<br />
Gelöschte Com<strong>mit</strong>s retten<br />
HEAD@{0} ist die gegenwärtige HEAD-Position<br />
Die übrigen HEAD@{n} referenzieren die Vergangenheit des<br />
HEAD-Zeigers<br />
Beispiel:<br />
git reset HEAD ~<br />
git checkout HEAD@ {1}<br />
git branch temp<br />
temp<br />
Member of the Helmholtz-Association<br />
master<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 88<br />
H
<strong>Git</strong> Basics<br />
Working Copy aufräumen<br />
Alle Dateien löschen, die von git status als „untracked“<br />
markiert werden:<br />
git clean -f<br />
Zusätzlich alle von <strong>Git</strong> ignorierten Dateien entfernen:<br />
git clean -fx<br />
Member of the Helmholtz-Association<br />
-d löscht außerdem unversionierte Verzeichnisse<br />
-n statt -f liefert nur die Dateien, die entfernt würden<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 89
<strong>Git</strong> Basics<br />
Autor eines Code-Bereichs bestimmen<br />
Nicht immer offensichtlich, wer welchen Code geschrieben hat<br />
Das Kommando<br />
git annotate <br />
Member of the Helmholtz-Association<br />
gibt die gesamte Datei aus, aber ergänzt jede Zeile um<br />
Com<strong>mit</strong>-Hash der letzten Änderung<br />
Autor der Zeile<br />
Datum und Uhrzeit der letzten Modifikation<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 90
<strong>Git</strong> Basics<br />
Aktuellen Arbeitsstand exportieren<br />
Ziel: Aktuellen Entwicklungsstand als Archiv verschicken<br />
„Naive“ Lösung:<br />
tar/zip auf den eigenen Repository-Klon<br />
Member of the Helmholtz-Association<br />
Probleme:<br />
Unerwünschte Dateien, wie Build-Files, werden <strong>mit</strong>gepackt<br />
.git-Verzeichnis wird eingeschlossen, obwohl unnötig<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 91
<strong>Git</strong> Basics<br />
Aktuellen Arbeitsstand exportieren<br />
<strong>Git</strong> bietet ein passendes Kommando an:<br />
git archive -- prefix < Oberverzeichnis >/<br />
-- output < Com<strong>mit</strong> / Zweig /Tag ><br />
Member of the Helmholtz-Association<br />
Exportiert Stand der Working Copy eines Com<strong>mit</strong>s/Zweigs<br />
Nur versionierte Dateien werden beachtet<br />
--output:<br />
Gibt Speicherort des Archivs an<br />
Endung gibt den Archivtypen vor (tgz oder zip)<br />
--prefix:<br />
Stellt allen Dateien ein Präfix voran<br />
Ein abschließendes / erzeugt ein übergeordnetes Verzeichnis<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 92
Nützliches<br />
Editor für Com<strong>mit</strong>-Messages setzen<br />
Default-Editor für Com<strong>mit</strong>-Messages: ${VISUAL}<br />
wenn nicht gesetzt, dann meist vi(m)<br />
Systemweit den Default-Editor ändern:<br />
export VISUAL =< Editor -Name ><br />
zur .bashrc (Linux) bzw. .profile (OS X) hinzufügen<br />
Einstellung auf <strong>Git</strong> beschränken:<br />
Member of the Helmholtz-Association<br />
git config -- global core . editor <br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 93
Nützliches<br />
Farbige Ausgaben<br />
<strong>Git</strong> bietet die Möglichkeit, Ausgaben farbig zu gestalten:<br />
Farben für hinzugefügte und gelöschte Dateien (git status)<br />
Farbiges Diff<br />
Farbiger Log<br />
. . .<br />
Aktivieren über<br />
Member of the Helmholtz-Association<br />
git config -- global color .ui true<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 94
Nützliches<br />
Bash Completion<br />
<strong>Git</strong> bietet eine Autovervollständigung für die Bash an<br />
Neben Kommandos werden auch Zweignamen/Tags/. . .<br />
vervollständigt<br />
Installation:<br />
1 <strong>Git</strong>-Source klonen:<br />
git clone https :// github . com / git / git . git<br />
2 Passende <strong>Git</strong>-Version auschecken:<br />
git checkout v‘git -- version | cut -d " " -f3 ‘<br />
Member of the Helmholtz-Association<br />
3 Datei contrib/completion/git-completion.bash nach<br />
${HOME} kopieren und in .bashrc bzw. .profile eintragen:<br />
source<br />
~/ git - completion . bash<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 95
Nützliches<br />
Aktuellen Zweig im Prompt anzeigen<br />
Shell-Erweiterung: Aktuellen Zweig im Prompt anzeigen<br />
Die Installation verläuft analog zur Bash Completion:<br />
1 <strong>Git</strong>-Source klonen und passende Version auschecken<br />
2 Datei contrib/completion/git-prompt.sh nach ${HOME}<br />
kopieren und wie git-completion.sh eintragen<br />
3 Nun steht die Bash-Funktion __git_ps1 zur Bestimmung des<br />
aktuellen Zweiges für den Prompt bereit, Beispiel:<br />
export PS1 = ’\ u@\h:\ W$( __git_ps1 ) $ ’<br />
Member of the Helmholtz-Association<br />
Setzt man zusätzlich<br />
export GIT_PS1_SHOWDIRTYSTATE =1<br />
so werden Änderungen seit dem letzten Com<strong>mit</strong> signalisiert<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 96
Nützliches<br />
Push auf aktuellen Zweig begrenzen<br />
git push ohne Parameter:<br />
Bezug zum Remote-Repository des aktiven Tracking Branches<br />
Überträgt alle Zweige, die Remote identisch benannt sind<br />
⇒ Gefahr, versehentlich Zweige zu pushen<br />
Begrenzung auf den aktiven Zweig:<br />
git config -- global push . default upstream<br />
Mit<br />
Member of the Helmholtz-Association<br />
git config -- global push . default matching<br />
werden wieder alle Zweige gepusht (Default)<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 97
Nützliches<br />
Log in grafischer Oberfläche<br />
Das Programm <strong>Git</strong>X (Mac OS X) bzw. <strong>Git</strong>g (Linux) bietet<br />
eine grafische Oberfläche, um<br />
die History eines Repositories zu betrachten<br />
Änderungen zwischen Com<strong>mit</strong>s anzuzeigen<br />
Zweige zu verwalten<br />
. . .<br />
Member of the Helmholtz-Association<br />
Erhältlich unter<br />
http://gitx.frim.nl/<br />
bzw.<br />
http://git.gnome.org/browse/gitg/<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 98
Nützliches<br />
Log in grafischer Oberfläche<br />
Member of the Helmholtz-Association<br />
28. April 2015 Ingo Heimbach (i.heimbach@fz-juelich.de) Slide 99