Istnieją dwa sposoby radzenia sobie z tym. To, co jest łatwiejsze, zależy od twojej sytuacji
Resetowanie
Jeśli zatwierdzenie, którego chcesz się pozbyć, było ostatnim zatwierdzeniem i nie wykonałeś żadnej dodatkowej pracy, której możesz po prostu użyć git-reset
git reset HEAD^
Przenosi gałąź z powrotem do zatwierdzenia tuż przed bieżącym HEAD. Jednak tak naprawdę nie zmienia plików w twoim drzewie roboczym. W rezultacie zmiany, które były w tym zatwierdzeniu, pokazują się jako zmodyfikowane - to jest jak polecenie „niezalecane”. W rzeczywistości mam do tego alias.
git config --global alias.uncommit 'reset HEAD^'
Następnie możesz po prostu użyć git uncommitw przyszłości, aby wykonać kopię zapasową jednego zatwierdzenia.
Squashing
Zgniecenie zatwierdzenia oznacza połączenie dwóch lub więcej zatwierdzeń w jeden. Robię to dość często. W twoim przypadku zatwierdzono połowę wykonanej funkcji, a następnie zakończyłbyś ją i zatwierdził ponownie z odpowiednim, stałym komunikatem zatwierdzenia.
git rebase -i <ref>
Mówię powyżej, ponieważ chcę wyjaśnić, że może to być dowolna liczba zatwierdzeń z powrotem. Uruchom git logi znajdź zatwierdzenie, którego chcesz się pozbyć, skopiuj jego SHA1 i użyj go zamiast <ref>. Git przeniesie Cię w interaktywny tryb bazy. Pokaże wszystkie zobowiązania między twoim obecnym stanem a tym, co umieścisz na miejscu <ref>. Więc jeśli <ref>jest 10 zatwierdzeń temu, pokaże ci wszystkie 10 zatwierdzeń.
Przed każdym zatwierdzeniem będzie mieć słowo pick. Znajdź zatwierdzenie, którego chcesz się pozbyć i zmień je z pickna fixuplub squash. Używanie fixuppo prostu odrzuca, który zatwierdza wiadomość i łączy zmiany z jej bezpośrednim poprzednikiem na liście. Słowo squashkluczowe robi to samo, ale pozwala edytować komunikat zatwierdzenia nowo połączonego zatwierdzenia.
Pamiętaj, że zatwierdzenia zostaną ponownie zatwierdzone w kolejności, w jakiej pojawiają się na liście po wyjściu z edytora. Więc jeśli dokonałeś tymczasowego zatwierdzenia, a następnie wykonałeś inną pracę w tej samej gałęzi i ukończyłeś funkcję w późniejszym zatwierdzeniu, to użycie rebase pozwoliłoby ci ponownie posortować zatwierdzenia i zmiażdżyć je.
OSTRZEŻENIE:
Wycofanie modyfikuje historię - NIE rób tego w stosunku do wszystkich zobowiązań, które już udostępniłeś innym programistom.
Schowanie
W przyszłości, aby uniknąć tego problemu, rozważ git stashtymczasowe przechowywanie niezamówionej pracy.
git stash save 'some message'
Spowoduje to zapisanie bieżących zmian z boku na liście skrytek. Powyżej znajduje się najbardziej wyraźna wersja polecenia ukrywania, umożliwiająca komentarz opisujący to, co ukrywasz. Możesz także po prostu uruchomić git stashi nic więcej, ale żadna wiadomość nie zostanie zapisana.
Możesz przeglądać listę skrytek za pomocą ...
git stash list
Spowoduje to wyświetlenie wszystkich skrytek, gałęzi, na których zostały wykonane, a także wiadomości i na początku każdej linii oraz identyfikatora skrytki, która wygląda tak, stash@{#}gdzie # jest pozycją w tablicy skrytek.
Aby przywrócić skrytkę (można to zrobić na dowolnym oddziale, niezależnie od tego, gdzie skrytka została pierwotnie utworzona), po prostu uruchom ...
git stash apply stash@{#}
Znów # jest pozycją w tablicy skrytek. Jeśli skrytka, którą chcesz przywrócić, znajduje się w 0pozycji - to znaczy, jeśli była to najnowsza skrytka. Następnie można po prostu uruchomić polecenie bez określania położenia stash git obejmie chodziło Ci ostatni: git stash apply.
Jeśli na przykład pracuję nad niewłaściwą gałęzią - mogę uruchomić następującą sekwencję poleceń.
git stash
git checkout <correct_branch>
git stash apply
W twoim przypadku poruszałeś się trochę po oddziałach, ale ten sam pomysł nadal obowiązuje.
Mam nadzieję że to pomoże.
git stash