W jednej z moich gałęzi programistycznych wprowadziłem pewne zmiany w mojej bazie kodu. Zanim byłem w stanie ukończyć funkcje, nad którymi pracowałem, musiałem zmienić swój obecny oddział na master, aby zaprezentować niektóre funkcje. Ale samo użycie „git checkout master” zachowało zmiany, które wprowadziłem również w mojej gałęzi programistycznej, a tym samym zepsuło niektóre funkcje w master. Więc to, co zrobiłem, to zatwierdzenie zmian w mojej gałęzi programistycznej z komunikatem zatwierdzenia „tymczasowe zatwierdzenie”, a następnie kasa kontrolna dla wersji demonstracyjnej.
Teraz, kiedy skończyłem wersję demo i wróciłem do pracy w mojej gałęzi programistycznej, chciałbym usunąć „tymczasowe zatwierdzenie”, które wykonałem, zachowując wprowadzone zmiany. Czy to jest możliwe?
git stash
git stash
jest to dobre narzędzie, zatwierdzanie „wyrzucania w toku” jest również całkiem uzasadnionym urządzeniem.git stash
w międzyczasie mogłem użyć innej gałęzi.stash
jest to, że jest on całkowicie lokalny i będzie podatny na utratę kodu w wyniku usunięcia repo lub odtworzenia lub awarii lub utraty sprzętu. IMO, naprawdę powinno się go używać tylko do krótkoterminowego PWT. Uwielbiam zatwierdzenie WIP przed wyjazdem na wakacje: P ... nazwij to zatwierdzeniem zrzutu mózgu!Odpowiedzi:
To takie proste:
Uwaga: niektóre powłoki traktują
^
jako znak specjalny (na przykład niektóre powłoki Windows lub ZSH z włączonym globowaniem ), więc"HEAD^"
w takich przypadkach może być konieczne zacytowanie .git reset
bez a--hard
lub--soft
przenosi twójHEAD
punkt do wskazanego zatwierdzenia, bez zmiany żadnych plików.HEAD^
odnosi się do (pierwszego) zatwierdzenia nadrzędnego twojego bieżącego zatwierdzenia, którym w twoim przypadku jest zatwierdzenie przed tymczasowym.Zauważ, że inną opcją jest kontynuowanie normalnie, a następnie uruchomienie następnego punktu zatwierdzenia:
który zamiast tego edytuje ostatni zatwierdzenie, dając taki sam efekt jak powyżej.
Zauważ, że to (jak w przypadku prawie każdej odpowiedzi git) może powodować problemy, jeśli już zepchnąłeś złe zatwierdzenie do miejsca, z którego ktoś inny mógł je wyciągnąć. Staraj się tego unikać
źródło
More?
po zrobieniu tego. Cokolwiekfatal: ambiguous argument 'HEADwhateverItypedIn': unknown revision or path not in the working tree.
^
jako znak specjalny. Możesz zacytować odwołanie"HEAD^"
lub skorzystać z alternatywnej składni bezHEAD~1
cudzysłowugit reset HEAD\^
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
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.
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.
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 zpick
nafixup
lubsquash
. Używaniefixup
po prostu odrzuca, który zatwierdza wiadomość i łączy zmiany z jej bezpośrednim poprzednikiem na liście. Słowosquash
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.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ą ...
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 ...
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ń.
W twoim przypadku poruszałeś się trochę po oddziałach, ale ten sam pomysł nadal obowiązuje.
Mam nadzieję że to pomoże.
źródło
git config --global alias.uncommit reset HEAD^
tylko aliasy niezalecane do zresetowania. Zamiast zrobićgit config --global alias.uncommit 'reset HEAD^'
Myślę, że tego szukasz
git reset --soft HEAD~1
Cofa ostatnie zatwierdzenie, zachowując zmiany wprowadzone w tym zatwierdzeniu do inscenizacji.
źródło
git reset HEAD^
w systemie Windows powoduje jedynie wyświetlenie monitu „Więcej?” - cokolwiek to znaczy^
to znak ucieczki w DOS. Po sparowaniu z nowym wierszem służy jako monit o kontynuację poprzedniego polecenia. Pisaniegit reset HEAD^^
powinno działać w systemie Windows.Tak, możesz usunąć swoje zatwierdzenie bez usuwania zmian: git reset @ ~
źródło
git reset --soft
lubgit reset --keep
?Szukasz albo
git reset HEAD^ --soft
albogit reset HEAD^ --mixed
.Istnieją trzy tryby polecenia resetowania, jak podano w dokumentacji :
git reset HEAD^ --soft
cofnij
git commit
. Zmiany nadal istnieją w działającym drzewie (folder projektu) + indeks (--cached)git reset HEAD^ --mixed
cofnij
git commit
+git add
. Zmiany nadal istnieją w działającym drzewiegit reset HEAD^ --hard
Jak nigdy nie wprowadziłeś tych zmian w bazie kodu. Zmiany zniknęły z działającego drzewa.
źródło
Dla tych, którzy używają zsh, będziesz musiał użyć:
git reset --soft HEAD\^
Wyjaśniono tutaj: https://github.com/robbyrussell/oh-my-zsh/issues/449
W przypadku utraty adresu URL ważną częścią jest:
źródło
git reset HEAD^
działa dla mnie w Zsh, być może został naprawiony.zsh 5.3 (x86_64-apple-darwin18.0)
W moim przypadku już przeforsowałem repozytorium. Auć!
Możesz cofnąć określone zatwierdzenie, zachowując zmiany w plikach lokalnych, wykonując:
W ten sposób mogłem zachować potrzebne zmiany i cofnąć zatwierdzenie, które już zostało wypchnięte.
źródło
git revert bad-commit-sha
,git revert -n revert-commit-just-created-sha
a potem naprawa. Masz mnie w połowie drogi. Dzięki!Korzystanie z git 2.9 (dokładnie 2.9.2.windows.1)
git reset HEAD^
monituje o więcej; nie jestem pewien, czego się tutaj oczekuje. Zobacz poniższy zrzut ekranuZnaleziono inne rozwiązanie,
git reset HEAD~#numberOfCommits
za pomocą którego możemy wybrać liczbę lokalnych zatwierdzeń, które chcesz zresetować, utrzymując zmiany w nienaruszonym stanie. W związku z tym mamy możliwość wyrzucenia wszystkich lokalnych zatwierdzeń, a także ograniczonej liczby lokalnych zatwierdzeń.Zobacz poniższe zrzuty ekranu
git reset HEAD~1
w akcji:źródło
Jeszcze jeden sposób, aby to zrobić.
Dodaj zatwierdzenie na górze tymczasowego zatwierdzenia, a następnie wykonaj:
Aby połączyć dwa zatwierdzenia w jeden (polecenie otworzy plik tekstowy z wyraźnymi instrukcjami, edytuj go).
źródło
git reset HEAD^
. Baza Git ma tutaj dużo miejsca na błędy.