2015-05-20 13 views
5

Zrobię co w mojej mocy, aby zwięźle opisać moją obecną sytuację i będę wdzięczny za radę.Jak mogę ponownie scalić zatwierdzenia, które zostały cofnięte w github?

Dziś rano połączyłem dużą gałąź kodu, która okazała się krytyczna. Aby go cofnąć, mój współpracownik przywrócił połączenie (które miało kilka załączników) w GitHub i po pociągnięciu wszystko wyglądało dobrze.

Po wprowadzeniu kilku poprawek w gałęzi operacji, chciałem się upewnić, że może to znowu nastąpić, więc użyłem "git merge master" w mojej gałęzi funkcji (tak jak zawsze), aby upewnić się, że wszystko jest aktualne .

Co zaskakujące, wynikiem tego było usunięcie całego nowego kodu, który muszę ponownie połączyć z głównym repo!

Czy jest to spowodowane cofnięciem, które miało miejsce w oddziale? Przeglądając dziennik git, widzę, że wszystkie zatwierdzenia są nadal dostępne. I jeszcze dziwniejsze, żądanie ściągnięcia w github nie pokazuje żadnego z oryginalnych commitów w różnicach, tylko to, co zmieniłem od czasu powrotu.

Czy ktoś może mi pomóc w zrozumieniu tego?

Wiem, że niektórzy ludzie zasugerowali po prostu przywrócenie odwrotu, ale muszę wrócić do czysta, ponieważ zmiany, które wprowadziłem, dotyczą struktury znacznej części kodu.

+1

cześć tam. spróbuj 'git reflog' w twojej konsoli. pokaże ci pełną historię tego, co zostało zrobione twojemu repozytorium (nie oddziału, ale pełne repozytorium). Sprawdź wybrany moment w czasie i kontynuuj od tego. – CodeWizard

+0

Dzięki za komentarz! W moim przypadku commits są przeplatane w całym tekście. Oddział został utworzony na kilka miesięcy i nie ma dla mnie miejsca, w którym mógłbym się zresetować.Myślę, że potrzebny jest rebase, po prostu staram się wymyślić, jak całkowicie usunąć commits, które dodaję ponownie z gałęzi funkcji – Lizza

+1

OK, źle, post to odpowiedź - baza, której potrzebujesz – CodeWizard

Odpowiedz

6

wpadłem na tym samym numerze pewnego razu. Moje rozwiązanie, które działało, polegało na "przywróceniu przywracania" przed połączeniem wzorca z powrotem w moim oddziale.

To, co robi, pozostawia po sobie wszystkie zmiany, w tym nowe poprawki.

git checkout master 
git checkout -b master-with-revert-revered 
git revert <revert commit id> 
git checkout fixed-branch 
git merge master-with-revert-revered 

Po tym, twój stały oddział powinien być bezpośrednio połączony z powrotem do systemu głównego bez problemu.

+0

Doceniam wgląd, Daniel. Próbowałem do tej pory wielu różnych opcji, a ze względu na złożoność tych zobowiązań i ich ogromną liczbę, myślę, że odwrócenie odwrotu będzie moim najbezpieczniejszym zakładem. – Lizza

1

myślę że rebase to co muszę, po prostu próbuje dowiedzieć się, jak całkowicie usunąć zobowiązuje dodaję znowu z branży fabularnego

jeśli trzeba „remoe/scalania” commit, powinieneś użyć squash.
Squash jest jedną z opcji rebase.

Aby z niego skorzystać, należy wykonać interaktywny rebase.
git rebase -i HEAD~10 otworzy vi (lub dowolny inny edytor, którego używasz) i pozwoli ci "przetasować" twoje zatwierdzenia. Możesz usunąć zatwierdzenie, połączyć je z jednym, uporządkować je i uzyskać więcej.

Znajdziesz tu listę opcji wewnątrz VI wraz z wykazem zatwierdzeń, które decydują się na reabse (w powyższym przykładzie zajmie ostatnie 10 HEAD~10)

+0

Dzięki za odpowiedź! Więc w moim przypadku, ponieważ revert naprawdę nie usunął commitów, czy chcę je wszystkie usunąć z oddziału? Wygląda na to, że polecenie to jest dd. Wygląda również na to, że pierwsze zatwierdzenie, które muszę usunąć, to ponad 100 commitów temu, więc HEAD ~ 100? – Lizza

+0

Dokładnie. dostałeś to :-) – CodeWizard

+0

Albo możesz powrócić do pożądanego punktu w czasie, utwórz nową gałąź od tego punktu, a następnie interaktywnie odbierz z tego punktu – CodeWizard

Powiązane problemy