2012-04-13 20 views
67

Otworzyłem żądanie pobrania do rails repo na github za pomocą Widelec & Edytuj ten plik file file.github: Dodawanie zatwierdzeń do istniejącego żądania pobrania

Teraz, Po otrzymaniu opinii o moim PR, chciałem dodać więcej zatwierdzeń. więc to właśnie zakończyłem, wykonując

$ 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 

To działało dobrze, ale wydaje się dość skomplikowany przepływ pracy. Może się mylę, coś tu nie tak?

Moje pytanie brzmi: Czy robię to we właściwy sposób? jeśli nie, to jaki jest właściwy sposób na zrobienie tego?

+3

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

+3

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 –

Odpowiedz

45

Ponieważ używasz narzędzi GitHub i tylko zmiana jednego pliku, można również browse to the file na GitHub, wybrać odpowiednią gałąź z lewym górnym rogu pod „drzewem:” rozwijanej (patch-3 w Twoim przypadku), a teraz wybrać "Edytuj ten plik". Teraz zmiany zostaną zobowiązani do tego oddziału i pokaże się w swoim wniosku ciągnącej

+0

Niesamowite, dziękuję. – Magne

4

Można również utworzyć nowe żądanie ściągnięcia, które jest powiązane z master zamiast konkretnej wersji abc1234.

W ten sposób każde nowe zatwierdzenie/przekazanie do repozytorium zostanie dodane do żądania pobrania.

7

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.

Powiązane problemy