Git rebase na zdalne aktualizacje

Pracuję z małym zespołem, który używa Gita do zarządzania kodem źródłowym. Ostatnio robiliśmy gałęzie tematyczne, aby śledzić funkcje, następnie łączyliśmy je lokalnie w master i przenosiliśmy do centralnego repozytorium Gita na zdalnym serwerze. Działa to świetnie, gdy nie wprowadzono żadnych zmian w master: tworzę swoją gałąź tematyczną, zatwierdzam ją, scalam w master, a następnie naciskam. Hurra.

Jednakże, jeśli ktoś naciskał na origin przede mną, moje commity nie są przewijane do przodu. Tak więc połącz commit. Dzieje się tak również wtedy, gdy gałąź tematu musi scalić się lokalnie z master, aby moje zmiany działały z kodem od teraz. Więc kończymy z Merge commity wszędzie i git log rywalizujący z bransoletą przyjaźni.

Więc rebasing jest oczywistym wyborem. Chciałbym:

  • Tworzenie gałęzi tematycznych zawierających kilka commitów
  • checkout master i pull (przewiń do przodu, ponieważ nie zobowiązałem się do mistrza)
  • rebase topic branches na nową głowę mistrza
  • rebase topics against master (więc tematy zaczynają się od głowy Mistrzów), przynosząc master do mojej głowy tematu

Mój sposób na to obecnie jest wymieniony poniżej:

git checkout master
git rebase master topic_1
git rebase topic_1 topic_2
git checkout master
git rebase topic_2
git branch -d topic_1 topic_2
Czy jest na to szybszy sposób?
Author: bstpierre, 2010-05-27

4 answers

Czy wiesz o git pull --rebase? Zamiast scalać się po ściągnięciu, zmienia się ona, i zapobiega zanieczyszczaniu historii przez commity scalające.

Możesz również ustawić go jako domyślne zachowanie dla gałęzi za pomocą opcji konfiguracyjnych branch.<name>.rebase i branch.autosetuprebase.

 34
Author: Martin Owen,
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
2010-12-17 20:28:34

Znalazłem, z czasem, moje ulubione rozwiązanie to:

git checkout topic
# make [n] commits
git rebase -i HEAD~[n] #clean up time
git checkout master
git pull --rebase
git checkout topic
git rebase master
git checkout master
git merge topic
git push origin
 11
Author: Blake Chambers,
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
2010-12-18 05:57:42

Dla naszego zespołu stworzyliśmy coś, co działa bardzo dobrze i w ogóle nie używa rebase.

Wycinamy nasze prace w Jira tickets, które nie trwają zbyt długo, zazwyczaj 1-2 dni wysiłku. Każdy programista tworzy gałąź dla paragonu i pracuje nad tą gałęzią. Gdy jest gotowy do udostępnienia, jest on wysyłany do centralnego serwera.

Centralny serwer jest monitorowany przez hudson CI server, który ciągnie zmiany, łączy wszystkie zaktualizowane gałęzie, przebudowuje oprogramowanie, uruchamia testy i wypycha wszystko do centralny główny repozytorium git.

Stamtąd wyciągamy go z powrotem do naszych repozytoriów. Regularnie (tj. co kilka dni) łączymy nasze działające oddziały z głównym mistrzem, aby utrzymać je "blisko".

Ponieważ nikt nie pracuje na maszynie 'merging' i nikt inny niż serwer CI nie dotyka master, mamy bardzo rzadkie problemy z scalaniem (w około 1-2% commitów). Są one szybko rozwiązywane na serwerze kompilacji poprzez czyszczenie przestrzeni roboczej. Odkryliśmy, że możemy mieć uniknął większości z nich, utrzymując krótkie gałęzie i łącząc się ze zdalnym mistrzem przed pchnięciem.

Podoba mi się również, że scalanie jest znacznie bardziej wytrzymałe niż rebasing i wymaga znacznie mniej przeróbek.

 2
Author: Peter Tillemans,
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
2010-05-26 23:25:32

Możesz również po prostu rebase przeciwko aktualnemu wzorcowi

git checkout topic_1
git rebase refs/remotes/origin/master

Co eliminuje potrzebę pull (przynajmniej do czasu EOL Twojej gałęzi funkcji). Nasz proces używa GitHub pull requests, więc nigdy nie muszę tego robić lokalnie.

 2
Author: Visser,
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
2013-11-11 14:38:59