
Ich weiß nicht, in welcher Programmiersprache Sie schreiben, aber ich bin sicher, dass Sie Geet während der Entwicklung verwenden. Es gibt immer mehr Tools zur Unterstützung der Entwicklung, aber selbst beim kleinsten Testprojekt beginne ich immer mit dem Befehl git init
. Und während des Arbeitstages tippe ich durchschnittlich weitere 80 Teams ein, die sich auf dieses Versionskontrollsystem beziehen.
Ich war sehr nervös, als ich anfing, die Zehn-Finger-Druckmethode neu zu lernen. Am Ende war dies die beste Entscheidung, um Ihren persönlichen Workflow zu verbessern. Zu den nächstwichtigsten Optimierungen gehört die Weiterentwicklung des Geeta.
Viele Artikel über Gita wurden über Habr geschrieben, aber sie gehen nicht über die offizielle Dokumentation hinaus, und die Autoren schlagen vor, die Arbeit mit selbst hergestellten Krücken zu vereinfachen. Ich bin sicher, dass es notwendig ist, das Geet an konkreten Beispielen von Aufgaben zu studieren und die Effizienz der Arbeit mit standardisierten Mitteln zu steigern.
Wer wird von diesem Artikel profitieren?
Haben Sie das Gita-Set des Gentlemans bereits gemeistert und sind Sie bereit, weiterzumachen? Es gibt zwei Möglichkeiten:
- Master abgekürzte Befehle - Aliase. Sie sind fast immer mnemonisch und leicht zu merken. Das Vergessen der ursprünglichen Befehle ist problematisch, ich tippe sie bei Bedarf einfach ein. Außerdem bin ich nicht verwirrt, wenn ich beim Schreiben von Code etwas in der Gita überprüfe.
- Erfahren Sie mehr über zusätzliche Flaggen für Teams sowie deren Integration untereinander. Ich verstehe, dass jemand das Schneiden hasst. Auch für Sie enthält der Artikel interessantes Material - wie Sie den Nutzen und die Bequemlichkeit der Befehlsausgabe erhöhen und nicht die trivialsten, aber in der Praxis häufig auftretenden Probleme lösen können .
Wenden Sie heute ein paar Stunden auf die im Artikel beschriebenen Experimente auf und sparen Sie durch ungefähre Berechnungen sechs Monate Arbeitszeit.
Willkommen bei Katze!
Vorbereitung
Unter Entwicklern ist der Standard für die Bash
Alternative Zsh
, eine fortschrittliche Software-Shell, die die Feinabstimmung unterstützt. Und unter Zsh
Benutzern besteht der Standard darin, Oh My Zsh
, eine Reihe vordefinierter Einstellungen für Zsh
. Nachdem wir dieses Kit installiert haben, erhalten wir eine Reihe von Hacks, die die Community im Laufe der Jahre für uns gesammelt und entwickelt hat.
Es ist sehr wichtig zu beachten, dass Zsh
für Linux , Mac und sogar Windows Zsh
ist.
Installieren Sie Zsh
und Oh My Zsh
Installieren Sie Zsh
und Oh My Zsh
gemäß den Anweisungen mit einem Befehl:
Da die Aufgabe darin besteht, die Interaktion mit dem Geet zu optimieren , werden wir Zsh
einige Plug-Ins Zsh
. Öffnen Sie die ~/.zshrc
und fügen Sie der Liste plugins
:
plugins=(git gitfast)
Gesamt:
git
- eine Reihe von Aliasen und Hilfsfunktionen;gitfast
- verbesserte automatische Vervollständigung für Gita.
tig
Einstellung
Der letzte Schliff ist die Installation des Dienstprogramms tig
console:
Wir werden weiter darüber reden.
Git in der Praxis
Der Umgang mit Geeta erfolgt am besten durch Lösen spezifischer Probleme. Als nächstes betrachten wir Aufgaben aus der täglichen Praxis und Optionen für ihre bequeme Lösung. Betrachten Sie dazu ein bestimmtes Repository mit Textdateien.
Die gelben Blöcke geben den Hauptalias zur Lösung des Problems aus dem Abschnitt an. Lerne nur es und überlasse alles andere der allgemeinen Entwicklung.
Überprüfen Sie den Status des Arbeitsverzeichnisses
Beginnen wir mit der grundlegendsten Sache. Wir haben ein wenig gearbeitet und jetzt wollen wir sehen, was im Arbeitsverzeichnis passiert:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: e.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: b.md Untracked files: (use "git add <file>..." to include in what will be committed) d.md
Der aktuelle Status aller Dateien wird ausführlich beschrieben, zusätzliche Handlungsanweisungen werden gegeben. Es ist zunächst sehr nützlich, wenn Sie Geeta verwenden, aber für die tägliche Arbeit ist viel überflüssig. Lassen Sie uns den Geräuschpegel mit zusätzlichen Tasten senken:
$ git status -sb
Ja, wir befinden uns im Hauptzweig, haben die b.md
( M-odified
) geändert und zwei Dateien erstellt, wobei die erste dem Geeta-Index ( A-dded
) A-dded
und die zweite aus dem Index entfernt wurde ( ??
). Kurz und klar.
Es bleibt die endlose Eingabe dieses Befehls durch den Alias " g it s tatus with b ranch" zu optimieren:
Status des verkürzten Arbeitsverzeichnisses anzeigen
$ gsb
Erstellen Sie ein Commit
Wir fahren fort.
Natürlich können Sie Commits machen. Aber versuchen wir, die Lösung dieser einfachen Aufgabe zu optimieren. Fügen Sie alle Änderungen zum Index mit dem Alias " g it a dd a ll" hinzu :
$ gaa
Wir überprüfen, ob der Index genau das hat, was wir brauchen, indem wir den Alias " g it d iff ca ched" verwenden :
$ gdca # git diff --cached diff --git a/b.md b/b.md index 698d533..cf20072 100644 --- a/b.md +++ b/b.md @@ -1,3 +1,3 @@ # Beta -Next step. +Next step really hard. diff --git a/d.md b/d.md new file mode 100644 index 0000000..9e3752e --- /dev/null +++ b/d.md @@ -0,0 +1,3 @@ +# Delta + +Body of article.
Hmm, Änderungen, die eine einzelne Aufgabe lösen, sollten in ein Commit fallen. Hier sind die Änderungen beider Dateien in keiner Weise miteinander verbunden. Lassen Sie uns d.md
die Datei d.md
mit dem Alias " g it r eset u ndo" aus dem Index ausschließen :
$ gru d.md # git reset
Und erstellen Sie ein Commit mit dem Alias " g it c ommit" :
$ gc
Wir schreiben den Namen des Commits und speichern. Und dann erstellen wir ein weiteres Commit für die Datei d.md
bekannteren Befehl unter Verwendung des Alias " g it c ommit m e s sa g e" :
$ gaa
Und wir können ...
... geänderte Dateien aus dem Index mit einem Befehl festschreiben:
$ gcam "Add changes"
... Änderungen durch Wörter anstelle von Zeilen sehen (sehr nützlich bei der Arbeit mit Text):
$ gdw
... Dateien in Teilen hinzufügen (sehr nützlich, wenn Sie nur einen Teil der Änderungen aus der Datei zum Commit hinzufügen müssen):
$ gapa
... nur Dateien zum Index hinzufügen, die bereits unter der Aufsicht der Geeta stehen:
$ gau
Gesamt:
Zum Index hinzufügen / Commit erstellen
$ ga
Fix Commit
Der Name des letzten Commits erklärt nicht die Änderungen, die wir vorgenommen haben. Lassen Sie uns neu formulieren:
$ gc!
Und im Texteditor, der geöffnet wird, nennen wir es deutlicher: "Add Delta article"
. Ich bin sicher, dass Sie niemals den Schalter -v
, obwohl beim Bearbeiten der Beschreibung des Commits alle vorgenommenen Änderungen angezeigt werden, was zu einer besseren Navigation beiträgt.
Und wir können ...
... Änderungen an der Festschreibung vornehmen, aber die Beschreibung nicht berühren:
$ gcn!
... alle Dateiänderungen sofort am Commit vornehmen, ohne zuerst den Index zu ergänzen:
$ gca!
... kombinieren Sie die beiden vorherigen Befehle:
$ gcan!
Nun, es ist noch einmal wichtig zu beachten, dass wir anstelle des vollständigen, regelmäßig verwendeten git commit -v --amend
nur drei Zeichen schreiben:
Letzte Festschreibung ändern
$ gc!
Erste Schritte mit einer neuen Funktion
Erstellen Sie einen neuen Zweig aus dem aktuellen Alias " g it c heckout b ranch" :
$ gcb erlang
Obwohl nein, ist es besser, einen Artikel über eine modernere Sprache von Elixir alias " g it b ranch with the key move" zu schreiben (das Umbenennen in der Gita erfolgt durch move
):
$ gb -m elixir
Es wäre logisch, den Alias gbmv
, aber leider wurde er noch nicht erfunden. Eine gute Option für einen Beitrag.
Wir nehmen Änderungen am Repository vor und erstellen ein Commit, wie wir bereits wissen:
$ echo "# — ." > e.md $ gaa && gcmsg "Add article about Elixir"
Und denken Sie daran:
Erstellen Sie einen neuen Zweig
$ gcb
Änderungen zusammenführen
Jetzt fügen wir unseren neuen Artikel über Elixier zum master
. Wechseln Sie zunächst mit dem Alias " g it c heckout m aster" zum Hauptzweig :
$ gcm
Nein, wirklich. Einer der am häufigsten verwendeten Befehle in drei leicht zu merkenden Zeichen. Jetzt lautet die Zusammenführung der Aliasänderung " g it m erge" :
$ gm elixir
Ups, aber jemand hat es bereits geschafft, Änderungen am master
vorzunehmen. Und anstelle der schönen linearen Geschichte, die in unserem Projekt übernommen wurde, habe ich erstellt gehasst Merge Commit.
Zweige zusammenführen
$ gm
Löschen Sie das letzte Commit
Nichts Schlimmes! Sie müssen nur das letzte Commit löschen und erneut versuchen, die Änderungen zusammenzuführen. " G it r eset hh ard" :
Letzte Festschreibung löschen
$ grhh HEAD~
Wir lösen Konflikte
Die Standard- checkout – rebase – merge
Sequenz zum checkout – rebase – merge
eines linearen Änderungsverlaufs wird von der folgenden Aliase-Sequenz ausgeführt:
gco elixir
Alle von ihnen werden so oft verwendet, dass sie bereits von den Fingern wegfliegen, und bei solchen Operationen muss nicht überlegt werden, welche Buchstaben eingegeben werden sollen. Und vergessen Sie nicht, dass Sie in Zsh
die Namen von Zweigen mit der Tab
ergänzen können.
Machen Sie eine Rebase
$ grb
Übermitteln von Änderungen an den Server
Zuerst fügen wir den origin
Alias " g it r emote a dd" hinzu :
$ gra origin git@github.com/...
Und dann senden wir die Änderungen direkt an den aktuellen Zweig des Repositorys ( "gg" - doppeltes g
am Anfang des Befehls zeigt die Ausführung der Aktion im aktuellen Zweig an):
$ ggpush
Sie können auch ...
... senden Sie die Änderungen mit der upstream
Installation des Alias " g it p ush s et up stream" an den Server:
$ gpsup
Senden Sie die Änderungen an den Server
$ gp
Wir erhalten Änderungen vom Server
Die Arbeit ist in vollem Gange. Es ist uns gelungen, einen neuen Artikel f.md
zum master
hinzuzufügen, und unsere Kollegen haben den Artikel a.md
geändert und diese Änderung an den Server gesendet. Diese Situation ist auch sehr einfach zu lösen:
$ gup
Dann können Sie sicher Änderungen an den Server senden. Der Konflikt ist beigelegt.
Holen Sie sich Änderungen vom Server
$ gl
Zusammengeführte Zweige löschen
Daher haben wir mehrere Zweige erfolgreich zu master
, einschließlich des elixir
aus dem vorherigen Beispiel. Wir brauchen sie nicht mehr. Sie können den Alias " g it b ranch d elete a nother" entfernen :
$ gbda
Sehr schönes und gerissenes Team. Normalerweise vergesse ich, Zweige zu löschen, die an Relevanz verloren haben, und dieses anmutige Team ist eine echte Rettung. Wenn Sie keinen Alias verwenden möchten, kopieren Sie einfach die Vollversion des Befehls in Ihre Notizen und führen Sie ihn nach Bedarf aus.
Erstellen Sie ein temporäres Commit
Die Arbeit an einem neuen h.md
Artikel über Haskell ist in vollem Gange. Die Hälfte ist geschrieben und Sie müssen Feedback von einem Kollegen erhalten. Ohne nachzudenken, geben wir den Alias " g it w ork i n p rogress" ein :
$ gwip
Anschließend wird ein Commit mit dem Namen Work in Progress
, wobei CI übersprungen und die "zusätzlichen" Dateien gelöscht werden. Wir senden den Zweig an den Server, sprechen über diesen Kollegen und warten auf die Überprüfung.
Dann kann dieses Commit rückgängig gemacht und die Dateien in ihren ursprünglichen Zustand zurückversetzt werden:
$ gunwip
Verwenden Sie den folgenden Befehl, um zu überprüfen, ob in Ihrer Zweigstelle WIP
Commits vorhanden sind:
$ work_in_progress
Der Befehl gwip
ist ein ziemlich zuverlässiges Analogon von stash
wenn Sie zu einem benachbarten Zweig wechseln müssen. Aber in Zsh
gibt es viele Aliase für stash
.
Temporäres Commit hinzufügen / Temporäres Commit zurücksetzen
$ gwip $ gunwip
Änderungen verbergen
Sie müssen mit diesem Befehl vorsichtig sein. Dateien können ausgeblendet und dann mit einer unachtsamen Aktion vollständig gelöscht werden, da es ein reflog
in dem Sie versuchen können, die verlorene Arbeit zu finden.
Verstecken wir die Dateien, an denen wir arbeiten, mit dem Alias g it st ash a ll :
$ gsta
Und geben Sie sie dann mit dem Alias " g it st ash p op" zurück :
$ gstp
Oder die sicherere Methode „ g it st ash a ll a pply“ :
$ gstaa
Sie können auch ...
... sehen, was genau wir versteckt haben:
gsts
... Abkürzungen für verwandte Befehle verwenden:
gstc
Änderungen ausblenden / Änderungen abrufen
$ gsta $ gstaa
Auf der Suche nach einem Fehler
Das git-bisect
Tool, das mir immer wieder das Leben gerettet hat, hat auch seine eigenen Aliase. Wir beginnen mit dem Start der Prozedur "Binäre Fehlersuche" mit dem Alias " g it b i s ect s tart" :
$ gbss
Wir stellen fest, dass das aktuelle Commit als letztes in der Verzweigung einen Fehler mit dem Alias " g it b i s ect b ad" enthält :
$ gbsb
Jetzt markieren wir das Commit, das uns den Betriebszustand der Anwendung garantiert: „ g it b i s ect g ood“ :
$ gbsg HEAD~20
Und jetzt bleibt es weiterhin, gbsb
Fragen mit den Sätzen gbsb
oder gbsg
zu beantworten und nach dem Auffinden des gbsg
das Verfahren zurückzusetzen:
$ gbsr
Und ich schreibe diese Abkürzungen wirklich, wenn ich dieses Werkzeug benutze.
Fehler beim Festschreiben der Suche
$ gbss
Wir suchen den Anstifter der Gesetzlosigkeit
Selbst bei einem hohen Prozentsatz der Codeabdeckung mit Tests ist niemand vor einer Situation gefeit, in der die Anwendung abstürzt und freundlicherweise auf eine bestimmte fehlerhafte Zeile zeigt. In unserem Fall möchten wir beispielsweise herausfinden, wer in der zweiten Zeile der Datei a.md
einen Fehler a.md
. Führen Sie dazu den folgenden Befehl aus:
$ gbl a.md -L 2
Sie sehen, Oh My Zsh
Mitarbeiter haben nicht nur einen Alias für das git blame
Team erstellt, sondern auch Schlüssel hinzugefügt, die es einfach machen, den Anstifter direkt zu finden.
Bonus
Zeigen Sie eine Liste der Commits an
Verwenden Sie zum Anzeigen der Liste der Commits den Befehl git log
mit zusätzlichen Ausgabeformatierungsschlüsseln. Normalerweise wird dieser Befehl zusammen mit den Schlüsseln in die benutzerdefinierten Aliase von Gita eingegeben. Wir haben mehr Glück, wir haben bereits einen vorgefertigten Alias: glog
. Und wenn Sie das tig
Dienstprogramm tig
den Empfehlungen vom Anfang des Artikels installiert haben, sind Sie ein absoluter Champion.
Um den Verlauf von Commits in der Konsole auf sehr bequeme Weise zu lernen, müssen Sie das Wort git
umgekehrt eingeben:
$ tig
Das Dienstprogramm bietet auch einige nützliche Ergänzungen, die nicht sofort in der Gita enthalten sind.
Zunächst ein Befehl zum Durchsuchen des Inhalts einer Geschichte:
$ tig grep
Zweitens: Anzeigen einer Liste aller Quellen, Zweige und Tags mit ihrem Verlauf:
$ tig refs
Drittens finden Sie vielleicht etwas Interessantes für sich selbst:
$ tig --help
Versehentlich git reset --hard
Sie haben den ganzen Tag am elixir
:
$ glog * 17cb385 (HEAD -> elixir) Refine Elixir article * c14b4dc Add article about Elixir * db84d54 (master) Initial commit
Und am Ende haben sie versehentlich alles gelöscht:
$ grhh HEAD~2 HEAD is now at db84d54 Initial commit
Kein Grund zur Panik. Die wichtigste Regel ist, die Ausführung von Befehlen in der Gita zu beenden und auszuatmen . Alle Aktionen mit dem lokalen Repository werden in einem speziellen Protokoll- reflog
. Daraus können Sie den Hash des gewünschten Commits abrufen und im Arbeitsbaum wiederherstellen.
Schauen wir uns das Reflog an, aber nicht auf die übliche Weise durch git reflog
, sondern interessanter mit einem detaillierten Transkript:
$ glg -g
Suchen Sie den Hash des gewünschten 17cb385
Commits und stellen Sie ihn wieder her:
Anstatt ein neues Commit zu erstellen, habe ich zufällig Änderungen am vorherigen vorgenommen
Auch hier kommen wir zur Rettungshilfe um. Wir finden den Hash des ursprünglichen 17cb385
Commits. Wenn wir den Commit sofort abbrechen, können wir anstelle des Hash den Quick-Link zu HEAD@{1}
. Als nächstes führen wir einen Soft-Reset durch, während der Index nicht zurückgesetzt wird:
Der Zweig ist zu alt
Manchmal beginnt man mit der Arbeit an einem Feature, aber die Veröffentlichung wird auf unbestimmte Zeit verzögert. Sie verpflichten sich und wechseln zu anderen Aufgaben. Zusammen mit dem Team nehmen Sie eine Reihe von Änderungen am Master vor und kehren nach einer Weile mit Funktionen zum Zweig zurück. Sie versuchen, die Basis neu zu bestimmen, aber er bietet an, Konflikte in einem Dutzend Commits zu analysieren. Sie können versuchen, sie alle zu lösen oder es einfacher zu machen.
Schauen wir uns ein Beispiel für einen Feature-Zweig namens elixir
:
Anstatt zu versuchen, den Zweig zu aktualisieren, nehmen wir ein einzelnes Commit ohne Probleme und übertragen es.
Wichtige Daten aus dem Repository entfernen
Um wichtige Daten aus dem Repository zu löschen, habe ich das folgende Snippet gespeichert:
$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <path-to-your-file>' --prune-empty --tag-name-filter cat -- --all && git push origin --force --all
Wenn Sie diesen Befehl stash
wird Ihr stash
. Vor der Ausführung wird empfohlen, alle versteckten Änderungen zu erhalten. Lesen Sie hier mehr über diese Technik.
Bezugnehmend auf den vorherigen Zweig
Wenn Sie einige Befehle ausführen, bei denen die Eingabe eines Zweignamens erwartet wird, können Sie einen Bindestrich als Referenz auf den Zweig übergeben, mit dem wir gekommen sind. Es ist besonders gut, diesen Checkout-Trick zu verwenden:
$ gco -
Löschen Sie alle in .gitignore
markierten .gitignore
Ein weiterer häufiger Rückschlag ist zu spät, um unerwünschte Dateien oder Verzeichnisse zu .gitignore
. Um sie aus dem Repository zu bereinigen ( und von der Festplatte zu löschen ), gibt es bereits vorgefertigte Schlüssel für den Befehl git clean
:
$ gclean -X
Seid vorsichtig!
Lesen Sie weiter für den richtigen Weg.
Warum brauchen viele Teams den Schalter --dry-run
?
Der --dry-run
nur als Vorsichtsmaßnahme bei der Deinstallation und Aktualisierung benötigt. Im vorherigen Abschnitt wurde beispielsweise beschrieben, wie Sie alles löschen, was in der .gitignore
Datei angegeben ist. Es ist besser, vorsichtig zu sein und den Schalter --dry-run
, --dry-run
Liste aller zu löschenden Dateien --dry-run
und den Befehl erst dann ohne --dry-run
.
Fazit
Der Artikel zeigt einen Punkt zur Optimierung der Arbeit des Programmierers. Denken Sie daran, 10-20 mnemonische Abkürzungen sind nicht schwierig, vergessen Sie, dass das ursprüngliche Team fast unmöglich ist. Die Aliase sind standardisiert. Wenn Sie also das gesamte Team auf Zsh
+ Oh My Zsh
, können Sie auch bei der Oh My Zsh
mit der gleichen Geschwindigkeit und dem gleichen Komfort arbeiten.
Wohin als nächstes?
Ich biete folgende Optionen an:
- Stellen Sie schließlich fest, wie das Geet im Inneren angeordnet ist . Es hilft zu verstehen, was Sie tun und warum das, was Sie tun möchten, nicht funktioniert.
git --help
Sie nicht faul, noch einmal die Dokumentation für die Befehle zu git --help
: git --help
oder ghh
.- Die vollständige Liste der Aliase finden Sie unter dem Link . Der Versuch, sich an alle zu erinnern, ist verrückt, aber die Liste als Sammlung interessanter Befehle und Schlüssel zu verwenden, ist eine gute Idee.
Einige Aliase werden nicht trivial erstellt, erweisen sich jedoch in der Praxis als sehr nützlich. Viele der vorgestellten Aliase sind nicht nur Abkürzungen, sondern kleine Funktionen, die die Arbeit weiter optimieren. Die Verwendung von Git ist angenehmer geworden, die Qualität der Commits hat sich verbessert.
Ich hoffe, das Material hat sich als nützlich erwiesen und Sie konnten etwas Neues für sich selbst lernen. Oder vielleicht haben sie bereits begonnen, einen neuen Ansatz aktiv einzuführen. Viel Glück