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

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare