Git: Unterschied zwischen den Versionen
Peter (Diskussion | Beiträge) |
Peter (Diskussion | Beiträge) |
||
(24 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Die Seite repräsentiert meine zwar nicht ersten, aber seit sehr langer Zeit erneuten Versuche mich mit Git vertraut zu machen. | |||
Es ist keinesfalls eine Anleitung für Anfänger. | |||
Es soll nur mir helfen die bisherigen Schritte nach zu vollziehen. Grundlage war für mich hier das Buch: | |||
Versionsverwaltung mit Git | |||
Praxiseinstieg | |||
Sujeevan Vijayakumaran | |||
3. Auflage 2021 | |||
mitp-verlag | |||
ISBN 978-3-7475-0304-1 | |||
== Git Download== | == Git Download== | ||
Von der Projektseite: https://git-scm.com/ | Von der Projektseite: https://git-scm.com/ | ||
Zeile 115: | Zeile 127: | ||
</pre> | </pre> | ||
Git weist darauf hin, daß mit '''git rm --cached <file>''' Dateien wieder aus dem Stage-Bereich entfernt werden können. | Git weist darauf hin, daß mit '''git rm --cached <file>''' Dateien wieder aus dem Stage-Bereich entfernt werden können. | ||
=== Ein Schritt zurück=== | |||
Wenn eine Änderung ins Stage getan wurde und nun doch wieder zurückgeholt werden soll so geht das: | |||
<pre> | |||
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) | |||
$ git restore --staged test_001.txt | |||
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) | |||
$ | |||
</pre> | |||
Es kann auch die vorgenommene Änderung komplett gelöscht werden: | |||
<pre> | |||
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) | |||
$ git restore test_001.txt | |||
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) | |||
$ | |||
</pre> | |||
Dann habe ich dieser Stelle wieder den Zustand wie nach dem letzten Commit. | |||
=== Dateien ins Repository aufnehmen=== | === Dateien ins Repository aufnehmen=== | ||
Zeile 144: | Zeile 175: | ||
== Ein entferntes Resository anlegen== | == Ein entferntes Resository anlegen== | ||
Ich lege das entfernte Repository auf meinem NAS an. | 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. | 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. | ||
<pre> | <pre> | ||
Zeile 166: | Zeile 196: | ||
$ | $ | ||
</pre> | </pre> | ||
=== Das lokale Repository clonen=== | |||
Nun kann aus dem lokalen Repository heraus dieses gecloned werden: | Nun kann aus dem lokalen Repository heraus dieses gecloned werden: | ||
<pre> | <pre> | ||
Zeile 176: | Zeile 207: | ||
$ | $ | ||
</pre> | </pre> | ||
=== 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: | |||
<pre> | |||
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 | |||
$ | |||
</pre> | |||
Um das Rechteproblem zu lösen muss aus dem lokalen Repository heraus folgender Befehl ausgeführt werden: | |||
<pre> | |||
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) | |||
$ | |||
</pre> | |||
Save.directory sah ziemlich chaotisch aus, deshalb habe ich aufgeräumt: | |||
<pre> | |||
kpsto@Alice MINGW64 //Qnap/Public/GIT-Repos/git_tests_001.git (BARE:master) | |||
$ git config --global --edit | |||
</pre> | |||
Ö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: | |||
<pre> | |||
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) | |||
$ | |||
</pre> | |||
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: | |||
<pre> | |||
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) | |||
$ git remote | |||
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) | |||
$ | |||
</pre> | |||
Es wird nichts angezeigt. | |||
<pre> | |||
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) | |||
$ | |||
</pre> | |||
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: | |||
<pre> | |||
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) | |||
$ | |||
</pre> | |||
Allerdings muss ein '''upstream''' definiert sein: | |||
<pre> | |||
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) | |||
$ | |||
</pre> | |||
Das sieht schon erfolgreich aus. | |||
=== Daten vom entfernten Repository holen=== | |||
Mit fetch lassen sich Daten vom entfernten Repository holen: | |||
<pre> | |||
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) | |||
$ | |||
</pre> | |||
Änderungen am entfernten Repository sind aber noch nicht ins lokale Repository übernommen worden. Das geschieht mit: | |||
<pre> | |||
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) | |||
$ | |||
</pre> | |||
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: | |||
<pre> | |||
</pre> | |||
== Links:== | == Links:== |
Aktuelle Version vom 27. April 2025, 23:52 Uhr
Die Seite repräsentiert meine zwar nicht ersten, aber seit sehr langer Zeit erneuten Versuche mich mit Git vertraut zu machen.
Es ist keinesfalls eine Anleitung für Anfänger.
Es soll nur mir helfen die bisherigen Schritte nach zu vollziehen. Grundlage war für mich hier das Buch:
Versionsverwaltung mit Git Praxiseinstieg Sujeevan Vijayakumaran 3. Auflage 2021 mitp-verlag ISBN 978-3-7475-0304-1
Git Download[Bearbeiten | Quelltext bearbeiten]
Von der Projektseite: https://git-scm.com/
Wie funktioniert Git?[Bearbeiten | Quelltext bearbeiten]
Für die folgenden Beispiele habe ich die Git-Bash verwendet:[Bearbeiten | Quelltext bearbeiten]
Ein lokales Repository anlegen[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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.
Ein Schritt zurück[Bearbeiten | Quelltext bearbeiten]
Wenn eine Änderung ins Stage getan wurde und nun doch wieder zurückgeholt werden soll so geht das:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git restore --staged test_001.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Es kann auch die vorgenommene Änderung komplett gelöscht werden:
kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $ git restore test_001.txt kpsto@Alice MINGW64 /c/users/peter/Documents/git_tests (master) $
Dann habe ich dieser Stelle wieder den Zustand wie nach dem letzten Commit.
Dateien ins Repository aufnehmen[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
Ich lege das entfernte Repository auf meinem NAS an.
Das entfernte Verzeichnis anlegen[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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?[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
Das entfernte Repository bekannt machen[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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[Bearbeiten | Quelltext bearbeiten]
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![Bearbeiten | Quelltext bearbeiten]
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:[Bearbeiten | Quelltext bearbeiten]