2013-03-05 10 views
16

Sprawdziłem kilka commitów na master, które powinny zostać sprawdzone pod develop. Jakie komendy git użyłem do usunięcia tych zatwierdzeń z gałęzi głównej i uwzględnienia w gałęzi rozwijania?Jak przenieść git z master do innej istniejącej gałęzi

+1

Czy spojrzałeś na tę odpowiedź? - http://stackoverflow.com/questions/1773731/in-git-how-do--remove-a-commit-from-one-branch-and-apply-it-to-a-different-bra?rq = 1 –

+0

wygląd w tym: [ruch-ostatni zatwierdzeń-do-a-new-gałęzi] [1] [1]: http://stackoverflow.com/questions/1628563/move-recent -commit-to-a-new-branch –

+0

ponieważ na górze znajduje się blok "to pytanie może już mieć odpowiedź", chcę tylko zaznaczyć, że moje pytanie nie dotyczy przeniesienia do gałęzi _nowy_, chodzi o przejście do inny oddział _istniejący – gitq

Odpowiedz

5

Można cherry-pick swoje zobowiązuje się do develop a potem interaktywnie rebase Twój master Branża:

  1. git checkout develop
  2. git cherry-pick aabbcc
  3. git cherry-pick ddeeff
  4. ....
  5. git checkout master
  6. git rebase 123456 -i

gdzie 123456 jest popełnić zanim popełnił błąd. Spowoduje to otwarcie edytora, który wyświetli każde zatwierdzenie, na które będzie mieć wpływ rebase. Usuń linie odpowiadające zatwierdzeniom, które chcesz odrzucić i zakończ edytor.

6

radzenia sobie w innej gałęzi można wykorzystać cherry picking:

git cherry-pick <commit> 

Usuwanie nie jest takie proste. Można użyć rebase i squasha lub edytować popełnić:

git rebase -i <commit>~1 

Ale nie jestem pewien, kiedy chosing zmienił podczas rebase czy można edytować pliki również zamiast tylko popełnić wiadomość.

+1

'edit' podczas interaktywnego rebase umożliwia edycję commit-message i plików,' reword' pozwala tylko modyfikować commit-message. –

0

Są to zazwyczaj kilka sposobów, aby zrobić to samo w git jeden możliwy sposób:

git checkout develop 
git cherry-pick XXX // XXX being the sha1 of the commit you want to grab 
git checkout master 
git rebase --interactive HEAD~IDX // IDX being the position of the last "good" commit compared to HEAD 

Ostatnia komenda wyświetli wszystkie opinię od głowy do ostatniej dobra popełnić i wszystko co musisz zrobić, to usunięte linia commit aby przeniósł się do oddziału rozwijać

25

Jeśli się nie mylę, trzeba było dwa zsynchronizowane oddziały, master i dev, i po prostu zapomniał wyłączyć oddział, przed swoimi zobowiązuje.

Jeśli tak jest, to mamy:

---------------- 
git log in dev 

xxx 
yyy 
... 
---------------- 

oraz:

---------------- 
git log in master 

ccc 
bbb 
aaa 
     <---- here you forgot to switch branch 
xxx 
yyy 
... 
---------------- 

Rozwiązaniem jest:

Po pierwsze, upewnij się, że:

git status -s 

zwraca puste wyniki.

Następny, aby wszystkie nowe rewizje z master do dev z:

git checkout dev 
git merge master 

teraz do was master:

git checkout master 

Usuń niepotrzebne zobowiązuje:

git reset --hard HEAD~3 

numer ~3 to liczba Twoich zobowiązań chcę usunąć.

Pamiętaj: git status -s musisz zwrócić puste wyniki. W przeciwnym razie git reset --hard może spowodować utratę danych.

Powiązane problemy