2010-02-07 12 views
11

Niedawno miałem question answered o konfiguracji konfiguracji wielu komputerów git, a rozwiązanie, które tam dostałem, rozwiązało moją sytuację z gałęzią master, ale nie z oddziałami bocznymi opartymi na systemie głównym.synchronizacja git z rebased branches

Oto moja obecna konfiguracja:

A--B--C--D master 
      \ 
      E--F--G--H BUG_37 

BUG_37 jest dziedziną, która rozwija się poprawkę do opcjonalnego śledzona bug na żądanie funkcji w systemie, a ostatecznie zostaną dołączone do linii głównej, ale jest oddzielny na razie. Z repozytorium w tym stanie, jeden jedna maszyna, zrobiłem kilka zmian w master Branża:

A--B--C--D--I--J--K master 
      \ 
      E--F--G--H BUG_37 

Potem rebased się BUG_37 oddział na master, aby upewnić się, że działa jako akcesorium do najbardziej aktualnych zmianach:

A--B--C--D--I--J--K master 
        \ 
        E1--F1--G1--H1 BUG_37 

Załóżmy, że w rebase było kilka konfliktów, które trzeba było ręcznie naprawić, zanim baza była ostateczna. Jeśli popchnę te zmiany do zdalnego repozytorium, a teraz chcę przenieść zmiany na inny system programistyczny, który wciąż ma pierwotną konfigurację, jaki jest najlepszy sposób na to? git pull --rebase uruchomi ponownie bazę danych, a ja będę musiał ręcznie przejść przez konflikty, które przeszedłem po raz pierwszy, prawda? I jeśli popełnię drobny błąd, ponownie przechodząc przez konflikty, tak, że E1-H1 będą nieco inne w tym nowym systemie, to jeszcze bardziej zsynchronizuję repozytorium.

Jak zrobić lokalne repozytorium w oryginalnym stanie i zdalnym repozytorium w trzecim stanie, a lokalne repozytorium zostać zaktualizowane tak, aby dokładnie pasowało do zdalnego repozytorium (usuwanie zmian EH i przenoszenie HEAD z BUG_37 na nowe Lokalizacja)?

Odpowiedz

4

bym nie zmieniają bazę w ogóle na zasadzie gałąź, która jest już udostępniona. Chociaż powoduje to najczystszą historię, zmienił on skróty wszystkich zatwierdzeń w BUG_37. Tak więc na komputerach docelowych trzeba całkowicie usunąć BUG_37 i pociągnąć ponownie. Można to zrobić raz lub dwa razy, ale nie tak dobrze jak w zwykłym przepływie pracy.

O wiele łatwiej będzie połączyć master w BUG_37; następnie zatwierdzenie scalenia (w którym rozwiązano konflikty) może zostać przekazane na inne komputery, a rozgałęzień nie trzeba usuwać.

4

Usuń gałąź, a następnie przeciągnij obie gałęzie ze zdalnego repozytorium.

git branch -D BUG_37 
git pull origin master 
git pull origin BUG_37:BUG_37 

Jeśli nie chcesz, aby usunąć się z lokalnym oddziałem BUG_37 zanim będzie pewność, że to działa, wyciągnąć pilota oddziału do innego lokalnego oddziału:

git pull origin BUG_37:NEW_BUG_37 
3

Podążam tym samym przepływem pracy, zasadniczo przełączając się między laptopem a komputerem. Moje główne repo na pulpicie i laptopie klonuje repozytorium deskotp. W końcu nie są one zsynchronizowane, ponieważ chcę zaktualizować gałęzie tematów po aktualizacji master.

Prosta odpowiedź, to po prostu nie używać git, zamiast używać rsync, aby zachować synchronizację repozytoriów. Jeśli wiesz, że tylko ty nad nim pracujesz, ma to sens.

Cóż, nie jestem też wielkim fanem tego rozwiązania. Może to być trochę "czystsze".Na laptopie, gdy ciągnięcie rebased branże z repo stacjonarnego:

git co topic 
git fetch origin/topic 
git reset --hard origin/topic 

To będzie wyrzucić każdy nie zobowiązuje repo na pulpicie, więc upewnij się, że naprawdę chcesz to zrobić.

Ponadto, prawdopodobnie można po prostu git pull gałęzi laptopa master, ponieważ zawsze powinien być szybki do przodu, ponieważ prawdopodobnie nie będzie trzeba ponownie dokonać go. Myślę, że sensownym jest jednak odnawianie gałęzi tematycznych, ponieważ w przeciwnym razie próba scalenia go z powrotem do wzorca na samym końcu jest bólem.

2

Właśnie eksperymentowałem z tym i używałem git pull --rebase działa podczas wyciągania z gałęzi na bazie. Bez flagi --rebase, zatwierdzenia zostaną zduplikowane, ale z --rebase zatwierdzenia nie będą duplikowane.