Um eine Pull-Anfrage zu aktualisieren
Um eine Pull-Anfrage zu aktualisieren (Punkt 1), müssen Sie nur denselben Zweig, aus dem die Pull-Anfrage stammt, auschecken und erneut pushen:
cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push
Optional - Bereinigung des Übergabeprotokolls
Es kann sein, dass Sie gebeten werden, Ihre Commits zusammenzuquetschen, damit die Repository-Historie sauber ist, oder dass Sie selbst Zwischen-Commits entfernen wollen, die von der "Nachricht" in Ihrem Pull-Request ablenken (Punkt #2). Wenn Ihr Commit-Verlauf zum Beispiel so aussieht:
$ git remote add parent git@github.com: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 zusammenzufassen, damit sie als eine einzige Übertragung erscheinen:
$ git rebase -i parent/master
Daraufhin werden Sie aufgefordert zu wählen, wie die Geschichte Ihres Pull-Requests umgeschrieben werden soll, das Folgende wird in Ihrem Editor erscheinen:
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 jeden Commit, der Teil des vorherigen Commits sein soll, ändern Sie pick 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 wird dann die Historie neu schreiben und Sie auffordern, eine Commit-Nachricht für den einen kombinierten Commit anzugeben. Ändern Sie diese entsprechend und Ihr Commit-Verlauf ist nun übersichtlich:
$ git log --oneline parent/master..master
9de3202 fixing actual problem
Schieben Sie das zu Ihrer 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 git@github.com:me/my-fork.git
f1238d0..9de3202 HEAD -> master
und Ihre Pull-Anfrage wird einen einzigen Commit enthalten, der alle Änderungen enthält, die zuvor in mehrere Commits aufgeteilt wurden.
Das Ändern der Historie in öffentlichen Repos ist eine schlechte Sache
Geschichte umschreiben und nutzen git push -f
auf einem Zweig, den möglicherweise schon jemand anderes geklont hat, ist eine schlechte Sache - es führt dazu, dass die Geschichte des Repositorys und die des Checkouts auseinanderlaufen.
Wenn Sie jedoch die Historie Ihrer Abspaltung ändern, um die Änderung zu korrigieren, die Sie vorschlagen in ein Repository zu integrieren - ist eine gute Sache. Daher haben Sie keine Bedenken, "Lärm" aus Ihren Pull Requests herauszuquetschen.
Ein Hinweis zu Zweigniederlassungen
Oben zeige ich, dass die Pull-Anfrage von der master
Zweig Ihres Forks zu veröffentlichen, ist nicht unbedingt falsch, aber es führt zu gewissen Einschränkungen, wie z.B., wenn dies Ihre Standardtechnik ist, dass Sie nur einen PR pro Repository offen haben können. Es ist jedoch besser, für jede einzelne Änderung, die Sie vorschlagen wollen, einen eigenen 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