Właśnie niedawno blogged na ten temat:
Jak utrzymać ten fabularny oddział na bieżąco? Łączenie najnowszych zatwierdzeń upstream jest łatwe, ale nie chcesz tworzyć zatwierdzenia scalania, ponieważ nie będzie ono doceniane, gdy zostanie przeniesione na wyższy poziom: wtedy efektywnie ponownie wprowadzisz zmiany w górę, a te zatwierdzenia upstream dostaną nowy skrót (gdy otrzymają nowego rodzica). Jest to szczególnie ważne, ponieważ te połączone zatwierdzenia znalazłyby odzwierciedlenie w Twojej prośbie o pobranie Githuba, gdy przesyłasz te aktualizacje do swojej osobistej gałęzi funkcji github (nawet jeśli zrobisz to po wydaniu prośby o pociągnięcie.)
Właśnie dlatego potrzebujemy do rebase zamiast łączenia:
git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel
Zarówno opcję rebase i polecenie do git rebase zachowa swoje drzewo czyste i uniknąć konieczności scalania zobowiązuje. Należy jednak pamiętać, że są to pierwsze poprawki (z którymi wysłano pierwsze żądanie ściągnięcia), które są ponownie tworzone i które mają teraz nowy skrót zatwierdzenia, który różni się od oryginalnych skrótów, które wciąż znajdują się w odległym oddziale rewitalizacji github. .
Teraz, przenoszenie tych aktualizacji do twojej osobistej gałęzi funkcji Github, zawodzi, ponieważ obie gałęzie różnią się: lokalne drzewo gałęzi i zdalne drzewo gałęzi są "niezsynchronizowane", z powodu tych różnych skrótów zatwierdzania. Git powie ci, żebyś najpierw wyciągnął --rebase, a potem naciśnij, ale to nie będzie zwykłe szybkie przewijanie, jak twoja historia została przepisana. Nie rób tego!
Problem polega na tym, że będziesz ponownie pobierać swoje pierwsze zmienione zatwierdzenia, tak jak były pierwotnie, a te zostaną scalone na lokalnym oddziale. Z powodu stanu braku synchronizacji to działanie nie jest stosowane w czysty sposób. Otrzymasz b0rken historię, w której twoje zatwierdzenia pojawiają się dwa razy. Gdy popchniecie to wszystko do gałęzi funkcji github, zmiany te zostaną odzwierciedlone na pierwotnym żądaniu ściągnięcia, które będzie bardzo, bardzo brzydkie.
AFAIK, tak naprawdę nie ma na to całkowicie czystego rozwiązania.Najlepszym rozwiązaniem znalazłem jest zmuszenie push lokalnego oddziału do oddziału github (faktycznie zmuszając aktualizację non-fast-orward):
Zgodnie 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.
Więc don „t ciągnąć, tylko zmusić pchnięcie takiego:
git push svg +user-non-unique
czyli
git push svg user-non-unique --force
będzie to rzeczywiście wyraźnie overwrit e Twój oddział zdalny, z całym oddziałem lokalnym. Zatwierdzenia, które znajdują się w strumieniu zdalnym (i spowodowały awarię) pozostaną tam, ale będą zwisające zatwierdzenia, które ostatecznie zostanie usunięte przez git-gc (1). Nie ma sprawy.
Jak już powiedziałem, jest to najczystsze rozwiązanie AFAICS. Minusem tego jest to, że twój PR zostanie zaktualizowany o te najnowsze zatwierdzenia, które otrzymają późniejszą datę i mogą pojawić się niezsynchronizowane w historii komentarzy w PR. Żaden duży problem, ale może być mylący.
Niektóre przyjście tutaj może znaleźć ten pasuje do ich scenariusz lepiej: http://stackoverflow.com/questions/9790448/how-to-update-a-pull-request – AaronLS
Znalazłem również tę wersję pytania/odpowiedzi wyraźniej: http://stackoverflow.com/questions/7947322/preferred-gitub-workflow-for-updating-a-pull-request-after-code-review?rq=1 –