-
1. Erste Schritte
- 1.1 Über Versionskontrolle
- 1.2 Eine kurze Geschichte von Git
- 1.3 Was ist Git?
- 1.4 Die Kommandozeile
- 1.5 Git installieren
- 1.6 Erstmalige Git-Einrichtung
- 1.7 Hilfe bekommen
- 1.8 Zusammenfassung
-
2. Git Grundlagen
-
3. Git Branching
- 3.1 Branches im Überblick
- 3.2 Grundlegendes Branching und Merging
- 3.3 Branch-Management
- 3.4 Branching-Workflows
- 3.5 Remote-Branches
- 3.6 Rebasing
- 3.7 Zusammenfassung
-
4. Git auf dem Server
- 4.1 Die Protokolle
- 4.2 Git auf einem Server einrichten
- 4.3 Generieren Ihres SSH-Public-Keys
- 4.4 Einrichten des Servers
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Drittanbieter-Hosting-Optionen
- 4.10 Zusammenfassung
-
5. Verteiltes Git
-
6. GitHub
-
7. Git-Werkzeuge
- 7.1 Revisionsauswahl
- 7.2 Interaktives Staging
- 7.3 Stashing und Bereinigen
- 7.4 Ihre Arbeit signieren
- 7.5 Suchen
- 7.6 Historie umschreiben
- 7.7 Reset entmystifiziert
- 7.8 Fortgeschrittenes Merging
- 7.9 Rerere
- 7.10 Debugging mit Git
- 7.11 Submodule
- 7.12 Bundling
- 7.13 Ersetzen
- 7.14 Credential-Speicher
- 7.15 Zusammenfassung
-
8. Git anpassen
-
9. Git und andere Systeme
- 9.1 Git als Client
- 9.2 Migration zu Git
- 9.3 Zusammenfassung
-
10. Git-Interna
- 10.1 Plumbing und Porcelain
- 10.2 Git-Objekte
- 10.3 Git-Referenzen
- 10.4 Packfiles
- 10.5 Die Refspec
- 10.6 Übertragungsprotokolle
- 10.7 Wartung und Datenwiederherstellung
- 10.8 Umgebungsvariablen
- 10.9 Zusammenfassung
-
Anhang A: Git in anderen Umgebungen
- A1.1 Grafische Oberflächen
- A1.2 Git in Visual Studio
- A1.3 Git in Visual Studio Code
- A1.4 Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git in Sublime Text
- A1.6 Git in Bash
- A1.7 Git in Zsh
- A1.8 Git in PowerShell
- A1.9 Zusammenfassung
-
Anhang B: Git in Ihre Anwendungen einbetten
- A2.1 Kommandozeilen-Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
Anhang C: Git-Befehle
- A3.1 Einrichtung und Konfiguration
- A3.2 Projekte abrufen und erstellen
- A3.3 Grundlegendes Snapshotting
- A3.4 Branching und Merging
- A3.5 Projekte teilen und aktualisieren
- A3.6 Inspektion und Vergleich
- A3.7 Debugging
- A3.8 Patching
- A3.9 E-Mail
- A3.10 Externe Systeme
- A3.11 Administration
- A3.12 Plumbing-Befehle
2.4 Git Grundlagen - Dinge rückgängig machen
Dinge rückgängig machen
In jeder Phase möchten Sie vielleicht etwas rückgängig machen. Hier werden wir einige grundlegende Werkzeuge für das Rückgängigmachen von Änderungen, die Sie vorgenommen haben, überprüfen. Seien Sie vorsichtig, denn einige dieser Rückgängig-Aktionen können Sie nicht immer rückgängig machen. Dies ist einer der wenigen Bereiche in Git, in denen Sie bei falscher Anwendung Arbeit verlieren können.
Eine der häufigsten Rückgängig-Aktionen findet statt, wenn Sie zu früh committen und möglicherweise vergessen, einige Dateien hinzuzufügen, oder wenn Sie Ihre Commit-Nachricht vermasseln. Wenn Sie diesen Commit erneut durchführen möchten, nehmen Sie die zusätzlichen Änderungen vor, die Sie vergessen haben, fügen Sie sie zur Staging-Area hinzu und committen Sie erneut mit der Option --amend.
$ git commit --amend
Dieser Befehl nimmt Ihre Staging-Area und verwendet sie für den Commit. Wenn Sie seit Ihrem letzten Commit keine Änderungen vorgenommen haben (z.B. wenn Sie diesen Befehl unmittelbar nach Ihrem vorherigen Commit ausführen), sieht Ihr Snapshot exakt gleich aus, und alles, was Sie ändern, ist Ihre Commit-Nachricht.
Derselbe Editor für Commit-Nachrichten startet, enthält aber bereits die Nachricht Ihres vorherigen Commits. Sie können die Nachricht wie gewohnt bearbeiten, aber sie überschreibt Ihren vorherigen Commit.
Wenn Sie beispielsweise committen und dann feststellen, dass Sie die Änderungen in einer Datei, die Sie zu diesem Commit hinzufügen wollten, vergessen haben, zur Staging-Area hinzuzufügen, können Sie Folgendes tun:
$ git commit -m 'Initial commit'
$ git add forgotten_file
$ git commit --amend
Sie enden mit einem einzigen Commit – der zweite Commit ersetzt die Ergebnisse des ersten.
|
Hinweis
|
Es ist wichtig zu verstehen, dass Sie bei der Änderung Ihres letzten Commits diesen nicht so sehr "fixen" als vielmehr vollständig *ersetzen* durch einen neuen, verbesserten Commit, der den alten Commit aus dem Weg räumt und den neuen Commit an seine Stelle setzt. Effektiv ist es so, als ob der vorherige Commit nie stattgefunden hätte, und er wird nicht in Ihrer Repository-Historie erscheinen. Der offensichtliche Vorteil des Änderns von Commits besteht darin, kleine Verbesserungen an Ihrem letzten Commit vorzunehmen, ohne Ihre Repository-Historie mit Commit-Nachrichten wie "Ups, vergessen, eine Datei hinzuzufügen" oder "Mist, Tippfehler im letzten Commit korrigieren" zu überladen. |
|
Hinweis
|
Ändern Sie nur Commits, die noch lokal sind und noch nicht irgendwohin gepusht wurden. Das Ändern von zuvor gepushten Commits und das anschließende Force-Pushen des Branches wird Probleme für Ihre Kollaborateure verursachen. Weitere Informationen darüber, was passiert, wenn Sie dies tun, und wie Sie sich erholen können, wenn Sie auf der Empfängerseite sind, finden Sie unter Die Gefahren des Rebase. |
Eine staged Datei wieder unstagen
Die nächsten beiden Abschnitte zeigen, wie Sie mit Ihrer Staging-Area und Änderungen im Arbeitsverzeichnis arbeiten. Das Schöne ist, dass der Befehl, den Sie verwenden, um den Status dieser beiden Bereiche zu ermitteln, Sie auch daran erinnert, wie Sie Änderungen daran rückgängig machen können. Angenommen, Sie haben zwei Dateien geändert und möchten sie als zwei separate Änderungen committen, aber Sie tippen versehentlich git add * und fügen beide zur Staging-Area hinzu. Wie können Sie eine der beiden wieder unstagen? Der Befehl git status erinnert Sie daran:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
Direkt unter dem Text "Changes to be committed" steht, dass Sie git reset HEAD <datei>… verwenden sollen, um sie zu unstagen. Nutzen wir also diesen Rat, um die Datei CONTRIBUTING.md zu unstagen.
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Der Befehl ist etwas seltsam, aber er funktioniert. Die Datei CONTRIBUTING.md ist modifiziert, aber wieder unstaged.
|
Hinweis
|
Es stimmt, dass |
Vorerst ist diese magische Invocations alles, was Sie über den Befehl git reset wissen müssen. Wir werden im Detail darauf eingehen, was reset tut und wie Sie es meistern können, um wirklich interessante Dinge zu tun, in Reset entmystifiziert.
Eine modifizierte Datei rückgängig machen
Was ist, wenn Sie feststellen, dass Sie Ihre Änderungen an der Datei CONTRIBUTING.md nicht behalten möchten? Wie können Sie sie einfach rückgängig machen – sie auf den Stand zurücksetzen, den sie hatte, als Sie sie zuletzt committet haben (oder anfänglich geklont, oder wie auch immer Sie sie in Ihr Arbeitsverzeichnis bekommen haben)? Glücklicherweise sagt Ihnen git status auch das. Im letzten Beispielausgabe sieht der unstaged Bereich wie folgt aus:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Es wird ziemlich explizit erklärt, wie die vorgenommenen Änderungen verworfen werden. Machen wir, was dort steht:
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Sie können sehen, dass die Änderungen rückgängig gemacht wurden.
|
Wichtig
|
Es ist wichtig zu verstehen, dass |
Wenn Sie die vorgenommenen Änderungen an dieser Datei behalten möchten, diese aber vorerst aus dem Weg räumen müssen, werden wir uns in Git Branching mit Stashing und Branching beschäftigen; dies sind generell bessere Vorgehensweisen.
Denken Sie daran, dass alles, was in Git *committet* wurde, fast immer wiederhergestellt werden kann. Selbst Commits, die auf gelöschten Branches lagen, oder Commits, die mit einem --amend Commit überschrieben wurden, können wiederhergestellt werden (siehe Datenwiederherstellung für Datenwiederherstellung). Alles, was Sie verlieren, das nie committet wurde, wird jedoch wahrscheinlich nie wieder gesehen.
Dinge mit git restore rückgängig machen
Git Version 2.23.0 hat einen neuen Befehl eingeführt: git restore. Er ist im Grunde eine Alternative zu git reset, das wir gerade behandelt haben. Ab Git Version 2.23.0 wird Git git restore anstelle von git reset für viele Rückgängig-Operationen verwenden.
Gehen wir unsere Schritte noch einmal durch und machen Dinge mit git restore rückgängig, anstatt mit git reset.
Eine staged Datei mit git restore unstagen
Die nächsten beiden Abschnitte zeigen, wie Sie mit git restore mit Ihrer Staging-Area und Änderungen im Arbeitsverzeichnis arbeiten. Das Schöne ist, dass der Befehl, den Sie verwenden, um den Status dieser beiden Bereiche zu ermitteln, Sie auch daran erinnert, wie Sie Änderungen daran rückgängig machen können. Angenommen, Sie haben zwei Dateien geändert und möchten sie als zwei separate Änderungen committen, aber Sie tippen versehentlich git add * und fügen beide zur Staging-Area hinzu. Wie können Sie eine der beiden wieder unstagen? Der Befehl git status erinnert Sie daran:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: CONTRIBUTING.md
renamed: README.md -> README
Direkt unter dem Text "Changes to be committed" steht, dass Sie git restore --staged <datei>… verwenden sollen, um sie zu unstagen. Nutzen wir also diesen Rat, um die Datei CONTRIBUTING.md zu unstagen.
$ git restore --staged CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Die Datei CONTRIBUTING.md ist modifiziert, aber wieder unstaged.
Eine modifizierte Datei mit git restore rückgängig machen
Was ist, wenn Sie feststellen, dass Sie Ihre Änderungen an der Datei CONTRIBUTING.md nicht behalten möchten? Wie können Sie sie einfach rückgängig machen – sie auf den Stand zurücksetzen, den sie hatte, als Sie sie zuletzt committet haben (oder anfänglich geklont, oder wie auch immer Sie sie in Ihr Arbeitsverzeichnis bekommen haben)? Glücklicherweise sagt Ihnen git status auch das. Im letzten Beispielausgabe sieht der unstaged Bereich wie folgt aus:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Es wird ziemlich explizit erklärt, wie die vorgenommenen Änderungen verworfen werden. Machen wir, was dort steht:
$ git restore CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README
|
Wichtig
|
Es ist wichtig zu verstehen, dass |