-
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.2 Git Grundlagen - Änderungen im Repository aufzeichnen
Änderungen im Repository aufzeichnen
An diesem Punkt sollten Sie ein echtes Git-Repository auf Ihrem lokalen Rechner haben und eine Kopie oder Arbeitskopie aller darin enthaltenen Dateien vor sich. Typischerweise werden Sie Änderungen vornehmen und Schnappschüsse dieser Änderungen jedes Mal in Ihrem Repository speichern, wenn das Projekt einen Zustand erreicht, den Sie aufzeichnen möchten.
Denken Sie daran, dass jede Datei in Ihrem Arbeitsverzeichnis in einem von zwei Zuständen sein kann: verfolgt oder unverfolgt. Verfolgte Dateien sind Dateien, die im letzten Schnappschuss enthalten waren, sowie alle neu vorbereiteten Dateien; sie können unverändert, geändert oder vorbereitet sein. Kurz gesagt, verfolgte Dateien sind Dateien, von denen Git Kenntnis hat.
Unverfolgte Dateien sind alles andere – alle Dateien in Ihrem Arbeitsverzeichnis, die nicht im letzten Schnappschuss enthalten waren und sich nicht in Ihrer Vorbereitungszone befinden. Wenn Sie zum ersten Mal ein Repository klonen, sind alle Ihre Dateien verfolgt und unverändert, da Git sie gerade ausgecheckt hat und Sie noch nichts bearbeitet haben.
Wenn Sie Dateien bearbeiten, betrachtet Git sie als geändert, da Sie sie seit dem letzten Commit geändert haben. Während Sie arbeiten, bereiten Sie selektiv diese geänderten Dateien vor und committen dann alle diese vorbereiteten Änderungen, und der Zyklus wiederholt sich.
Den Status Ihrer Dateien überprüfen
Das wichtigste Werkzeug, das Sie verwenden, um festzustellen, welche Dateien sich in welchem Zustand befinden, ist der Befehl git status. Wenn Sie diesen Befehl direkt nach einem Klon ausführen, sollten Sie etwas Ähnliches sehen
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
Das bedeutet, dass Sie ein sauberes Arbeitsverzeichnis haben; anders ausgedrückt, keine Ihrer verfolgten Dateien ist geändert. Git sieht auch keine unverfolgten Dateien, sonst würden diese hier aufgelistet. Schließlich informiert Sie der Befehl, auf welchem Branch Sie sich befinden, und teilt Ihnen mit, dass er sich nicht von demselben Branch auf dem Server unterscheidet. Vorerst ist dieser Branch immer master, was der Standard ist; Sie werden sich hier nicht darum kümmern. Git Branching wird Branches und Referenzen im Detail behandeln.
|
Hinweis
|
GitHub hat den Standard-Branch-Namen Mitte 2020 von Git selbst verwendet jedoch weiterhin |
Nehmen wir an, Sie fügen eine neue Datei zu Ihrem Projekt hinzu, eine einfache README-Datei. Wenn die Datei vorher nicht existierte und Sie git status ausführen, sehen Sie Ihre unverfolgte Datei wie folgt
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
Sie können sehen, dass Ihre neue README-Datei unverfolgt ist, da sie unter der Überschrift "Unverfolgte Dateien" in Ihrer Statusausgabe aufgeführt ist. Unverfolgt bedeutet im Grunde, dass Git eine Datei sieht, die Sie nicht im vorherigen Schnappschuss (Commit) hatten und die noch nicht vorbereitet wurde; Git wird sie erst in Ihre Commit-Schnappschüsse aufnehmen, wenn Sie es ihm explizit sagen. Dies geschieht, damit Sie nicht versehentlich generierte Binärdateien oder andere Dateien einbeziehen, die Sie nicht einbeziehen wollten. Sie möchten README einbeziehen, also beginnen wir, die Datei zu verfolgen.
Neue Dateien verfolgen
Um mit der Verfolgung einer neuen Datei zu beginnen, verwenden Sie den Befehl git add. Um die Verfolgung der README-Datei zu beginnen, können Sie dies ausführen
$ git add README
Wenn Sie Ihren Statusbefehl erneut ausführen, können Sie sehen, dass Ihre README-Datei jetzt verfolgt und für den Commit vorbereitet ist
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README
Sie können erkennen, dass sie vorbereitet ist, da sie unter der Überschrift "Vorbereitete Änderungen" aufgeführt ist. Wenn Sie jetzt committen, ist die Version der Datei zum Zeitpunkt der Ausführung von git add diejenige, die im nachfolgenden historischen Schnappschuss enthalten sein wird. Möglicherweise erinnern Sie sich, dass Sie, als Sie zuvor git init ausgeführt haben, dann git add <files> ausgeführt haben – das diente dazu, die Dateien in Ihrem Verzeichnis zu verfolgen. Der Befehl git add nimmt einen Pfadnamen für eine Datei oder ein Verzeichnis; wenn es sich um ein Verzeichnis handelt, fügt der Befehl alle Dateien in diesem Verzeichnis rekursiv hinzu.
Geänderte Dateien vorbereiten
Ändern wir eine bereits verfolgte Datei. Wenn Sie eine zuvor verfolgte Datei namens CONTRIBUTING.md ändern und dann erneut den Befehl git status ausführen, erhalten Sie etwas Ähnliches wie hier
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: 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
Die Datei CONTRIBUTING.md erscheint unter einer Sektion namens "Änderungen nicht für den Commit vorbereitet" – das bedeutet, dass eine verfolgte Datei im Arbeitsverzeichnis geändert wurde, aber noch nicht vorbereitet ist. Um sie vorzubereiten, führen Sie den Befehl git add aus. git add ist ein vielseitiger Befehl – Sie verwenden ihn, um die Verfolgung neuer Dateien zu beginnen, Dateien vorzubereiten und andere Dinge zu tun, wie z. B. Merge-Konflikte als gelöst zu markieren. Es kann hilfreich sein, ihn eher als "Füge diesen Inhalt präzise dem nächsten Commit hinzu" statt "Füge diese Datei zum Projekt hinzu" zu verstehen. Führen wir nun git add aus, um die Datei CONTRIBUTING.md vorzubereiten, und führen Sie dann git status erneut aus
$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
Beide Dateien sind vorbereitet und werden in Ihren nächsten Commit aufgenommen. An diesem Punkt nehmen wir an, Sie erinnern sich an eine kleine Änderung, die Sie an CONTRIBUTING.md vornehmen möchten, bevor Sie sie committen. Sie öffnen sie erneut und nehmen diese Änderung vor, und Sie sind bereit zum Committen. Lassen Sie uns jedoch git status noch einmal ausführen
$ vim CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
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
Was zum Teufel? Jetzt wird CONTRIBUTING.md sowohl als vorbereitet als auch als nicht vorbereitet aufgeführt. Wie ist das möglich? Es stellt sich heraus, dass Git eine Datei genau so vorbereitet, wie sie zum Zeitpunkt der Ausführung des Befehls git add war. Wenn Sie jetzt committen, wird die Version von CONTRIBUTING.md, wie sie war, als Sie git add zuletzt ausgeführt haben, in den Commit aufgenommen, nicht die Version der Datei, wie sie in Ihrem Arbeitsverzeichnis aussieht, wenn Sie git commit ausführen. Wenn Sie eine Datei ändern, nachdem Sie git add ausgeführt haben, müssen Sie git add erneut ausführen, um die neueste Version der Datei vorzubereiten
$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
Kurzer Status
Während die Ausgabe von git status ziemlich umfassend ist, ist sie auch recht wortreich. Git hat auch eine Kurzstatus-Option, mit der Sie Ihre Änderungen kompakter sehen können. Wenn Sie git status -s oder git status --short ausführen, erhalten Sie eine deutlich vereinfachte Ausgabe des Befehls
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
Neue unverfolgte Dateien haben ein ?? daneben, neue Dateien, die zur Vorbereitungszone hinzugefügt wurden, haben ein A, geänderte Dateien haben ein M und so weiter. Es gibt zwei Spalten für die Ausgabe – die linke Spalte gibt den Status der Vorbereitungszone an und die rechte Spalte den Status des Arbeitsbaums. Zum Beispiel ist in dieser Ausgabe die Datei README im Arbeitsverzeichnis geändert, aber noch nicht vorbereitet, während die Datei lib/simplegit.rb geändert und vorbereitet ist. Die Datei Rakefile wurde geändert, vorbereitet und dann erneut geändert, sodass es Änderungen daran gibt, die sowohl vorbereitet als auch nicht vorbereitet sind.
Dateien ignorieren
Oft haben Sie eine Klasse von Dateien, die Git nicht automatisch hinzufügen oder Ihnen sogar als unverfolgt anzeigen soll. Dies sind im Allgemeinen automatisch generierte Dateien wie Protokolldateien oder Dateien, die von Ihrem Build-System erstellt werden. In solchen Fällen können Sie eine Datei mit Mustern zur Übereinstimmung erstellen, die .gitignore genannt wird. Hier ist eine Beispiel-.gitignore-Datei
$ cat .gitignore
*.[oa]
*~
Die erste Zeile weist Git an, alle Dateien zu ignorieren, die auf ".o" oder ".a" enden – Objekt- und Archivdateien, die das Ergebnis des Erstellens Ihres Codes sein können. Die zweite Zeile weist Git an, alle Dateien zu ignorieren, deren Namen mit einer Tilde (~) enden, die von vielen Texteditoren wie Emacs zur Markierung temporärer Dateien verwendet wird. Sie können auch ein Log-, tmp- oder pid-Verzeichnis einschließen; automatisch generierte Dokumentation; und so weiter. Das Einrichten einer .gitignore-Datei für Ihr neues Repository, bevor Sie beginnen, ist im Allgemeinen eine gute Idee, damit Sie nicht versehentlich Dateien committen, die Sie wirklich nicht in Ihrem Git-Repository haben möchten.
Die Regeln für die Muster, die Sie in die Datei .gitignore aufnehmen können, sind wie folgt:
-
Leere Zeilen oder Zeilen, die mit
#beginnen, werden ignoriert. -
Standard-Glob-Muster funktionieren und werden rekursiv im gesamten Arbeitsbaum angewendet.
-
Sie können Muster mit einem Schrägstrich (
/) beginnen, um Rekursivität zu vermeiden. -
Sie können Muster mit einem Schrägstrich (
/) beenden, um ein Verzeichnis anzugeben. -
Sie können ein Muster negieren, indem Sie es mit einem Ausrufezeichen (
!) beginnen.
Glob-Muster sind wie vereinfachte reguläre Ausdrücke, die von Shells verwendet werden. Ein Sternchen (*) passt auf null oder mehr Zeichen; [abc] passt auf jedes Zeichen innerhalb der Klammern (in diesem Fall a, b oder c); ein Fragezeichen (?) passt auf ein einzelnes Zeichen; und Klammern, die durch einen Bindestrich getrennte Zeichen enthalten ([0-9]), passen auf jedes Zeichen dazwischen (in diesem Fall 0 bis 9). Sie können auch zwei Sternchen verwenden, um verschachtelte Verzeichnisse abzugleichen; a/**/z würde a/z, a/b/z, a/b/c/z usw. abgleichen.
Hier ist eine weitere Beispiel-.gitignore-Datei
# ignore all .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in any directory named build
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory and any of its subdirectories
doc/**/*.pdf
|
Tipp
|
GitHub pflegt eine ziemlich umfassende Liste von guten |
|
Hinweis
|
Im einfachen Fall kann ein Repository eine einzige Es liegt außerhalb des Rahmens dieses Buches, auf die Details mehrerer |
Ihre vorbereiteten und nicht vorbereiteten Änderungen anzeigen
Wenn der Befehl git status für Sie zu vage ist – Sie möchten genau wissen, was Sie geändert haben, nicht nur, welche Dateien geändert wurden – können Sie den Befehl git diff verwenden. Wir werden git diff später ausführlicher behandeln, aber Sie werden ihn wahrscheinlich am häufigsten verwenden, um diese beiden Fragen zu beantworten: Was haben Sie geändert, aber noch nicht vorbereitet? Und was haben Sie vorbereitet, das Sie bald committen werden? Obwohl git status diese Fragen sehr allgemein beantwortet, indem es die Dateinamen auflistet, zeigt Ihnen git diff die exakt hinzugefügten und entfernten Zeilen – sozusagen den Patch.
Nehmen wir an, Sie ändern und bereiten die README-Datei erneut vor und ändern dann die CONTRIBUTING.md-Datei, ohne sie vorzubereiten. Wenn Sie Ihren git status-Befehl ausführen, sehen Sie wieder etwas Ähnliches wie hier
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: 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
Um zu sehen, was Sie geändert, aber noch nicht vorbereitet haben, geben Sie git diff ohne weitere Argumente ein
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.
If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
Dieser Befehl vergleicht, was sich in Ihrem Arbeitsverzeichnis befindet, mit dem, was sich in Ihrer Vorbereitungszone befindet. Das Ergebnis zeigt Ihnen die Änderungen, die Sie vorgenommen haben und die Sie noch nicht vorbereitet haben.
Wenn Sie sehen möchten, was Sie vorbereitet haben und was in Ihren nächsten Commit übernommen wird, können Sie git diff --staged verwenden. Dieser Befehl vergleicht Ihre vorbereiteten Änderungen mit Ihrem letzten Commit
$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project
Es ist wichtig zu beachten, dass git diff allein nicht alle Änderungen seit dem letzten Commit anzeigt – nur Änderungen, die noch nicht vorbereitet sind. Wenn Sie alle Ihre Änderungen vorbereitet haben, wird git diff keine Ausgabe liefern.
Als weiteres Beispiel: Wenn Sie die Datei CONTRIBUTING.md vorbereiten und sie dann ändern, können Sie git diff verwenden, um die Änderungen in der Datei zu sehen, die vorbereitet sind, und die Änderungen, die nicht vorbereitet sind. Wenn unsere Umgebung wie folgt aussieht
$ git add CONTRIBUTING.md
$ echo '# test line' >> CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: CONTRIBUTING.md
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
Jetzt können Sie git diff verwenden, um zu sehen, was noch nicht vorbereitet ist
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 643e24f..87f08c8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -119,3 +119,4 @@ at the
## Starter Projects
See our [projects list](https://github.com/libgit2/libgit2/blob/development/PROJECTS.md).
+# test line
und git diff --cached, um zu sehen, was Sie bisher vorbereitet haben (--staged und --cached sind Synonyme)
$ git diff --cached
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.
If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
|
Hinweis
|
Git Diff in einem externen Tool
Wir werden den Befehl |
Ihre Änderungen committen
Nachdem Ihre Vorbereitungszone so eingerichtet ist, wie Sie es möchten, können Sie Ihre Änderungen committen. Denken Sie daran, dass alles, was noch nicht vorbereitet ist – alle Dateien, die Sie erstellt oder geändert haben und auf die Sie seit der Bearbeitung kein git add angewendet haben – nicht in diesen Commit übernommen wird. Sie bleiben als geänderte Dateien auf Ihrer Festplatte. In diesem Fall nehmen wir an, dass Sie bei der letzten Ausführung von git status gesehen haben, dass alles vorbereitet war, sodass Sie bereit sind, Ihre Änderungen zu committen. Die einfachste Methode zum Committen ist die Eingabe von git commit
$ git commit
Dies startet Ihren Editor der Wahl.
|
Hinweis
|
Dies wird durch die |
Der Editor zeigt den folgenden Text an (dieses Beispiel ist ein Vim-Bildschirm)
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# new file: README
# modified: CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C
Sie können sehen, dass die Standard-Commit-Nachricht die letzte Ausgabe des Befehls git status auskommentiert und eine leere Zeile oben enthält. Sie können diese Kommentare entfernen und Ihre Commit-Nachricht eingeben, oder Sie können sie dort belassen, um sich daran zu erinnern, was Sie committen.
|
Hinweis
|
Für eine noch explizitere Erinnerung daran, was Sie geändert haben, können Sie die Option |
Wenn Sie den Editor beenden, erstellt Git Ihren Commit mit dieser Commit-Nachricht (wobei Kommentare und Diffs entfernt werden).
Alternativ können Sie Ihre Commit-Nachricht inline mit dem Befehl commit eingeben, indem Sie sie nach einem -m-Flag angeben, wie hier
$ git commit -m "Story 182: fix benchmarks for speed"
[master 463dc4f] Story 182: fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
Jetzt haben Sie Ihren ersten Commit erstellt! Sie können sehen, dass der Commit Ihnen einige Ausgaben über sich selbst geliefert hat: auf welchen Branch Sie committet haben (master), welche SHA-1-Prüfsumme der Commit hat (463dc4f), wie viele Dateien geändert wurden und Statistiken über hinzugefügte und entfernte Zeilen im Commit.
Denken Sie daran, dass der Commit den Schnappschuss aufzeichnet, den Sie in Ihrer Vorbereitungszone eingerichtet haben. Alles, was Sie nicht vorbereitet haben, liegt dort immer noch als geändert; Sie können einen weiteren Commit durchführen, um es in Ihre Historie aufzunehmen. Jedes Mal, wenn Sie einen Commit durchführen, zeichnen Sie einen Schnappschuss Ihres Projekts auf, zu dem Sie später zurückkehren oder den Sie vergleichen können.
Die Vorbereitungszone überspringen
Obwohl die Vorbereitungszone unglaublich nützlich sein kann, um Commits genau so zu gestalten, wie Sie es wünschen, ist sie manchmal etwas komplexer als Sie sie für Ihren Workflow benötigen. Wenn Sie die Vorbereitungszone überspringen möchten, bietet Git eine einfache Abkürzung. Das Hinzufügen der Option -a zum Befehl git commit bewirkt, dass Git automatisch jede Datei vorbereitet, die bereits verfolgt ist, bevor der Commit durchgeführt wird, wodurch Sie den Schritt git add überspringen können
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
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
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'Add new benchmarks'
[master 83e38c7] Add new benchmarks
1 file changed, 5 insertions(+), 0 deletions(-)
Beachten Sie, wie Sie in diesem Fall git add nicht auf die Datei CONTRIBUTING.md anwenden müssen, bevor Sie committen. Das liegt daran, dass das Flag -a alle geänderten Dateien einschließt. Das ist praktisch, aber seien Sie vorsichtig; manchmal wird dieses Flag dazu führen, dass Sie unerwünschte Änderungen einschließen.
Dateien entfernen
Um eine Datei aus Git zu entfernen, müssen Sie sie aus Ihren verfolgten Dateien entfernen (genauer gesagt, aus Ihrer Vorbereitungszone entfernen) und dann committen. Der Befehl git rm tut dies und entfernt auch die Datei aus Ihrem Arbeitsverzeichnis, sodass Sie sie beim nächsten Mal nicht als unverfolgte Datei sehen.
Wenn Sie die Datei einfach aus Ihrem Arbeitsverzeichnis entfernen, erscheint sie unter dem Bereich "Änderungen nicht für den Commit vorbereitet" (d. h. nicht vorbereitet) in der Ausgabe von git status
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: PROJECTS.md
no changes added to commit (use "git add" and/or "git commit -a")
Dann, wenn Sie git rm ausführen, wird die Entfernung der Datei vorbereitet
$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: PROJECTS.md
Beim nächsten Commit ist die Datei weg und wird nicht mehr verfolgt. Wenn Sie die Datei geändert oder sie bereits zur Vorbereitungszone hinzugefügt haben, müssen Sie die Entfernung mit der Option -f erzwingen. Dies ist eine Sicherheitsfunktion, um versehentliches Entfernen von Daten zu verhindern, die noch nicht in einem Schnappschuss aufgezeichnet wurden und die nicht aus Git wiederhergestellt werden können.
Eine weitere nützliche Sache, die Sie vielleicht tun möchten, ist, die Datei in Ihrem Arbeitsbaum zu belassen, sie aber aus Ihrer Vorbereitungszone zu entfernen. Mit anderen Worten, Sie möchten die Datei auf Ihrer Festplatte behalten, aber nicht mehr, dass Git sie verfolgt. Dies ist besonders nützlich, wenn Sie vergessen haben, etwas zu Ihrer .gitignore-Datei hinzuzufügen und sie versehentlich vorbereitet haben, wie eine große Protokolldatei oder eine Reihe von kompilierten .a-Dateien. Um dies zu tun, verwenden Sie die Option --cached
$ git rm --cached README
Sie können Dateien, Verzeichnisse und Dateimuster an den Befehl git rm übergeben. Das bedeutet, Sie können Dinge tun wie
$ git rm log/\*.log
Beachten Sie den Backslash (\) vor dem *. Dies ist notwendig, weil Git neben der Dateinamenerweiterung Ihrer Shell auch seine eigene Dateinamenerweiterung durchführt. Dieser Befehl entfernt alle Dateien mit der Erweiterung .log im Verzeichnis log/. Oder Sie können so etwas tun
$ git rm \*~
Dieser Befehl entfernt alle Dateien, deren Namen auf eine ~ enden.
Dateien verschieben
Im Gegensatz zu vielen anderen VCSs verfolgt Git Datei-Verschiebungen nicht explizit. Wenn Sie eine Datei in Git umbenennen, werden keine Metadaten in Git gespeichert, die ihm sagen, dass Sie die Datei umbenannt haben. Git ist jedoch ziemlich schlau darin, dies nachträglich herauszufinden – wir werden die Erkennung von Datei-Verschiebungen etwas später behandeln.
Daher ist es etwas verwirrend, dass Git einen mv-Befehl hat. Wenn Sie eine Datei in Git umbenennen möchten, können Sie so etwas ausführen
$ git mv file_from file_to
und es funktioniert einwandfrei. Tatsächlich, wenn Sie so etwas ausführen und sich den Status ansehen, werden Sie sehen, dass Git dies als umbenannte Datei betrachtet
$ git mv README.md README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Dies entspricht jedoch der Ausführung von etwas wie dem Folgenden
$ mv README.md README
$ git rm README.md
$ git add README
Git stellt implizit fest, dass es sich um eine Umbenennung handelt, daher spielt es keine Rolle, ob Sie eine Datei auf diese Weise oder mit dem Befehl mv umbenennen. Der einzige wirkliche Unterschied ist, dass git mv ein Befehl anstelle von drei ist – es ist eine Komfortfunktion. Wichtiger ist, dass Sie jedes Werkzeug verwenden können, um eine Datei umzubenennen, und die add/rm später vor dem Commit behandeln können.