-
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
6.2 GitHub - Beitrag zu einem Projekt
Beitrag zu einem Projekt
Nachdem wir nun unser Konto eingerichtet haben, gehen wir einige Details durch, die für Ihren Beitrag zu einem bestehenden Projekt nützlich sein könnten.
Projekte forken
Wenn Sie zu einem bestehenden Projekt beitragen möchten, zu dem Sie keinen Push-Zugriff haben, können Sie das Projekt "forken". Wenn Sie ein Projekt "forken", erstellt GitHub eine Kopie des Projekts, die Ihnen vollständig gehört. Sie befindet sich in Ihrem Namespace, und Sie können darauf pushen.
|
Hinweis
|
Historisch gesehen hatte der Begriff "Fork" im Kontext eine etwas negative Bedeutung, da er bedeutete, dass jemand ein Open-Source-Projekt in eine andere Richtung lenkte, manchmal ein konkurrierendes Projekt erstellte und die Mitwirkenden spaltete. In GitHub ist ein "Fork" einfach dasselbe Projekt in Ihrem eigenen Namespace, das es Ihnen ermöglicht, Änderungen an einem Projekt öffentlich vorzunehmen, um auf offenere Weise beizutragen. |
Auf diese Weise müssen sich Projekte keine Sorgen machen, Benutzer als Mitarbeiter hinzuzufügen, um ihnen Push-Zugriff zu gewähren. Personen können ein Projekt forken, darauf pushen und ihre Änderungen zum ursprünglichen Repository zurückführen, indem sie einen sogenannten Pull-Request erstellen, den wir als Nächstes behandeln werden. Dies eröffnet einen Diskussionsfaden mit Code-Reviews, und der Eigentümer und der Mitwirkende können dann über die Änderung kommunizieren, bis der Eigentümer damit zufrieden ist, woraufhin der Eigentümer sie mergen kann.
Um ein Projekt zu forken, besuchen Sie die Projektseite und klicken Sie auf die Schaltfläche "Fork" oben rechts auf der Seite.
Nach einigen Sekunden werden Sie zu Ihrer neuen Projektseite weitergeleitet, mit Ihrer eigenen beschreibbaren Kopie des Codes.
Der GitHub-Flow
GitHub ist auf einen bestimmten Kollaborations-Workflow ausgelegt, der sich auf Pull-Requests konzentriert. Dieser Flow funktioniert, egal ob Sie mit einem eng verbundenen Team in einem einzigen gemeinsamen Repository zusammenarbeiten oder mit einem global verteilten Unternehmen oder einem Netzwerk von Fremden, die über Dutzende von Forks zu einem Projekt beitragen. Er konzentriert sich auf den Workflow mit Topic Branches, der in Git Branching behandelt wird.
So funktioniert es im Allgemeinen
-
Forken Sie das Projekt.
-
Erstellen Sie einen Topic-Branch aus
master. -
Machen Sie einige Commits, um das Projekt zu verbessern.
-
Pushen Sie diesen Branch in Ihr GitHub-Projekt.
-
Öffnen Sie einen Pull-Request auf GitHub.
-
Diskutieren Sie und committen Sie optional weiter.
-
Der Projekteigentümer mergt oder schließt den Pull-Request.
-
Synchronisieren Sie das aktualisierte
masterzurück in Ihren Fork.
Dies ist im Grunde der Integration-Manager-Workflow, der in Integration-Manager Workflow behandelt wird, aber anstatt E-Mails für die Kommunikation und Überprüfung von Änderungen zu verwenden, nutzen Teams die webbasierten Tools von GitHub.
Lassen Sie uns ein Beispiel durchgehen, wie Sie mit diesem Flow eine Änderung an einem Open-Source-Projekt vorschlagen, das auf GitHub gehostet wird.
|
Tipp
|
Sie können das offizielle **GitHub CLI**-Tool anstelle der GitHub-Weboberfläche für die meisten Dinge verwenden. Das Tool kann unter Windows, macOS und Linux verwendet werden. Besuchen Sie die GitHub CLI-Homepage für Installationsanweisungen und das Handbuch. |
Erstellen eines Pull-Requests
Tony sucht nach Code, den er auf seinem programmierbaren Arduino-Mikrocontroller ausführen kann, und hat eine großartige Programmdatei auf GitHub unter https://github.com/schacon/blink gefunden.
Das einzige Problem ist, dass die Blinkrate zu hoch ist. Wir finden es viel schöner, 3 Sekunden statt 1 Sekunde zwischen den Zustandswechseln zu warten. Lassen Sie uns das Programm also verbessern und es als vorgeschlagene Änderung an das Projekt zurücksenden.
Zuerst klicken wir auf die Schaltfläche "Fork", wie oben erwähnt, um unsere eigene Kopie des Projekts zu erhalten. Unser Benutzername hier ist "tonychacon", also befindet sich unsere Kopie dieses Projekts unter https://github.com/tonychacon/blink, und dort können wir es bearbeiten. Wir werden es lokal klonen, einen Topic-Branch erstellen, die Codeänderung vornehmen und diese Änderung schließlich wieder auf GitHub pushen.
$ git clone https://github.com/tonychacon/blink (1)
Cloning into 'blink'...
$ cd blink
$ git checkout -b slow-blink (2)
Switched to a new branch 'slow-blink'
$ sed -i '' 's/1000/3000/' blink.ino (macOS) (3)
# If you're on a Linux system, do this instead:
# $ sed -i 's/1000/3000/' blink.ino (3)
$ git diff --word-diff (4)
diff --git a/blink.ino b/blink.ino
index 15b9911..a6cc5a5 100644
--- a/blink.ino
+++ b/blink.ino
@@ -18,7 +18,7 @@ void setup() {
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
[-delay(1000);-]{+delay(3000);+} // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
[-delay(1000);-]{+delay(3000);+} // wait for a second
}
$ git commit -a -m 'Change delay to 3 seconds' (5)
[slow-blink 5ca509d] Change delay to 3 seconds
1 file changed, 2 insertions(+), 2 deletions(-)
$ git push origin slow-blink (6)
Username for 'https://github.com': tonychacon
Password for 'https://tonychacon@github.com':
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 340 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/tonychacon/blink
* [new branch] slow-blink -> slow-blink
-
Klonen Sie unseren Fork des Projekts lokal.
-
Erstellen Sie einen aussagekräftigen Topic-Branch.
-
Nehmen Sie unsere Änderung am Code vor.
-
Überprüfen Sie, ob die Änderung gut ist.
-
Committen Sie unsere Änderung in den Topic-Branch.
-
Pushen Sie unseren neuen Topic-Branch zurück in unseren GitHub-Fork.
Wenn wir nun zu unserem Fork auf GitHub zurückkehren, sehen wir, dass GitHub bemerkt hat, dass wir einen neuen Topic-Branch hochgeladen haben, und uns eine große grüne Schaltfläche anzeigt, um unsere Änderungen zu überprüfen und einen Pull-Request an das ursprüngliche Projekt zu öffnen.
Alternativ können Sie die Seite "Branches" unter https://github.com/<user>/<project>/branches besuchen, um Ihren Branch zu finden und von dort aus einen neuen Pull-Request zu öffnen.
Wenn wir auf diese grüne Schaltfläche klicken, sehen wir einen Bildschirm, auf dem wir aufgefordert werden, unserem Pull-Request einen Titel und eine Beschreibung zu geben. Es lohnt sich fast immer, sich Mühe zu geben, da eine gute Beschreibung dem Eigentümer des ursprünglichen Projekts hilft zu bestimmen, was Sie zu tun versucht haben, ob Ihre vorgeschlagenen Änderungen korrekt sind und ob die Annahme der Änderungen das ursprüngliche Projekt verbessern würde.
Wir sehen auch eine Liste der Commits in unserem Topic-Branch, die sich "vor" dem master-Branch befinden (in diesem Fall nur einer) und einen einheitlichen Diff aller Änderungen, die vorgenommen werden, wenn dieser Branch vom Projekteigentümer gemergt wird.
Wenn Sie auf dieser Seite auf die Schaltfläche "Create pull request" klicken, erhält der Eigentümer des Projekts, das Sie geforkt haben, eine Benachrichtigung, dass jemand eine Änderung vorschlägt, und wird zu einer Seite weitergeleitet, auf der all diese Informationen enthalten sind.
|
Hinweis
|
Obwohl Pull-Requests für öffentliche Projekte wie dieses häufig verwendet werden, wenn der Mitwirkende eine vollständige Änderung zur Verfügung hat, werden sie auch oft in internen Projekten *zu Beginn* des Entwicklungszyklus verwendet. Da Sie auch nachdem der Pull-Request geöffnet wurde, weiterhin auf den Topic-Branch pushen können, wird er oft frühzeitig geöffnet und als Möglichkeit genutzt, die Arbeit im Team in einem bestimmten Kontext zu iterieren, anstatt am Ende des Prozesses geöffnet zu werden. |
Iterieren an einem Pull-Request
An diesem Punkt kann der Projekteigentümer die vorgeschlagene Änderung prüfen und sie mergen, ablehnen oder kommentieren. Nehmen wir an, ihm gefällt die Idee, aber er bevorzugt eine etwas längere Wartezeit, in der das Licht aus ist, als dass es an ist.
Wo diese Unterhaltung in den in Distributed Git vorgestellten Workflows per E-Mail stattfinden mag, geschieht dies auf GitHub online. Der Projekteigentümer kann den einheitlichen Diff überprüfen und durch Klicken auf eine beliebige Zeile einen Kommentar hinterlassen.
Sobald der Maintainer diesen Kommentar abgibt, erhält die Person, die den Pull-Request geöffnet hat (und tatsächlich jeder andere, der das Repository beobachtet), eine Benachrichtigung. Wir werden die Anpassung später behandeln, aber wenn er E-Mail-Benachrichtigungen aktiviert hätte, würde Tony eine E-Mail wie diese erhalten
Jeder kann auch allgemeine Kommentare zum Pull-Request hinterlassen. Auf der Pull-Request-Diskussionsseite sehen wir ein Beispiel dafür, wie der Projekteigentümer sowohl einen Kommentar zu einer Codezeile abgibt als auch einen allgemeinen Kommentar im Diskussionsbereich hinterlässt. Sie können sehen, dass die Code-Kommentare auch in die Unterhaltung einbezogen werden.
Nun kann der Mitwirkende sehen, was er tun muss, um seine Änderung akzeptiert zu bekommen. Glücklicherweise ist dies sehr einfach. Wo Sie per E-Mail Ihre Serie neu aufrollen und an die Mailingliste zurücksenden müssten, committen Sie mit GitHub einfach erneut in den Topic-Branch und pushen, was den Pull-Request automatisch aktualisiert. In Pull Request final sehen Sie auch, dass der alte Code-Kommentar im aktualisierten Pull-Request eingeklappt wurde, da er sich auf eine Zeile bezog, die seitdem geändert wurde.
Das Hinzufügen von Commits zu einem bestehenden Pull-Request löst keine Benachrichtigung aus, daher beschließt Tony, nachdem er seine Korrekturen gepusht hat, einen Kommentar zu hinterlassen, um den Projekteigentümer darüber zu informieren, dass er die gewünschte Änderung vorgenommen hat.
Interessant ist, dass Sie, wenn Sie auf den Tab "Files Changed" in diesem Pull-Request klicken, den "einheitlichen" Diff erhalten - das heißt, die gesamte aggregierte Differenz, die in Ihren Haupt-Branch eingeführt würde, wenn dieser Topic-Branch gemergt würde. In git diff-Begriffen zeigt er Ihnen im Grunde automatisch git diff master…<branch> für den Branch, auf dem dieser Pull-Request basiert. Weitere Informationen zu dieser Art von Diff finden Sie unter Bestimmen, was eingeführt wird.
Das andere, was Ihnen auffallen wird, ist, dass GitHub prüft, ob der Pull-Request sauber mergt und eine Schaltfläche bereitstellt, um den Merge für Sie auf dem Server durchzuführen. Diese Schaltfläche wird nur angezeigt, wenn Sie Schreibzugriff auf das Repository haben und ein trivialer Merge möglich ist. Wenn Sie darauf klicken, führt GitHub einen "Non-Fast-Forward"-Merge durch, was bedeutet, dass selbst wenn der Merge ein Fast-Forward sein könnte, immer noch ein Merge-Commit erstellt wird.
Wenn Sie möchten, können Sie den Branch auch einfach herunterziehen und lokal mergen. Wenn Sie diesen Branch in den master-Branch mergen und auf GitHub pushen, wird der Pull-Request automatisch geschlossen.
Dies ist der grundlegende Workflow, den die meisten GitHub-Projekte verwenden. Topic-Branches werden erstellt, Pull-Requests werden darauf geöffnet, eine Diskussion folgt, möglicherweise werden weitere Arbeiten am Branch durchgeführt und schließlich wird die Anfrage entweder geschlossen oder gemergt.
|
Hinweis
|
Nicht nur Forks
Es ist wichtig zu beachten, dass Sie auch einen Pull-Request zwischen zwei Branches im selben Repository öffnen können. Wenn Sie mit jemandem an einem Feature arbeiten und beide Schreibzugriff auf das Projekt haben, können Sie einen Topic-Branch in das Repository pushen und einen Pull-Request darauf an den |
Fortgeschrittene Pull-Requests
Nachdem wir nun die Grundlagen der Beitragsleistung zu einem Projekt auf GitHub behandelt haben, werden wir einige interessante Tipps und Tricks zu Pull-Requests besprechen, damit Sie diese effektiver nutzen können.
Pull-Requests als Patches
Es ist wichtig zu verstehen, dass viele Projekte Pull-Requests nicht wirklich als Reihen von perfekten Patches betrachten, die sauber und in Ordnung angewendet werden sollten, so wie es bei den meisten auf Mailinglisten basierenden Projekten der Fall ist. Die meisten GitHub-Projekte betrachten Pull-Request-Branches als iterative Konversationen rund um eine vorgeschlagene Änderung, die in einem einheitlichen Diff gipfeln, der durch Mergen angewendet wird.
Dies ist eine wichtige Unterscheidung, da die Änderung im Allgemeinen vorgeschlagen wird, bevor der Code als perfekt erachtet wird, was bei auf Mailinglisten basierenden Patch-Serienbeiträgen weitaus seltener vorkommt. Dies ermöglicht eine frühere Konversation mit den Maintainern, so dass das Erreichen der richtigen Lösung eher zu einer Gemeinschaftsleistung wird. Wenn Code mit einem Pull-Request vorgeschlagen wird und die Maintainer oder die Community eine Änderung vorschlagen, wird die Patch-Serie im Allgemeinen nicht neu aufgerollt, sondern stattdessen wird die Differenz als neuer Commit in den Branch gepusht, was die Konversation mit dem Kontext der bisherigen Arbeit beibehält.
Wenn Sie beispielsweise noch einmal zu Pull Request final zurückkehren, werden Sie feststellen, dass der Mitwirkende seinen Commit nicht neu aufgerollt und einen weiteren Pull-Request gesendet hat. Stattdessen hat er neue Commits hinzugefügt und sie in den bestehenden Branch gepusht. Auf diese Weise können Sie, wenn Sie diesen Pull-Request in Zukunft noch einmal ansehen, leicht den gesamten Kontext finden, warum Entscheidungen getroffen wurden. Das Drücken der "Merge"-Schaltfläche auf der Website erstellt absichtlich einen Merge-Commit, der auf den Pull-Request verweist, so dass es einfach ist, die ursprüngliche Konversation bei Bedarf zu recherchieren.
Aktuell bleiben mit Upstream
Wenn Ihr Pull-Request veraltet ist oder anderweitig nicht sauber mergt, sollten Sie ihn reparieren, damit der Maintainer ihn problemlos mergen kann. GitHub testet dies für Sie und teilt Ihnen am Ende jedes Pull-Requests mit, ob der Merge trivial ist oder nicht.
Wenn Sie etwas wie Pull-Request mergt nicht sauber sehen, sollten Sie Ihren Branch reparieren, damit er grün wird und der Maintainer keine zusätzliche Arbeit hat.
Sie haben zwei Hauptoptionen, um dies zu tun. Sie können entweder Ihren Branch auf dem Ziel-Branch neu aufrollen (normalerweise der master-Branch des Repositorys, das Sie geforkt haben) oder Sie können den Ziel-Branch in Ihren Branch mergen.
Die meisten Entwickler auf GitHub werden sich für Letzteres entscheiden, aus denselben Gründen, die wir gerade im vorherigen Abschnitt besprochen haben. Was zählt, ist die Historie und der endgültige Merge, daher bringt Ihnen das Neuaufrollen nicht viel mehr als eine etwas sauberere Historie und ist im Gegenzug **weitaus** schwieriger und fehleranfälliger.
Wenn Sie den Ziel-Branch mergen möchten, um Ihren Pull-Request mergbar zu machen, würden Sie das ursprüngliche Repository als neues Remote hinzufügen, davon fetchen, den Haupt-Branch dieses Repositorys in Ihren Topic-Branch mergen, alle Probleme beheben und ihn schließlich wieder auf denselben Branch pushen, auf dem Sie den Pull-Request geöffnet haben.
Nehmen wir zum Beispiel an, dass im "tonychacon"-Beispiel, das wir zuvor verwendet haben, der ursprüngliche Autor eine Änderung vorgenommen hat, die einen Konflikt im Pull-Request verursachen würde. Gehen wir diese Schritte durch.
$ git remote add upstream https://github.com/schacon/blink (1)
$ git fetch upstream (2)
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From https://github.com/schacon/blink
* [new branch] master -> upstream/master
$ git merge upstream/master (3)
Auto-merging blink.ino
CONFLICT (content): Merge conflict in blink.ino
Automatic merge failed; fix conflicts and then commit the result.
$ vim blink.ino (4)
$ git add blink.ino
$ git commit
[slow-blink 3c8d735] Merge remote-tracking branch 'upstream/master' \
into slower-blink
$ git push origin slow-blink (5)
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 682 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To https://github.com/tonychacon/blink
ef4725c..3c8d735 slower-blink -> slow-blink
-
Fügen Sie das ursprüngliche Repository als Remote mit dem Namen
upstreamhinzu. -
Holen Sie die neuesten Arbeiten von diesem Remote.
-
Mergen Sie den Haupt-Branch dieses Repositorys in Ihren Topic-Branch.
-
Beheben Sie den aufgetretenen Konflikt.
-
Pushen Sie zurück in denselben Topic-Branch.
Sobald Sie dies getan haben, wird der Pull-Request automatisch aktualisiert und erneut geprüft, ob er sauber mergt.
Eines der großartigen Dinge an Git ist, dass Sie dies kontinuierlich tun können. Wenn Sie ein sehr lang laufendes Projekt haben, können Sie problemlos immer wieder vom Ziel-Branch mergen und nur Konflikte beheben, die seit dem letzten Merge aufgetreten sind, was den Prozess sehr überschaubar macht.
Wenn Sie den Branch unbedingt neu aufrollen möchten, um ihn zu bereinigen, können Sie dies natürlich tun, aber es wird dringend davon abgeraten, über den Branch zu forcieren, auf dem der Pull-Request bereits geöffnet ist. Wenn andere Leute ihn heruntergezogen und weitere Arbeit daran geleistet haben, treten alle Probleme auf, die in The Perils of Rebasing beschrieben sind. Pushen Sie stattdessen den neu aufgerollten Branch in einen neuen Branch auf GitHub und öffnen Sie einen brandneuen Pull-Request, der den alten referenziert, und schließen Sie dann den ursprünglichen.
Referenzen
Ihre nächste Frage könnte sein: "Wie referenziere ich den alten Pull-Request?". Es stellt sich heraus, dass es viele, viele Möglichkeiten gibt, andere Dinge fast überall zu referenzieren, wo Sie auf GitHub schreiben können.
Beginnen wir damit, wie man einen anderen Pull-Request oder ein Issue referenziert. Alle Pull-Requests und Issues erhalten Nummern und sind innerhalb des Projekts eindeutig. Sie können zum Beispiel nicht Pull-Request #3 *und* Issue #3 haben. Wenn Sie einen Pull-Request oder ein Issue von einem anderen referenzieren möchten, können Sie einfach #<num> in einen Kommentar oder eine Beschreibung einfügen. Sie können auch spezifischer sein, wenn das Issue oder der Pull-Request woanders liegt; schreiben Sie username#<num>, wenn Sie sich auf ein Issue oder einen Pull-Request in einem Fork des Repositorys beziehen, in dem Sie sich befinden, oder username/repo#<num>, um etwas in einem anderen Repository zu referenzieren.
Sehen wir uns ein Beispiel an. Nehmen wir an, wir haben den Branch im vorherigen Beispiel neu aufgerollt, einen neuen Pull-Request dafür erstellt und möchten nun den alten Pull-Request aus dem neuen referenzieren. Wir möchten auch auf ein Issue im Fork des Repositorys und ein Issue in einem völlig anderen Projekt verweisen. Wir können die Beschreibung wie in Cross references in a Pull Request ausfüllen.
Wenn wir diesen Pull-Request einreichen, sehen wir all dies gerendert, wie in Cross references rendered in a Pull Request.
Beachten Sie, dass die vollständige GitHub-URL, die wir dort eingegeben haben, auf die Informationen gekürzt wurde, die benötigt werden.
Wenn Tony nun zurückgeht und den ursprünglichen Pull-Request schließt, können wir sehen, dass GitHub durch die Erwähnung im neuen Pull-Request automatisch ein Trackback-Ereignis in der Timeline des Pull-Requests erstellt hat. Das bedeutet, dass jeder, der diesen Pull-Request besucht und sieht, dass er geschlossen ist, leicht zu dem zurückverlinken kann, der ihn abgelöst hat. Der Link sieht ungefähr so aus, wie in Link back to the new Pull Request in the closed Pull Request timeline.
Zusätzlich zu Issue-Nummern können Sie auch einen bestimmten Commit mit SHA-1 referenzieren. Sie müssen eine vollständige 40-stellige SHA-1-Nummer angeben, aber wenn GitHub diese in einem Kommentar sieht, wird sie direkt auf den Commit verlinken. Auch hier können Sie Commits in Forks oder anderen Repositories auf dieselbe Weise referenzieren wie Issues.
GitHub Flavored Markdown
Das Verlinken auf andere Issues ist nur der Anfang von interessanten Dingen, die Sie mit fast jeder Textbox auf GitHub tun können. In Issue- und Pull-Request-Beschreibungen, Kommentaren, Code-Kommentaren und mehr können Sie die sogenannte "GitHub Flavored Markdown" verwenden. Markdown ist wie das Schreiben in reinem Text, das aber reichhaltig gerendert wird.
Siehe An example of GitHub Flavored Markdown as written and as rendered für ein Beispiel dafür, wie Kommentare oder Text geschrieben und dann mit Markdown gerendert werden können.
Die GitHub-Variante von Markdown fügt weitere Dinge hinzu, die Sie über die grundlegende Markdown-Syntax hinaus tun können. Diese können alle sehr nützlich sein, wenn Sie nützliche Pull-Request- oder Issue-Kommentare oder Beschreibungen erstellen.
Aufgabenlisten
Das erste wirklich nützliche, GitHub-spezifische Markdown-Feature, insbesondere für die Verwendung in Pull-Requests, ist die Aufgabenliste. Eine Aufgabenliste ist eine Liste von Checkboxen mit Dingen, die Sie erledigen möchten. Das Einfügen in ein Issue oder einen Pull-Request zeigt normalerweise Dinge an, die Sie erledigen möchten, bevor Sie den Punkt als abgeschlossen betrachten.
Sie können eine Aufgabenliste wie folgt erstellen
- [X] Write the code
- [ ] Write all the tests
- [ ] Document the code
Wenn wir dies in die Beschreibung unseres Pull-Requests oder Issues aufnehmen, sehen wir es gerendert, wie in Task lists rendered in a Markdown comment.
Dies wird oft in Pull-Requests verwendet, um anzuzeigen, was alles erledigt werden soll, bevor der Pull-Request zum Mergen bereit ist. Der wirklich coole Teil ist, dass Sie einfach auf die Checkboxen klicken können, um den Kommentar zu aktualisieren – Sie müssen das Markdown nicht direkt bearbeiten, um Aufgaben abzuhaken.
Darüber hinaus sucht GitHub nach Aufgabenlisten in Ihren Issues und Pull-Requests und zeigt sie als Metadaten auf den Seiten an, die sie auflisten. Wenn Sie beispielsweise einen Pull-Request mit Aufgaben haben und sich die Übersichtsseite aller Pull-Requests ansehen, können Sie sehen, wie weit er fortgeschritten ist. Dies hilft den Leuten, Pull-Requests in Unteraufgaben aufzuteilen und hilft anderen, den Fortschritt des Branches zu verfolgen. Ein Beispiel dafür sehen Sie in Task list summary in the Pull Request list.
Diese sind unglaublich nützlich, wenn Sie einen Pull-Request frühzeitig öffnen und ihn verwenden, um Ihren Fortschritt bei der Implementierung des Features zu verfolgen.
Code-Snippets
Sie können auch Code-Snippets zu Kommentaren hinzufügen. Dies ist besonders nützlich, wenn Sie etwas präsentieren möchten, das Sie versuchen *könnten*, zu tun, bevor Sie es tatsächlich als Commit auf Ihrem Branch implementieren. Dies wird auch oft verwendet, um Beispielcode hinzuzufügen, der nicht funktioniert oder was dieser Pull-Request implementieren könnte.
Um ein Code-Snippet hinzuzufügen, müssen Sie es mit Backticks "einfrieden".
```java
for(int i=0 ; i < 5 ; i++)
{
System.out.println("i is : " + i);
}
```
Wenn Sie einen Sprachnamen hinzufügen, wie wir es dort mit 'java' getan haben, wird GitHub auch versuchen, das Snippet syntaktisch hervorzuheben. Im Fall des obigen Beispiels würde es gerendert, wie in Rendered fenced code example.
Zitat
Wenn Sie auf einen kleinen Teil eines langen Kommentars antworten, können Sie selektiv aus dem anderen Kommentar zitieren, indem Sie die Zeilen mit dem Zeichen > versehen. Tatsächlich ist dies so üblich und so nützlich, dass es eine Tastenkombination dafür gibt. Wenn Sie Text in einem Kommentar hervorheben, auf den Sie direkt antworten möchten, und die Taste r drücken, wird dieser Text in das Kommentarfeld für Sie zitiert.
Die Zitate sehen ungefähr so aus
> Whether 'tis Nobler in the mind to suffer
> The Slings and Arrows of outrageous Fortune,
How big are these slings and in particular, these arrows?
Sobald gerendert, sieht der Kommentar aus wie in Rendered quoting example.
Emoji
Schließlich können Sie auch Emoji in Ihren Kommentaren verwenden. Dies wird tatsächlich recht häufig in Kommentaren verwendet, die Sie in vielen GitHub Issues und Pull-Requests sehen. Es gibt sogar eine Emoji-Hilfe in GitHub. Wenn Sie einen Kommentar tippen und mit einem :-Zeichen beginnen, hilft Ihnen ein Autocompleter, das Gesuchte zu finden.
Emojis haben die Form von :<name>: irgendwo im Kommentar. Zum Beispiel könnten Sie etwas wie folgt schreiben
I :eyes: that :bug: and I :cold_sweat:.
:trophy: for :microscope: it.
:+1: and :sparkles: on this :ship:, it's :fire::poop:!
:clap::tada::panda_face:
Wenn es gerendert wird, sieht es ungefähr so aus wie in Heavy emoji commenting.
Nicht dass dies unglaublich nützlich ist, aber es fügt ein Element von Spaß und Emotion zu einem Medium hinzu, in dem Emotionen sonst schwer zu vermitteln sind.
|
Hinweis
|
Es gibt tatsächlich eine ganze Reihe von Webdiensten, die heutzutage Emoji-Zeichen verwenden. Eine großartige Cheat-Sheet, um Emojis zu finden, die das ausdrücken, was Sie sagen möchten, finden Sie unter |
Bilder
Dies ist technisch gesehen kein GitHub Flavored Markdown, aber es ist unglaublich nützlich. Zusätzlich zum Hinzufügen von Markdown-Bildlinks zu Kommentaren, bei denen es schwierig sein kann, URLs zu finden und einzubetten, erlaubt GitHub Ihnen, Bilder in Textbereiche zu ziehen und abzulegen, um sie einzubetten.
Wenn Sie sich Drag and drop images to upload them and auto-embed them ansehen, sehen Sie einen kleinen Hinweis "Parsed as Markdown" über dem Textbereich. Wenn Sie darauf klicken, erhalten Sie eine vollständige Cheat-Sheet mit allem, was Sie mit Markdown auf GitHub tun können.
Halten Sie Ihr öffentliches GitHub-Repository aktuell
Nachdem Sie ein GitHub-Repository geforkt haben, existiert Ihr Repository (Ihr "Fork") unabhängig vom Original. Insbesondere wenn das ursprüngliche Repository neue Commits hat, informiert Sie GitHub mit einer Nachricht wie
This branch is 5 commits behind progit:master.
Aber Ihr GitHub-Repository wird niemals automatisch von GitHub aktualisiert; dies müssen Sie selbst tun. Glücklicherweise ist das sehr einfach.
Eine Möglichkeit, dies zu tun, erfordert keine Konfiguration. Wenn Sie beispielsweise von https://github.com/progit/progit2.git geforkt haben, können Sie Ihren master-Branch wie folgt aktuell halten
$ git checkout master (1)
$ git pull https://github.com/progit/progit2.git (2)
$ git push origin master (3)
-
Wenn Sie sich auf einem anderen Branch befanden, kehren Sie zu
masterzurück. -
Holen Sie sich Änderungen von
https://github.com/progit/progit2.gitund mergen Sie sie inmaster. -
Pushen Sie Ihren
master-Branch zuorigin.
Dies funktioniert, ist aber etwas mühsam, da man jedes Mal die Fetch-URL ausschreiben muss. Sie können diese Arbeit mit ein wenig Konfiguration automatisieren
$ git remote add progit https://github.com/progit/progit2.git (1)
$ git fetch progit (2)
$ git branch --set-upstream-to=progit/master master (3)
$ git config --local remote.pushDefault origin (4)
-
Fügen Sie das Quell-Repository hinzu und geben Sie ihm einen Namen. Hier habe ich mich entschieden, es
progitzu nennen. -
Holen Sie sich eine Referenz auf die Branches von progit, insbesondere auf
master. -
Setzen Sie Ihren
master-Branch so, dass er vomprogit-Remote fetcht. -
Definieren Sie das Standard-Push-Repository auf
origin.
Sobald dies geschehen ist, wird der Workflow viel einfacher
$ git checkout master (1)
$ git pull (2)
$ git push (3)
-
Wenn Sie sich auf einem anderen Branch befanden, kehren Sie zu
masterzurück. -
Holen Sie sich Änderungen von
progitund mergen Sie sie inmaster. -
Pushen Sie Ihren
master-Branch zuorigin.
Dieser Ansatz kann nützlich sein, hat aber auch Nachteile. Git führt diese Arbeit gerne stillschweigend für Sie aus, warnt Sie aber nicht, wenn Sie einen Commit auf master machen, von progit pullen und dann zu origin pushen – all diese Operationen sind mit dieser Einrichtung gültig. Sie müssen also darauf achten, niemals direkt auf master zu committen, da dieser Branch effektiv zum Upstream-Repository gehört.