Git
Git Download
Von der Projektseite: https://git-scm.com/
Wie funktioniert Git?
Für die folgenden Beispiele habe ich die Git-Bash verwendet:
Ein lokales Repository anlegen
Mit der Git-Bash in das gewünschte Verzeichnis gehen bzw. dort das geünschte Verzeichnis anlegen und dort hinein wechseln. Dann dieses Verzeichnis zu einem Git-Verzeichnis machen:
kpsto@Alice MINGW64 /c/users/peter/Documents $ mkdir git_tests kpsto@Alice MINGW64 /c/users/peter/Documents $ cd git_tests/ kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests $ git init Initialized empty Git repository in C:/Users/peter/Documents/git_tests/.git/ kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Git Konfigurieren
Vor der Verwendung muss das Verzeichnis konfiguriert werden:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git config --global user.name "Peter Stoeck" kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git config --global user.email stoeck_kp@web.de kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Für die weiteren Schritte habe ich einige Test-Dateien angelegt:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ touch test_001.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ touch test_002.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ echo "Hallo Git" > test_003.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ dir test_001.txt test_002.txt test_003.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Dateien in Git aufnehmen: Commit
Die Aufnahme von Dateien oder Änderungen in das Repository erfolgt in zwei Schritten.
Zuerst schauen wir uns mal den Status an:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) test_001.txt test_002.txt test_003.txt nothing added to commit but untracked files present (use "git add" to track) kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Dateien im Stage bereitstellen
Zuerst müssen die Dateien im Stage bereitgestellt werden:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git add test_001.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git add test_002.txt test_003.txt warning: in the working copy of 'test_003.txt', LF will be replaced by CRLF the next time Git touches it kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Mehrere Dateien können mit einem ADD in den Stagebereich geladen werden. Zur Trennung dient ein Leerzeichen.
Die Statusmeldung sieht jetzt so aus:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: test_001.txt new file: test_002.txt new file: test_003.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Git weist darauf hin, daß mit git rm --cached <file> Dateien wieder aus dem Stage-Bereich entfernt werden können.
Dateien ins Repository aufnehmen
Die im Stage vorhandenen Dateien können nun ins Repository aufgenommen werden:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git commit -m "Erste Dateien ins Repository übertragen." [master (root-commit) c4186b4] Erste Dateien ins Repository übertragen. 3 files changed, 1 insertion(+) create mode 100644 test_001.txt create mode 100644 test_002.txt create mode 100644 test_003.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Es ist sinnvoll einen Kommentar zu diesem Commit zu schreiben, damit man später identifizieren kann was dieser beinhaltet.
Die Statusmeldung zeigt nun an, daß alles sauber ist:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git status On branch master nothing to commit, working tree clean kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Ein entferntes Resository anlegen
Ich lege das entfernte Repository auf meinem NAS an.
Das entfernte Verzeichnis anlegen
Da mein NAS als Netzlaufwerk gemountet ist wird er von der Git-Bash nicht erkannt, die in einem eigenen Filesystem läuft (Linux Emulation unter Windows - MINGW). Deshalb muss ich den UNC-Pfad verwenden.
kpsto@Alice MINGW64 /c $ cd //Qnap/Public/GIT-Repos kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos $
Nun kann ich das Verzeichnis am entfernten Ort anlegen und es zum aktuellen Verzeichnis machen:
kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos $ mkdir git_tests_001.git kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos $ cd git_tests_001.git/ kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git $
Das lokale Repository clonen
Nun kann aus dem lokalen Repository heraus dieses gecloned werden:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git clone --bare . //Qnap/Public/GIT-Repos/git_tests_001.git Cloning into bare repository '//Qnap/Public/GIT-Repos/git_tests_001.git'... done. kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Wer ist der Eigentümer?
Da der Besitzer auf dem NAS nicht die selbe ID hat wie der auf dem lokalen Rechner bringt das nun Probleme mit sich:
kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git $ git status fatal: detected dubious ownership in repository at '//Qnap/Public/GIT-Repos/git_ tests_001.git' '//Qnap/Public/GIT-Repos/git_tests_001.git' is owned by: (inconvertible) (S-1-5-21-3020799625-3799041462-1330622877-2002) but the current user is: ALICE/kpsto (S-1-5-21-1633449780-1257717864-3521173352-1001) To add an exception for this directory, call: git config --global --add safe.directory '%(prefix)///Qnap/Public/GIT-Re pos/git_tests_001.git' kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git $
Um das Rechteproblem zu lösen muss aus dem lokalen Repository heraus folgender Befehl ausgeführt werden:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git config --global --add safe.directory '//Qnap/Public/GIT-Repos/git_tests_001.git' kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git (BARE:master) $ git config --global --get-all safe.directory //QNAP/Public/Projekte/HOME/Markiese //QNAP/Public/Projekte/OTA/My-Micropython-OTA-Updater //QNAP/Public/GIT-Repos/My-OTA_2 //QNAP/Public/GIT-Repos/Markiese //Qnap/Public/GIT-Repos/git_tests_001.git kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git (BARE:master) $
Save.directory sah ziemlich chaotisch aus, deshalb habe ich aufgeräumt:
kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git (BARE:master) $ git config --global --edit
Öffnet einen Editor. Bei mir war es Visual Studio Code, obwohl bei der Installation Notepad++ angegeben hatte. War vielleicht noch von der alten Installation im System.
Im entfernten Repository gibt's keinen Status
git Status funktioniert nicht im entfernten Repository:
kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git (BARE:master) $ git status fatal: this operation must be run in a work tree kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git (BARE:master) $
Das ist auch klar. Schließlich wird darin nicht gearbeitet, so dass es dort keine veränderten aber noch nicht aufgenommenen Änderungen gibt!
Auf das entfernte Repository zugreifen
Das entfernte Repository bekannt machen
Noch kennt mei Git das entfernte Repository nicht:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git remote kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Es wird nichts angezeigt.
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git remote add origin //Qnap/Public/GIT-Repos/git_tests_001.git kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git remote origin kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Fügt das Repository unter dem Namen origin (den es beim clonen bekommen hat) hinzu.
Daten zum entfernten Repository schreiben
Mit push werden Daten vom lokalen ins entfernte RTepository geladen:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git push fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin master To have this happen automatically for branches without a tracking upstream, see 'push.autoSetupRemote' in 'git help config'. kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Allerdings muss ein upstream definiert sein:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git push --set-upstream origin master branch 'master' set up to track 'origin/master'. Everything up-to-date kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Das sieht schon erfolgreich aus.
Daten vom entfernten Repository holen
Mit fetch lassen sich Daten vom entfernten Repository holen:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git fetch From //Qnap/Public/GIT-Repos/git_tests_001 * [new branch] master -> origin/master kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Änderungen am entfernten Repository sind aber noch nicht ins lokale Repository übernommen worden. Das geschieht mit:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git merge origin/master Already up to date. kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Da es keine Änderungen gab wird hier nichts gemergt.
Es sollte nur gemergt werden, wenn keine Änderungen am lokalen Repository vorgenommen wurden, die noch nicht im entfernten Repository aufgenommen sind!
Sollten Änderungen im lokalen Repository vorhanden sein, so müssen diese zuerst ins entfernte Repository eingefügt werden und dann das entfernte Repository geladen werden:
Links: