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 uncommit
w 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 log
i 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 pick
na fixup
lub squash
. Używanie fixup
po prostu odrzuca, który zatwierdza wiadomość i łączy zmiany z jej bezpośrednim poprzednikiem na liście. Słowo squash
kluczowe 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 stash
tymczasowe 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 stash
i 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 0
pozycji - 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