Git ohne GitHub
Nachdem Git komplett ohne Datenbank auskommt und mit einem beliebigen Ordner verwendet werden kann, bietet Git für jeden Software- oder Script-Entwickler praktisch sofort einen Mehrwert: Git bietet eine History der Änderungen, eine Möglichkeit diese zu vergleichen und somit die Möglichkeit auf einen früheren Stand einzelner oder aller Änderungen zurückzukehren. Änderungen in Git sind nicht einzelne Files, sondern der eigentliche Source-Code. Zudem bietet Git die Basis für das gemeinsame Arbeiten und Verteilen des Source-Code: für lokale oder geteilte Projekte. Für das Teilen kann neben GitHub auch ein einfacher Share oder ein SSH-Remote-Ordner verwendet werden.
Git lokal
Initialisieren - Repository erstellen
Um git für einen Ordner zu verwenden, muss dieser als erstes initialisiert werden. Git legt dabei einen versteckten Ordner ".git" an. Dieser enthält dann die Konfiguration und Änderungen.
Für das Initialisieren mit "cd" in den Ordner wechseln und folgenden Befehl eingeben:
git init
Ein "Init" kann sowohl auf einen leeren, als auch auf einen bereits verwendeten, also befüllten Ordner erfolgen. Leere Ordner können sich den Source-Code später von einem Remote-Repository holen, bestehende Ordner können eigenständig verwendet oder als Basis für ein neues Repository verwendet werden.
Workflow
Das erstellte Repository besteht aus drei "Instanzen": Arbeitsverzeichnis, Index und Head. Die erste Instanz, das Arbeitsverzeichnis beinhaltet die eigentlichen Dateien des Dateisystems (Arbeitsverzeichnis). Die zweite Instanz, der Index dient als Zwischenstufe. Vom Index können die Änderung dann in den Head commited werden. Im Head befinden sich die durch einen Commit bestätigten Änderungen.
Files hinzufügen (stage):
git add File/Ordner*
* bedeutet hier, wie so oft, alles was mit "Ordner" beginnt ...
Hinzugefügte Files werden in den Index aufgenommen, also in der Versionierung berücksichtigt.
Files wieder entfernen (unstage)
git rm --cached File/Ordner
Files auflisten
git ls-tree -r master
Commit
git commit -m "initial"
Ein Commit speichert den aktuellen Stand aller Files die vorhin mit git add in des Repository hinzugefügt werden in den Head, der Parameter -m speichert einen Kommentar zur Version
ab diesem Zeitpunkt kann das Git-Repository in einen anderen Ort geklont werden:
Clone
git clone /C/temp/git/laravel test
git clone root@IP:/var/www/vhosts/domain/laravel
Für das Teilen eines Repositorys sollte allerdings ein Bare-Repository verwendet werden, bei einem push auf ein normales Repo gibts folgenden Fehler:
! [remote rejected] master -> master (branch is currently checked out)
Branch erstellen
git checkout -b "test"
Branch wechseln
git checkout master
Branch umbenennen
git branch -m newname
zum Remote-Branch synchronisieren:
git push -u origin --all
Files von einem anderen Branch
git checkout master -- filefromotherbranch
git stash
speichern ohne commit und in einem anderen Branch weiterarbeiten
git stash pop
zurückkehren zu dem letzten stash
Server Repository ohne Arbeitsverzeichnis
Ein Bare-Repository wird für das zentrale Teilen von Repositorys verwendet.
git --bare init
Klonen von einem bestehenden Ordner in ein Bare-Repository
git clone /C/temp/git/test bare --bare
im Nachhinein:
git config --bool core.bare true
Beim Ändern eines Arbeits-Repository in ein Bare-Repository wird der Ordner .git für Bare-konfiguriert. Die Files außerhalb des Ordners sollten dann nicht mehr als Arbeitsverzeichns verwendet werden, diese können dann also gelöscht werden.
Remote
anzeigen:
git remote -v
ändern:
git remote set-url origin http://localhost:3000/???/yyy.git
"origin" ist der Name des Remote-Repository.
Remote hinzufügen
git remote add neuerKlon /daten/temp/gittest/neuerKlon/
Remote entfernen
Remote wieder entfernen: git remote remove Branch
Git Remote und Plesk
In Plesk kann ganz einfach ein lokales git-Repository erstellt und an einen lokalen Ordner angehängt werden:
git init
git remote add origin https://user@projekt/plesk-git/test.git
git push -u origin master
Git Remote ssh - fatal: Unable to find remote helper for 'sftp'
beim Versuch eines ssh-Remote
git remote add cloud ssh://root@IP:22/var/www/???/
user@server:/docker/www/$ git remote -v
cloud ssh://root@IP:22/var/www/???/ (fetch)
cloud ssh://root@IP:22/var/www/???/ (push)
Teilen mit mehreren Projekten
Zum lokalen Ordner (Branch:master) mit angehängtem Remote-Repository habe ich noch einen Branch erstellt (shared) in dem ich den Source-Code mit anderen Projekten teilen kann. Also den Source-Code den ich in allen Projekten gleich habe als Basis für alle Projekte(Branch:shared) und bestimmte zusätzliche Änderungen für jede Seite individuell im bestehenden master Branch.
Ich habe ein bestehendes Projekt (git init wurde bereits ausgeführt) in ein Bare-Repository geklont und als Remote hinzugefügt:
git checkout -b shared
git clone /docker/laradock_www/shared shared --bare
git config push.default matching
git remote add shared /docker/laradock_www/shared
(git config push.default matching verwende ich, damit die Branches von anderen Projekten später nicht mit verteilt werden.)
Änderung vom geteilten Repository auf den Projektordner können jetzt wie folgt gemerged werden:
git pull shared shared
Änderung vom Projektordner in das geteilte Repository übertragen:
git push shared shared
Wechseln zum Projektordner:
git checkout -b master
Tasks in VScode
In VScode habe ich mir 2 Tasks eingerichtet: Immer wenn ich an dem geteilten Source-Code etwas ändern will, wechsle ich in den "shared" Branch, darin mache ich nach den Änderungen ein "commit" und übertrage die Änderungen mit dem folgenden Task: "git push shared shared" in das Bare Repository und mit "git pull and merge shared" wieder in das eigentliche Projekt, an dem ich arbeite:
Hier die VScode Tasks:
{
"label": "git pull and merge shared",
"type": "shell",
"command": "git checkout shared && git pull shared shared && git merge shared && git checkout master && git merge shared",
"problemMatcher": [] },
{
"label": "git push commited shared",
"type": "shell",
"command": "git push shared shared",
"problemMatcher": []
},
An den Master-Branch kann dann z.B. ein Remote über Plesk angehängt werden, also der eigentliche Projekt-Source Code in ein anderes Remote-Repository übertragen werden, in meinem Fall setzt das Übertragen die Änderungen dann produktiv.:
user@host:/docker/laradock_www/projekt1
$ git remote add origin https://user@projekt/plesk-git/test.gituser@host:/docker/laradock_www/projekt
$ git push -u origin master
SSL certificate problem: unable to get local issuer certificate
Ein Workaround für dieses Problem ist "http.sslVerify" auf "false" zu setzen:
git config --global http.sslVerify false
fatal: Verweigere den Merge von nicht zusammenhängenden Historien.
Sollten zwei verschiedene Ordner gepushed worden sein, finden die Histories nicht zusammen. Um einen pull von einem anderen Branch zu machen, kann der Parameter --allow-unrelated-histories verwendet werden.
git pull origin master --allow-unrelated-histories
Merge rückgängig
kurz notiert: im Fehlerfall kann mittels git reset zu einen früheren Commit gewechselt werden:
git reset --hard "letze id"
SSH
ssh-keygen
GIT Config
Konfig auslesen
git config --list --show-origin
geänderte Files nach chmod
git config core.fileMode false
Visual Studio Code
Sync: Commit automatisch
git.postCommitCommand
Passwort speichern: git config --global credential.helper store
{{percentage}} % positiv