Bevorzugter Github-Workflow zum Aktualisieren einer Pull-Anforderung nach der Codeüberprüfung

341

Ich habe eine Änderung an einem Open Source-Projekt auf Github eingereicht und von einem der Mitglieder des Kernteams Kommentare zur Codeüberprüfung erhalten.

Ich möchte den Code unter Berücksichtigung der Überprüfungskommentare aktualisieren und erneut einreichen. Was ist der beste Workflow dafür? Aufgrund meiner begrenzten Kenntnisse in Git / Github konnte ich Folgendes tun:

  1. Aktualisieren Sie den Code als neues Commit und fügen Sie meiner Pull-Anforderung sowohl das anfängliche als auch das aktualisierte Commit hinzu.

  2. Irgendwie (??) das alte Commit aus meinem Repository zurücksetzen und ein einzelnes neues Commit erstellen, das alles enthält, und dann eine Pull-Anfrage dafür auslösen?

  3. git commithat eine Änderungsfunktion, aber ich habe gehört, dass Sie sie nicht verwenden sollten, nachdem Sie das Commit außerhalb Ihres lokalen Repositorys verschoben haben? In diesem Fall habe ich die Änderung auf meinem lokalen PC vorgenommen und in meinen Github-Zweig des Projekts verschoben. Wäre es in Ordnung, "ändern" zu verwenden?

  4. Etwas anderes?

Es scheint, als wäre Option 2/3 nett, da das Open Source-Projekt nur ein Commit in seiner Geschichte haben würde, das alles implementieren würde, aber ich bin mir nicht sicher, wie ich das machen soll.

Hinweis: Ich weiß nicht, ob sich dies auf die Antwort auswirkt oder nicht, aber ich habe die Änderungen nicht in einem separaten Zweig vorgenommen, sondern nur ein Commit über dem Master durchgeführt

Orion Edwards
quelle

Antworten:

219

Fügen Sie einfach einen neuen Commit zu dem Zweig hinzu, der in der Pull-Anforderung verwendet wird, und senden Sie den Zweig an GitHub. Die Pull-Anforderung wird automatisch mit dem zusätzlichen Commit aktualisiert.

# 2 und # 3 sind nicht erforderlich. Wenn Benutzer nur sehen möchten, wo Ihr Zweig zusammengeführt wurde (und nicht die zusätzlichen Commits), können git log --first-parentsie nur das Zusammenführungs-Commit im Protokoll anzeigen.

Bernstein
quelle
7
masterist auch ein Zweig, also technisch ist es egal :)
Poke
10
@OrionEdwards - Wie bereits erwähnt, ist Master ein Zweig. Wenn Sie ihn aktualisieren, werden auch alle darauf basierenden Pull-Anforderungen aktualisiert. (Dies ist ein guter Grund, einen separaten Zweig für alles zu verwenden, für das Sie eine Pull-Anfrage einreichen möchten.)
Amber
18
Da der Code noch überprüft wird, ist es normalerweise besser, die Commits zu reparieren, als zusätzliche Fixup-Commits einzuführen, die nur den Verlauf
überladen
4
@mgalgs Das ist eine Frage der Präferenz.
Amber
4
Ich mag diese Antwort aus Gründen, die in dem Blog-Beitrag, den ich gerade geschrieben habe , erläutert wurden , nicht. Ich glaube, die andere Antwort ist viel besser.
Adam Spires
224

So aktualisieren Sie eine Pull-Anforderung

Um eine Pull-Anfrage (Punkt 1) zu aktualisieren, müssen Sie nur denselben Zweig auschecken, aus dem die Pull-Anfrage stammt, und erneut darauf pushen:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

Optional - Commit-Verlauf bereinigen

Möglicherweise werden Sie aufgefordert, Ihre Commits zusammenzufassen, damit der Repository-Verlauf sauber ist, oder Sie möchten zwischengeschaltete Commits entfernen, die von "der Nachricht" in Ihrer Pull-Anfrage ablenken (Punkt 2). Zum Beispiel, wenn Ihr Commit-Verlauf folgendermaßen aussieht:

$ git remote add parent [email protected]:other-user/project.git
$ git fetch parent
$ git log --oneline parent/master..master
e4e32b8 add test case as per PR comments
eccaa56 code standard fixes as per PR comments
fb30112 correct typos and fatal error
58ae094 fixing problem

