Sebastian Preisner 78b1bd1dcf | 7 years ago | |
---|---|---|
.gitignore | 7 years ago | |
LICENSE | 7 years ago | |
README.md | 7 years ago |
README.md
GIT
Durch meine Arbeit in verschiedenen Gruppen ist das Bedürfnis aufgekommen den beteiligten GIT näher zu bringen. Meine Sammlung an Informationen sowie Vorträge möchte ich in diesem Repository zusammen führen und zur freien Verfügung unter der CC-BY-4 online stellen.
Einführung in GIT
- Git ist eine Versionsverwaltung
- Funktioniert nicht bei Binärdateien
- Gut für Code, Text oder Vektorgrafiken
Gitclient Einrichten
Mit dem Befehl cat ~/.gitconfig
können wir uns die globalen Konfigurationen anzeigen lassen.
Befehl | Bedeutung |
---|---|
git config --global color.ui true |
Aktiviert eine farbige Ausgabe auf der Konsole. |
git config --global user.name "Name der Angezeigt werden soll" |
Setzt einen Nutzernamen |
git config --global user.email mail@adresse.com |
Setzt die E-Mail |
``git config --global core.editor vim | Setze den commit Editor |
``git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -nosession" | Für Windowsnutzer |
git config --global rebase.autosquash true |
Führt bei git rebase automatisch git rebase --autosquash durch |
git config --global pull.rebase true |
Führt automatisch git pull --rebase aus wenn git pull ausgeführt wird. |
Erste Schritte
Das erste Repository
mkdir MeineWebseite
cd MeineWebseite
# Initialisieren des Repositorys
git init
# Status Ausgeben
git status
Erster Commit
HTML5Boilerplate in den neuen Ordner kopieren
git status
git add css
git status
git add js/main.js
git status
Für eine kürzere Statusausgabe: git status -s
, dabei steht >A<
für Added, >??<
für nicht beobachtete Dateien und > M<
>M <
veränderte Datei im und nicht im Statigbereich.
git add -A # Alles hinzufügen
git commit -m "HTML 5 Boilerplate hinzugefügt"
git status
Das Log
Mit hilfe von git log
können wir uns nun das log ausgeben lassen.
commit a4045440894fbcf790782a41469016f3f84acc57 (HEAD -> master, origin/master)
Author: Kreativmonkey <kreativmonkey@ffmyk.de>
Date: Sun Feb 18 14:09:49 2018 +0100
HTML 5 Boilerplate hinzugefügt
Reverenzierungen
Reverenzierung | Beschreibung |
---|---|
commit-id (kurz - lang) | Sie ist eine SHA-1-Checksumme, sie ist eindeutig und wird zur genauen Identifizierung eines Commits benötigt. |
HEAD | Aktueller stand |
master~2 | voletzter Commit auf master |
Neue Version
Wir ändern die index.html
Datei.
git status
git diff
git add index.html
git commit -m "Neue Überschrift"
git log
Für eine divitilere auswahl der hinzuzufügenden Zeilen einer Datei kann man mit git add -p
nur einzelne parts hinzufügen.
Da git diff
nur die Änderungen zwischen dem aktuellen Ordner und dem letzten Commit ohne den Dateien im Stagingbereich anzeigt, gibt es noch die befehle git diff --staged
und git diff --cached
.
Mehrere Änderungen in einem Commit
Wir ändern die index.html
und die README Datei.
git status
git commit -a -m "Namensgebung"
Die Größe von Commmits sollten immer nur so klein wie möglich und so groß wie nötig sein. Wenn Sie in Projekten wie dieser statischen Webseite arbeiten, dann sollten Sie zum Beispiel Inhalte auf Unterseiten nur dann in einen Commit zusammenfassen, wenn diese strikt zusammengehören! Das Stichwort ist "Logische Änderungen".
Änderungen aus dem Stagingbereich nehmen
Wir ändern wieder einmal die index.html
.
git add index.html
git reset HEAD index.html
git checkout -- index.html # änderungen rückgängig machen!
HEAD = der HEAD ist immer der aktuelle Stand des branches in dem man sich befindet.
Dateien Umbenennen
Mit git mv alteDatei neueDatei
gibt es ein Befehl der Dateien verschiebt/umbenennt mit dem wissen von Git.
mv alteDatei neueDatei
git add neueDatei
git rm alteDatei
Mit git log --follow neueDatei
lassen sich die Änderungen an einer Datei auch dann verfolgen, wenn diese Umbenannt wurde.
Änderungen rückgängig machen
revert
git revert <commit-id>
erzeugt einen neuen Commit der einen alten rückgängig macht. Die Commitmassage sollte hier nicht geändert werden damit die übersichtlichkeit gewahrt bleibt.
Die Funktion ist geeignet für einen Commit der schon veröffentlicht wurde und an dem mehrere Entwickler arbeiten.
ändern der Index.html, commiten und reverten! Danach machen wir ein Reset.
reset
git reset
Modus | Verhaltensweise | Änderungen |
---|---|---|
soft | Hierdurch bleibt die Änderung erhalten und im Stagingbereich. Sinvoll wenn noch weitere Änderungen in den letzten Commit fließen sollten. | Staging |
mixed (default) | Die änderung bleibt erhalten ist jedoch nicht im Statingbereich | Arbeitsverzeichnis |
hard | Die Änderungen gehen verloren und der Ordner auf den zurückgesetzten Commit gebracht. | Nirvana |
git reset HEAD~2 %um die letzten beiden Commits rückgängig zu machen
git status
# Zeile in Index.html anfügen und commiten
git reset --soft HEAD~1
git status
# Index.html commiten
git reset HEAD~1
git status
# Index.html commiten
git reset --hard HEAD~1
git status
cat index.html
interaktives rebase
KOMMT NOCH!!
Hinter den Kulissen
Git speichert Änderungen als Snapshots, nicht als Diffs. Es ist zu beachten das Git lediglich neue Dateien aufnehmen kann, das bedeutet das gelöschte Dateien in der Historie trotzdem noch vorhanden sind. Vorsicht bei Passwörtern und anderen sicherheitsrelevanten Daten. Hierzu gibt es die .gitignore Datei auf die wir gleich zurück kommen!
Außerdem Versioniert Git nur Dateien weswegen leere Ordner nicht mit aufgenommen werden. Sobald der Ordner eine Datei enthält, wird dieser auch mit aufgenommen.
Zur genauen Arbeit sei das Kapitel 2.7 aus dem Buch Versionsverwaltung mit Git von "Unaussprechlich" empfohlen.
Arbeiten mit Branches
Branches sind Zeiger auf Commits.
git branch
git branch feature/navigation
git branch feature/content
git checkout feature/navigation
# Navigation hinzufügen und commit ausführen
git checkout master
git merge feature/navigation
# Fast-Forward Merge
Fast-Forward Merge (3.3 Branches mergen)
git checkout feature/content
# content hinzufügen und commiten
git checkout master
git merge feature/content
# merge massage bestätigen (wird in der Regel so belassen)
git log -n 2
# Zeile Merge mit den verweisen auf die beiden vorgänger Commits
Der diff eines Merge-Commits ist grundsätzlich leer und verweist auf die beiden vorgänger Commits aus denen er hervorgegangen ist.
Merge Konflikte
Wir erstellen einen Mergekonflikt
git checkout master
git checkout -b title
# Title ändern zu "Hallo Mergekonflikt"
# commit -m "Titel für Mergekonflikt"
git checkout master
# Titel ändern in "Neuer Titel"
# commit -m "Neue Überschrift"
git merge title
Nun haben wir einen Mergekonflikt.
<<<<<<< HEAD
<h1>Hallo!</h1>
=======
<h1>Hallo Merge-Konflikt!</h1>
>>>>>>> title
Zur Behebung werden die Marker gelöscht und die Zeile die beibehalten werden soll übernommen.
git add index.html
git status # Zeigt das alle Konflikte behoben wurden
git commit
git log -p # Zeigt alle änderungen an
git log --oneline
# Trotz Mergekonflikt sind beide Commits in der History gelandet!
# Der Merge Commit ist trotz des Konfliktes leer!
Mergetool
git mergetool --tool=kdiff3 #Nur unter Linux!
Bezeichnung | Stand |
---|---|
A | Stand bevor title gemerged wurde |
B | Ist die Lokale Datei in dem der Konflikt vorliegt |
C | Ist die Datei aus title die gemerged werden soll |
Rebase (3.7)
Um Konflikten aus dem Weg zu gehen und eine saubere History zu erzeugen ist ein Rebase sinvoll. Hierbei werden Commits aus anderen Branches übernommen ohne einen Merge durchführen zu müssen.
# Benötigt werden zwei Commits auf unterschiedlichen branches!
git checkout -b fix/more_content master
# änderung der Index.html
git checkout master
# Navigation erweitern!
git checkout fix/more_content
git rebase master
git checkout master
git merge fix/more_content --no-ff
# Mit --no-ff wird ein Merge-Commit angelegt und kein Fast-Forward Merge,
# damit kann man die existenz des Branches in der History nachvollziehen.
# Dies ist gerade bei großen Projekten oder Teams sinvoll und hilfreich.
Nun wurde ein Fast-Forward Merge erzeugt und die History ist sauber und ohne Merge!
git log -n 3
Github!
Etwas durchklicken und bekannt machen. Gitlab und Gogs/Gitea zeigen. Und dann zu den Entfernten Repositories gehen.
Entfernte Repositories
Remoterepository erstellen
mkdir ~/git
git clone --bare . ~/git/meineWebseite.git
git clone
mit dem Parameter --bare
klont, also kopiert das ganze Repository aus dem aktuellen Verzeichnis in das Verzeichnis ~/git/meineWebseite.git
# Remote-Repository hinzufügen
git remote add origin ~/git/meineWebseite.git
git remote # Auflisten der Repositories
git fetch # Abholen der Daten aus dem Remote-Repository
Origin ist hierbei die Bezeichnung des Remoterepositories. Es ist möglich mehrere Remoterepositories an zu legen und zu verwalten. Die Branches des Remote Repositories fangen mit origin an, da dies der Name des Remotes ist.
Die Änderungen im Remote müssen mit git merge origin/master
in den eigenen Master übernommen werden. Hierbei kann es zu Mergekonflikten kommen. git pull origin master
ist eine Kombination aus fetch
und merge
.
git branch # Zeigt nur die eigenen Branches
git branch -a # Zeigt auch die Branches aus dem Remote - trotz beginn mit remote lassen sie sich ohne diesen auschecken!
#änderungen im master anlegen und commiten
git status # Zeigt das man 1 vor origin/master ist!
git push # Fehlermeldung
git push --set-upstream origin master
git push # Alles aktuell!!
Löschen von Branches
git checkout master
git branch --merged # Zeigt die Branches die nach HEAD (master) gemerged sind!
git branch --no-merged <branch> # Umgekehrt zu --merged
git branch -a --merged master # Zeigt auch die remots an!
git branch -d <branch>
ist die Sichere Methode, mit git branch -D <branch>
wird immer gelöscht, was zu Datenverlust führen kann. Auswirkung jedoch nur auf die lokalen Repositories.
git push origin --delete <branch> # löscht auf dem entfernten
git push origin :<branch> # kurzform von --delete
Befehlsliste
Befehl | Bedeutung |
---|---|
git log --pretty=oneline | Gibt den Log in einzeilern aus |
Weiterführende Informationen
Literatur
- Buchtipp: Versionsverwaltung mit Git von Vijayakumaran, Sujeevan
- Become a git guru
Interaktive Tutorials
Videos
- Vortrag: Nicht alltägliche Git-Funktionen
Cheat Sheet
- Github Git Sheet Cheat
- Atlassian.com Sheet Cheat
- fournova auf deutsch mit guten Hinweisen!
- Visual Sheet Cheat - mattharrison
- Übersicht über mehrere Sheet Cheat
Weiterführende Quellen
Empfehlenswerte Quellen zu Arbeit mit Git:
- Versionsverwaltung mit GIT von Vijayakumaran, Sujeevan
- https://git-scm.com/
- Github: Hello World