2010-05-27 24 views
39

Tytuł nie jest zbyt jasny. Co tak naprawdę trzeba zrobić, to często następuje:Jak przenieść gałąź do tyłu w git?

Powiedzmy mam rozwój dzieje się z kilku zobowiązuje C1, C2, ... i 3 oddziały A, B, C

c1--c2--c3--(B)--c4--(A,C) 

gałęzi i C są w tym samym commit.

Teraz chcę odgałęzienie A wrócić gdzie B jest tak, że loks tak:

c1--c2--c3--(A,B)--c4--(C) 

Ważne jest to, że musi się zdarzyć lokalnie i na github.

Odpowiedz

58

Użyj komendy Reset:

git checkout A 
git reset --hard B 
git push --force github 

Jako marginesie, należy zachować ostrożność podczas korzystania git reset natomiast oddział został zepchnięty już gdzie indziej. Może to powodować problemy u tych, którzy już sprawdzili wprowadzone zmiany.

+3

Jeśli są jakieś rewizje na gałęzi, zostaną one utracone przez 'git zresetować --hard B'. Jeśli w gałęzi A są zatwierdzenia, powinieneś użyć 'git rebase' do przeniesienia gałęzi. –

+0

Jakie problemy może to spowodować? –

+0

Możesz wyrzucić głowę oddziału, którą zepchnąłeś na serwer, a tymczasem inni ją ciągną. Serwer nie może zbudować na górze usuniętej głowicy (więc konieczne jest wymuszenie popychania). Podobnie deweloperzy rówieśniczy muszą wymuszać ciągnięcie, które może być niepożądane. –

22

Jeśli nie ma żadnych zatwierdzeń w oddziale A, będzie działać git reset --hard Bsolution given by Bram Schoenmakers.

Jednak jeśli istnieją commity są gałąź A które muszą być zachowane, wówczas następujący powinno załatwić sprawę:

  1. Zrób kopię zapasową repo (na wszelki wypadek)
  2. git checkout A
  3. git rebase -i --onto B SHA1-A^

... gdzie SHA1-A^ jest id popełnić rodzica swojego oddziału A

Aby uzyskać szczegółowe informacje, patrz git rebase man page.

UWAGA: Spowoduje to przepisanie historii (ponieważ zawsze robi to zawsze). Szczególną uwagę należy zwrócić na to, czy Twój oddział A został kiedykolwiek przeniesiony na publiczny repozytorium.

1

Usuń oddział lokalnie i zdalnie, odtwórz gałąź, przesuń gałąź z powrotem na serwer.

git branch -d A 
git push origin :heads/A 
git branch B A 
git push origin A:A 

Alternatywnie możesz użyć następującego polecenia, aby cofnąć ostatnie zatwierdzenie.

git revert c4 

co uczyni Twój timeline wyglądać następująco:

c1--c2--c3--(B) 
      \ 
       c4--(C) 
       \ 
       (^c4)--(A) 

gdzie (^c4) jest popełnić że cofa c4

Nie polecam korzystania rebase lub revert na oddział, który został wciśnięty do zdalnego repozytorium, mogą spowodować mnóstwo kłopotów dla ciebie lub kogokolwiek innego używającego tego repo.

+0

Usunięcie i odtworzenie oddziału zdalnego również spowoduje mnóstwo kłopotów dla każdego, kto korzysta z repozytorium. (Jak się nauczyłem z bolesnego doświadczenia). – ebneter

+0

Na czym polega problem? Robię to cały czas i nigdy nie powoduje żadnych problemów, ale teraz zastanawiam się, czy właśnie miałem szczęście. – kubi

3

Zwykle używam tej sekwencji i znaleźć najprostszy sposób:

git checkout B 
git branch -f A B 
Powiązane problemy