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.