Wer erst nachträglich auf die Idee kommt, den eigenen Entwicklungsserver mit einem Produktionsserver per Git und GitHub zu synchronisieren, steckt vor dem Problem, wie man eine Verbindung zu GitHub herstellt und einen erstmaligen Abgleich der Dateien herstellt. Danach kann und sollte ein Deployment dann nur noch per git
erfolgen.
Wie immer ist es einfach, wenn man weiß, wie es geht, oder welche Fragen man stellen muss.
Problembeschreibung
Problem: ein Projekt (auf Produktion), das bisher nur mit FTP deployt wurde, soll nachträglich nur noch mit einem GitHub Repository ohne FTP synchronisiert werden.
SSH-Schlüssel bei GitHub hinterlegen
Da es sich aller Wahrscheinlichkeit nach um ein privates Projekt handelt, muss sich der Produktionsserver (=Ziel) gegenüber GitHub authentifizieren. Dazu muss man einen öffentlichen Schlüssel erzeugen und bei GitHub hinterlegen. Erklärt habe ich das bereits hier (für Windows) und hier (für Linux).
ls -al ~/.ssh # testen, ob schon Keys vorhanden sind
mkdir ~/.ssh # wenn nicht, Ordner anlegen
cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "<BESCHREIBUNG>"
ls -la
Danach muss git
wissen, wo es die SSH-Schlüssel findet.
nano ~/.ssh/config
Der einfachste und funktionsfähige Inhalt wäre folgender:
# Private github account: 1manfactory Host github-private HostName github.com IdentityFile ~/.ssh/id_rsa IdentitiesOnly yes
Wir müssen GitHub als bekannten Host hinzufügen:
ssh-keyscan github.com >> ~/.ssh/known_hosts
Ich authentifiziere mich als git@github-private bei GitHub.
ssh -T git@github-private

Das git Repository auf Produktion anlegen und mit dem remote Repository verbinden
Navigieren Sie zum Verzeichnis Ihres lokalen Projekts auf dem Produktionsserver und führen Sie folgende Befehle aus.
cd <PROJEKTVERZEICHNIS>
git init
git config -l
git remote add origin git@github-private:<USER>/<REPOSITORY>.git
git remote -v
git pull origin main
git checkout main -f
git branch --set-upstream-to origin/main
Ich erkläre die einzelnen Schritte.
git init
ist ein Befehl, der ein neues Git-Repository in einem lokalen Verzeichnis erstellt. Er legt einen versteckten Ordner namens .git
an, der die Repository-Daten enthält. Er macht das Verzeichnis bereit für die Versionskontrolle mit Git.
git config -l
ist ein Befehl, der alle Git-Konfigurationsoptionen anzeigt, die für das aktuelle Repository oder den aktuellen Benutzer gesetzt sind. Er liest die Werte aus den Dateien .git/config
, ~/.gitconfig
und /etc/gitconfig
. Er kann nützlich sein, um die Einstellungen zu überprüfen oder zu ändern.
git remote add origin
ist ein Befehl, der einen Remote-Namen namens origin
zu einem lokalen Repository hinzufügt. Er verbindet das lokale Repository mit einem Remote-Repository, das an den Befehl angehängt wird. Er ermöglicht das Hochladen und Herunterladen von Änderungen zwischen den Repositories.
git remote -v
zeigt die Liste der Remote-Namen und ihre URLs an. Er hilft zu überprüfen, ob die Remote-Verbindungen korrekt sind.
git pull origin main
ist ein Befehl, der den lokalen Branch main
mit dem Remote-Branch main
von origin
aktualisiert. Er lädt zuerst alle Änderungen vom Remote-Repository herunter und führt dann einen Merge oder einen Rebase aus. Er bringt das lokale Repository auf den neuesten Stand.
git branch --set-upstream-to origin/main
ist ein Befehl, der den aktuellen lokalen Branch mit dem Remote-Branch main
von origin
verknüpft. Er legt fest, welcher Remote-Branch als Standard für das Pushen und Pullen verwendet wird. Er erleichtert die Synchronisation zwischen den Branches.
Als Ergebnis sollte jetzt der Produktionsserver auf demselben Stand sein wie das GitHub-Repository (und damit auch wie der Entwicklungsserver).
Das zukünftige Deployment
Ab jetzt können wir den Weg über git pull
oder git fetch && git merge
gehen, um Änderungen aus dem remote Repository bei GitHub zu übernehmen.
Die schnelle Methode ‘git pull’
git pull
git pull
ist ein Befehl, der den aktuellen lokalen Branch mit dem entsprechenden Remote-Branch aktualisiert. Er entspricht einem git fetch
gefolgt von einem git merge
oder einem git rebase
. Er benötigt einen Remote-Namen und einen Branch-Namen oder eine Verknüpfung zwischen den Branches.
Die vorsichtigere Methode mit ‘get fetch’
git fetch origin
git log origin/main ^main
git diff main origin/main
git merge
git fetch origin
ist ein Befehl, der alle Änderungen vom Remote-Repository origin
herunterlädt. Er aktualisiert die lokalen Referenzen zu den Remote-Branches, aber nicht die lokalen Branches. Er ermöglicht es, die Differenzen zwischen den Branches zu sehen oder einen Merge oder einen Rebase auszuführen.
git log origin/main ^main
ist ein Befehl, der die Commit-Historie vom Remote-Branch origin/main
anzeigt, die nicht im lokalen Branch main
enthalten ist. Er hilft, zu sehen, welche Änderungen noch nicht synchronisiert sind.
Der Befehl git diff main origin/main
zeigt die Unterschiede zwischen dem lokalen Zweig main
und dem entfernten Zweig origin/main
an². Er kann verwendet werden, um zu sehen, welche Änderungen Sie noch nicht mit dem entfernten Repository synchronisiert haben.