Es ist eine gute Idee, Dinge zusammenzudrücken, damit sie als ein einziges Commit erscheinen:

$ git rebase -i parent/master 

Daraufhin werden Sie aufgefordert, auszuwählen, wie der Verlauf Ihrer Pull-Anforderung neu geschrieben werden soll. In Ihrem Editor wird Folgendes angezeigt:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments

Für jedes Commit, das Sie Teil des vorherigen Commits sein möchten, ändern Sie die Auswahl in Squash:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments

Und schließen Sie Ihren Editor. Git schreibt dann den Verlauf neu und fordert Sie auf, eine Festschreibungsnachricht für das eine kombinierte Festschreiben bereitzustellen. Wenn Sie dies entsprechend ändern, wird Ihr Commit-Verlauf nun präzise:

$ git log --oneline parent/master..master
9de3202 fixing actual problem

Schieben Sie das an Ihre Gabel:

$ git push -f
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 978 bytes, done.
Total 11 (delta 9), reused 7 (delta 6)
To [email protected]:me/my-fork.git
   f1238d0..9de3202  HEAD -> master

und Ihre Pull-Anfrage enthält ein einzelnes Commit, das alle Änderungen enthält, die zuvor in mehrere Commits aufgeteilt wurden.

Das Ändern der Geschichte in öffentlichen Repos ist eine schlechte Sache

Das Umschreiben des Verlaufs und die Verwendung git push -fin einem Zweig, den möglicherweise bereits jemand anderes geklont hat, ist eine schlechte Sache. Dies führt dazu, dass der Verlauf des Repositorys und der der Kasse voneinander abweichen.

Um jedoch die Änderung Sie die Geschichte Ihrer Gabel Änderung zu korrigieren vorschlägt , um in ein Repository integriert werden - ist eine gute Sache. Als solche haben Sie keine Bedenken, "Lärm" aus Ihren Pull-Anfragen zu quetschen.

Ein Hinweis zu Zweigen

Oben zeige ich, dass die Pull-Anfrage aus dem masterZweig Ihrer Gabel stammt. Daran ist nicht unbedingt etwas auszusetzen, aber es entstehen bestimmte Einschränkungen, z. B. wenn dies Ihre Standardtechnik ist, kann nur ein PR pro Repository geöffnet werden . Es ist jedoch eine bessere Idee, für jede einzelne Änderung, die Sie vorschlagen möchten, einen Zweig zu erstellen:

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets
AD7six
quelle
28
+1 für die Erwähnung, wie die Commits bereinigt werden, anstatt zusätzliche Fixup-Commits zu pushen.
mgalgs
3
Ich hatte einige Probleme beim Pflücken / Quetschen und diese Antwort half mir. Ich habe auch bemerkt, dass Github das vorherige Gespräch entfernt hat, nachdem ich es getan habe git push -f. Es gab nicht viele Kommentare, aber das hatte ich nicht erwartet.
Hitesh
5
Um ganz klar zu sein, wenn Sie auf eine saubere Geschichte zurückgreifen, ändern Sie tatsächlich Ihre öffentlichen Verpflichtungen. Sie gehen nur davon aus, dass es niemanden interessiert, weil es eine Gabel ist.
Brita_
2
Follow-up: Best Practice, wenn der Master während Ihrer PR wechselt?
Kevin Suttle
1
Bedenken Sie, dass das Umschreiben des Verlaufs von Pull-Anforderungen, die überprüft wurden (oder die im Allgemeinen Kommentare zu / Verweisen auf Code enthalten), zu Verwirrung führen kann, da der Verlauf nicht mehr mit den Kommentaren übereinstimmt, auf die sich die Kommentare beziehen. Es gibt keine einfache Lösung: Jemand wird die PR schließen und in eine neue verweisen (um die Geschichte nicht neu zu schreiben); Meine Idee wäre, einfach die letzte Commit-SHA zu sichern, die zurückgesetzt / umgeschrieben wird, und sie in einem Kommentar zur PR zu verweisen, nachdem der erzwungene Push ausgeführt wurde. IF prune entfernt nicht das freistehende begehen dann seine Geschichte noch Kommentare PRs werden entsprechen.
Kamafeather