Preferowany przepływ pracy Github do aktualizacji żądania pull po przejrzeniu kodu

Zgłosiłem zmianę w projekcie Open Source na Githubie i otrzymałem komentarz do recenzji kodu od jednego z głównych członków zespołu.

Chciałbym zaktualizować kod z uwzględnieniem komentarzy do recenzji i ponownie go przesłać. Jaki jest najlepszy przepływ pracy w tym celu? Z mojej ograniczonej wiedzy o git / github, mógłbym zrobić jedną z następujących rzeczy:

  1. Zaktualizuj kod jako nowy commit i dodaj zarówno początkowy, jak i zaktualizowany commit do mojego pull Prośba.

  2. Jakoś (??) cofnąć Stary commit z mojego repozytorium, i utworzyć jeden nowy commit zawierający wszystko, a następnie podnieść pull request dla tego?

  3. git commit ma funkcję zmiany, ale słyszałem, że nie powinieneś jej używać po wypchnięciu commita poza lokalne repozytorium? W tym przypadku dokonałem zmiany na moim lokalnym komputerze i pchnąłem do mojej gałęzi projektu github. Czy to byłoby w porządku, aby użyć "zmienić"?

  4. Coś else?

Wydaje się, że opcja 2/3 byłaby fajna, ponieważ projekt open source miałby tylko jeden commit w swojej historii, który zaimplementowałby wszystko, ale nie jestem pewien, jak to zrobić.

Uwaga: Nie wiem, czy to wpływa na odpowiedź, czy nie, ale nie dokonałem zmian w oddzielnej gałęzi, zrobiłem commit NA master

Author: dimo414, 2011-10-30

3 answers

Wystarczy dodać nowy commit do gałęzi używanej w pull request i wcisnąć gałąź do GitHub. Żądanie pull zostanie automatycznie zaktualizowane o dodatkowy commit.

#2 i #3 są niepotrzebne. Jeśli ludzie chcą zobaczyć tylko miejsce, w którym została scalona twoja gałąź (a nie dodatkowe commity), mogą użyć git log --first-parent, aby wyświetlić tylko commit scalający w dzienniku.

 203
Author: Amber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-30 19:45:02

Aby zaktualizować żądanie pull

Aby zaktualizować pull request( punkt #1), jedyne, co musisz zrobić, to sprawdzić tę samą gałąź, z której pochodzi pull request, i wcisnąć do niej ponownie:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

Opcjonalne-Czyszczenie historii zatwierdzeń

Możesz zostać poproszony o zmiksowanie swoich commitów razem, aby Historia repozytorium była czysta, lub chcesz usunąć pośrednie commity, które odwracają uwagę od "wiadomości" w żądaniu pull (punkt #2). Na przykład, jeśli Twoja historia zmian wygląda tak:

$ git remote add parent [email protected]: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
To jest dobry pomysł, aby zgnieść rzeczy razem tak, aby wyglądały jak jeden commit:]}
$ git rebase -i parent/master 

To wyświetli monit o wybór sposobu przepisania historii żądania pull, w edytorze pojawi się:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments

Dla każdego commita, który chcesz być częścią poprzedniego commit-change pick do squasha:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments

I zamknij Edytor. Następnie Git przepisze historię i poprosi Cię o podanie komunikatu commit dla połączonego / align = "left" / Odpowiednio zmodyfikuj, a Twoja historia zmian będzie teraz zwięzła:

$ git log --oneline parent/master..master
9de3202 fixing actual problem

Wciśnij to do widelca:

$ 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 [email protected]:me/my-fork.git
   f1238d0..9de3202  HEAD -> master

I twoje żądanie pull będzie zawierało jeden commit, zawierający wszystkie zmiany wcześniej podzielone na kilka commitów.

Zmiana historii na publicznych repozytoriach to zła rzecz

Przepisywanie historii i używanie git push -f na gałęzi, która potencjalnie została już sklonowana przez kogoś innego, jest złą rzeczą - powoduje to, że historia repozytorium i checkout to diverge.

Jednak zmiana historii forka, aby skorygować zmianę, którą proponujesz , aby zintegrować ją z repozytorium - jest dobrą rzeczą . W związku z tym nie masz żadnych zastrzeżeń, aby zgniatać "hałas"z twoich żądań pull.

Notatka o gałęziach

W powyższym pokazuję żądanie pull jako pochodzące z master gałęzi twojego widelca, nie ma w tym nic złego, ale tworzy to pewne ograniczenia, takie jak: standardowa technika, możliwość otwarcia tylko jednego PR na repozytorium. Lepiej jest jednak stworzyć gałąź dla każdej zmiany, którą chcesz zaproponować:]}

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets
 204
Author: AD7six,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-29 15:56:06

Moja opinia na temat najlepszych praktyk: gdy jesteś gotowy do spakowania pull request, powinien on na początku uzyskać własną unikalną gałąź tematyczną, specjalnie w tym celu. Zacznij od przepchnięcia tej gałęzi do repozytorium github, np.

git push origin name-of-pull-request-branch

I oparcie żądania ściągnięcia z tej gałęzi. Jeśli to zrobisz, wszelkie commity, które wypchniesz do tej gałęzi, zostaną automatycznie dołączone do żądania pull request. Używasz tej gałęzi do niczego innego.

Niektórzy wolą, aby przestrzeń nazw była taka gałęzie z Twoim identyfikatorem użytkownika github. W ten sposób mogą swobodnie sprawdzić go lokalnie, aby wypróbować, z korzyściami takimi jak

  • mniej strachu przed kolizją nazwy gałęzi
  • łatwiej zapamiętać, co to jest

Zwykle nazywam moje gałęzie pull request coś w stylu

claybridges-do-the-things
 5
Author: Clay Bridges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-06 17:54:32