github: Hinzufügen von Commits zu vorhandenen Pull-Anforderungen

86

Ich habe eine Pull-Anfrage für Rails Repo auf Github geöffnet, indem ich die Schaltfläche Fork & Edit this file file verwendet habe.

Nachdem ich Feedback zu meiner PR erhalten hatte, wollte ich weitere Commits hinzufügen. Also hier ist, was ich am Ende getan habe

$ git clone [email protected]:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

Dies hat gut funktioniert, scheint aber ein recht komplexer Workflow zu sein. Vielleicht irre ich mich hier etwas falsch?

Meine Frage ist: Mache ich das richtig? Wenn nicht, wie geht das dann richtig?

CuriousMind
quelle
4
Einige, die hierher kommen, finden, dass dies besser zu ihrem Szenario passt: stackoverflow.com/questions/9790448/…
AaronLS
4
Ich fand auch diese Version der Frage / Antwort klarer: stackoverflow.com/questions/7947322/…
Ben Wheeler

Antworten:

60

Da Sie die Tools von GitHub verwenden und nur eine Datei ändern, können Sie auch zu der Datei auf GitHub navigieren, den richtigen Zweig in der oberen linken Ecke unter der Dropdown-Liste "Baum:" auswählen ( patch-3in Ihrem Fall) und jetzt "Bearbeiten" auswählen Diese Datei". Jetzt werden Ihre Änderungen in diesen Zweig übernommen und in Ihrer Pull-Anfrage angezeigt

Abe Voelker
quelle
9

Ich habe kürzlich über dieses Thema gebloggt :

Wie halten wir diesen Feature-Zweig auf dem neuesten Stand? Das Zusammenführen der neuesten Upstream-Commits ist einfach, aber Sie möchten vermeiden, ein Merge-Commit zu erstellen, da dies beim Upstream-Push nicht gewürdigt wird. Anschließend werden Upstream-Änderungen effektiv erneut festgeschrieben, und diese Upstream-Commits erhalten einen neuen Hash ( wie sie einen neuen Elternteil bekommen). Dies ist besonders wichtig, da diese zusammengeführten Commits in Ihrer Github-Pull-Anfrage berücksichtigt werden, wenn Sie diese Updates in Ihren persönlichen Github-Feature-Zweig übertragen (auch wenn Sie dies nach der Ausgabe der Pull-Anfrage tun).

Deshalb müssen wir neu gründen, anstatt zu verschmelzen:

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

Sowohl die Rebase-Option als auch der Rebase-Befehl für Git halten Ihren Baum sauber und vermeiden Zusammenführungs-Commits. Beachten Sie jedoch, dass Ihre ersten Commits (mit denen Sie Ihre erste Pull-Anfrage ausgestellt haben) neu basiert werden und jetzt einen neuen Commit-Hash haben, der sich von den ursprünglichen Hashes unterscheidet, die sich noch in Ihrem Remote-Github-Repo-Zweig befinden.

Das Versenden dieser Updates in Ihren persönlichen Github-Feature-Zweig schlägt hier fehl, da sich beide Zweige unterscheiden: Der lokale Zweigbaum und der Remote-Zweigbaum sind aufgrund dieser unterschiedlichen Commit-Hashes nicht synchron. Git wird Ihnen sagen, dass Sie zuerst git pull --rebase und dann erneut drücken müssen, aber dies ist kein einfacher Schnellvorlauf, da Ihr Verlauf neu geschrieben wurde. Tu das nicht!

Das Problem hierbei ist, dass Sie Ihre ersten geänderten Commits wieder so abrufen, wie sie ursprünglich waren, und diese werden über Ihrer lokalen Niederlassung zusammengeführt. Aufgrund des nicht synchronen Status wird dieser Zug nicht sauber angewendet. Sie erhalten einen b0rken-Verlauf, in dem Ihre Commits zweimal angezeigt werden. Wenn Sie all dies auf Ihren Github-Feature-Zweig übertragen, werden diese Änderungen in der ursprünglichen Pull-Anforderung berücksichtigt, die sehr, sehr hässlich wird.

AFAIK, dafür gibt es eigentlich keine völlig saubere Lösung. Die beste Lösung, die ich gefunden habe, besteht darin, Ihren lokalen Zweig zwangsweise in Ihren Github-Zweig zu verschieben (tatsächlich ein nicht schnelles oder vorwärts gerichtetes Update zu erzwingen):

Gemäß Git-Push (1):

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

Also nicht ziehen, sondern so erzwingen:

git push svg +user-non-unique

oder:

git push svg user-non-unique --force

Dadurch wird Ihre Remote-Niederlassung mit allem in Ihrer lokalen Niederlassung eindeutig überschrieben. Die Commits, die sich im Remote-Stream befinden (und den Fehler verursacht haben), bleiben dort, aber es handelt sich um baumelnde Commits, die schließlich von git-gc (1) gelöscht werden. Keine große Sache.

Wie gesagt, dies ist AFAICS die sauberste Lösung. Der Nachteil dabei ist, dass Ihre PR mit den neuesten Commits aktualisiert wird, die zu einem späteren Zeitpunkt veröffentlicht werden und im Kommentarverlauf der PR möglicherweise nicht mehr synchron sind. Kein großes Problem, könnte aber möglicherweise verwirrend sein.

Serge van Ginderachter
quelle
5

Sie können auch eine neue Pull-Anforderung erstellen, an die masteranstelle einer bestimmten abc1234Revision gebunden ist .

Auf diese Weise wird jedes neue Commit / Push zu Ihrem Repository zur Pull-Anforderung hinzugefügt.

cfedermann
quelle
1

Ja - Sie machen viel mehr Arbeit als nötig. Machen Sie einfach ein zusätzliches Commit und erzwingen Sie es dann. Sie sehen das ursprüngliche Commit sowie das neu gepusste, wenn Sie Github in Ihrem Browser aktualisieren.

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD
Wald
quelle
Dies ist der einfachste und
direkteste