2012-10-31 11 views
39

Niedawno przeniosłem oddział, nad którym pracowałem. Historia drzewa wyglądały mniej więcej tak:Czy utraciłem moje zmiany po zmianie?

1 = 2 = 3 = 4 
    \ 
     5 = 6 = 7 
      \ 
      8 

Chciałem rebase moje zmiany (numer 8 na rysunku), aby być na gałęzi głównej (do popełnienia 4 na schemacie teraz). Więc zrobiłem następujące:

git checkout my_branch 
git rebase master 

< wiele git mergetool/git rebase --skip rozwiązywania konfliktów>

Dopiero teraz, kiedy biegnę:

git checkout my_branch 
git diff master 

mam zerowe różnice. Nie straciłem gałęzi (nadal mogę odtworzyć moje zmiany z łatki, którą zapisałem), ale nie mogę znaleźć scalenia/rebase, które zrobiłem. Co zrobiłem źle? Czy rebase wciąż tam jest, a moje zmiany są połączone z mistrzem, czy też muszę to zrobić ponownie?

+0

Kiedy zrobiłeś 'git rebase --skip' (zamiast' --continue') czy możliwe jest "pominięcie" zmiany, która wciąż miała znaczące zmiany w trakcie reorganizacji? –

+0

Zobacz tę odpowiedź: http://stackoverflow.com/a/4851776/450609.Musiałem użyć git rebase --skip, aby pominąć zmianę, którą właśnie ręcznie scaliłem. – dave

+1

Po ręcznym scaleniu zwykle chcesz "--continue". Musisz tylko pominąć, jeśli wynikiem scalenia jest "brak zmiany". Z ilu zmian zrezygnowałeś i ile faktycznie złożyłeś? –

Odpowiedz

97

Jeśli nie widzisz żadnej różnicy, podejrzewam, że utraciłeś swoje zmiany. Możesz prawdopodobnie użyć git reflog, aby zidentyfikować gałąź, która istniała przed bazą, i użyć git reset --hard <my-branch-tip-before-rebase>, aby odzyskać oryginalną gałąź. I tak, będziesz musiał ponownie przeprowadzić ten proces. . :-(

Nie jestem pewien, jak skończył z nich poszukuje samo chociaż spodziewałem się zobaczyć następujące poleceniem dałeś:

1 = 2 = 3 = 4    (master) 
    \  \ 
     \  5' = 6' = 8' (my_branch) 
     \ 
     5 = 6 = 7 

W tym przypadku, prawdopodobnie powinien używałem rebase --onto:

git rebase --onto master <commit id for 6> my_branch 

że zostawiłaby cię z wykresem, który wyglądał tak:

1 = 2 = 3 = 4    (master) 
    \  \ 
     \  8'   (my_branch) 
     \ 
     5 = 6 = 7 

Jeśli chodzi o utratę zmian, trzeba trochę praktyki, aby poradzić sobie z konfliktami seryjnymi, zwłaszcza gdy masz kilka dużych bloków, które wyglądają niemal identycznie. Zawsze uciekam się do spojrzenia na faktyczną różnicę wprowadzoną przez zatwierdzenie i próbę złagodzenia tej zmiany i scalenia jej z tym, co już jest w branży w odpowiedni sposób. Mogę łatwo zobaczyć, w jaki sposób twoja zmiana mogła się tam zagubić.

Jedna rzecz do zapamiętania. Jeśli nie spodziewasz się wielu konfliktów scalających - ponieważ nie uważasz, że źródła są wystarczająco zróżnicowane, widzący jest ostrzeżeniem, że robi coś złego. Dobrze jest wykonać kopię zapasową, wykonując git rebase --abort, sprawdzając gałęzie i sprawdzając ponownie, jeśli spodziewasz się konfliktu. Upewnij się, że zauważyłeś, gdzie doszło do konfliktu (zwykle jest "Stosowanie ..." tuż przed ponownym uruchomieniem bazy danych w linii poleceń). To zwykle świetne miejsce na rozpoczęcie.

Czasami konflikty są nieuniknione i pracochłonne. Ale podejrzewam, że po treningu mniej natrafisz na ten problem.

Aby uzyskać więcej informacji na temat przesadzania zmian między oddziałami, spójrz na stronę podręcznika: git rebase. Wyszukaj "rebase --onto". Pierwsze trafienie powinno wylądować w sekcji mówiącej o przeniesieniu zmian do innej gałęzi.

+0

Miałeś rację; Użyłem złego polecenia. Musiałem powiedzieć --onto. Mam teraz poprawioną łatkę :) (i musiałem przerobić, ale naprawienie konfliktu po raz drugi jest o wiele łatwiejsze). – dave

+0

Awesome! Cieszę się, że pomogło! I tak, znajduję to samo: konflikty są zdecydowanie łatwiejsze za drugim razem. Jedną z interesujących funkcji jest rerere. Scott Chacon ma [fajny artykuł] (http://git-scm.com/2010/03/08/rerere.html) na temat tego obiektu i jest bardzo pomocny w rozwiązywaniu konfliktów, jeśli zauważysz, że masz dostęp do ten sam w kółko. – jszakmeister

+6

'git reset --hard xxxxx' uratował mnie! Myślałem, że wszystko przepadło! Nawet 'git reset xxxx' bez' --hard' nie działało! – Chloe

Powiązane problemy