Popełniłem zmianę i zapomniałem dodać plik do zbioru zmian. Po innych zatwierdzeniach zdałem sobie sprawę, że brakuje pliku w HEAD^4
zatwierdzeniu.
Jak przepisać poprzednie zatwierdzenie, aby uwzględnić brakujący plik?
git
git-commit
kolrie
źródło
źródło
Odpowiedzi:
Użyj
git rebase --interactive HEAD~4
i ustawedit
opcję dla zatwierdzenia, które chcesz zmienić.Pamiętaj, że nie powinieneś w ten sposób modyfikować zatwierdzeń wysyłanych do zdalnego repozytorium. W takim przypadku lepiej jest dodać nowe zatwierdzenie z brakującym plikiem.
źródło
git push -f
gdybym był pewien, że upstream się nie zmienił?add
-ED brakujące pliki, więc zrobiłem commit z „xxx” jako wiadomości. Następnie wykonałem polecenie rebase i zmieniłem zatwierdzenie „xxx” z „wybierz” na „edytuj”. Następnie wykonałem polecenie „git rebase --continue”. Teraz, kiedy patrzę na historię, mam „xxx” jako ostatnie zatwierdzenie, a wcześniejsze zatwierdzenie, do którego chciałem je dodać, pozostaje niezmienione! Zastanawiam się, gdzie był mój błąd?Zdaję sobie sprawę, że ludzie mogą wyszukiwać w wyszukiwarce Google i przychodzić tutaj, aby znaleźć prostszą odpowiedź: a co, jeśli to tylko ostatnie zatwierdzenie? (Pytanie OP dotyczy naprawienia czwartego zatwierdzenia w historii)
Jeśli zdecydujesz się zatwierdzić i zdasz sobie sprawę, że zapomniałeś od razu dodać plik , po prostu wykonaj:
Gdzie
--no-edit
zachowa ten sam komunikat o zatwierdzeniu.Bułka z masłem!
źródło
--amend
mają różne skrótyHEAD^4
. Tak jest w porządku, tylko jako dodatek w celach informacyjnych. ;)Jeśli NIE wypchnąłeś tych 4 zatwierdzeń, możesz to zrobić w następujący sposób:
Utwórz pliki łatek dla wszystkich tych zatwierdzeń:
Przewiń wstecz o 4 zatwierdzenia:
Dodaj brakujący plik:
Zatwierdź to za pomocą
--amend
:Zastosuj wszystkie zapisane poprawki z powrotem:
Jeśli nacisnąłeś, NIE powinieneś używać tej metody. Zamiast tego po prostu przyznaj się do pomyłki i utwórz jeszcze jedno zatwierdzenie na szczycie HEAD, które rozwiązuje ten problem.
źródło
git format-patch
/git am
znacznie lepiej. Co najważniejsze, daje ci to większą pewność, jeśli coś schrzanisz - zatwierdzenie zapisane jako łatka w fizycznym pliku jest najlepszą siecią bezpieczeństwa.git gc
:)rm *.patch
)Chociaż zaakceptowana odpowiedź jest poprawna, brakuje w niej szczegółowych instrukcji, jak przeprowadzić edycję zatwierdzenia podczas procesu rebase.
Najpierw rozpocznij proces rebase:
Zostanie wyświetlona lista zatwierdzeń, wybierz zatwierdzenie, które chcesz edytować, zmieniając słowo
pick
naedit
i zapisz plik.Wprowadź niezbędne modyfikacje w swoim kodzie (pamiętaj, aby wywołać
git add
nowe pliki)Po wykonaniu wszystkich modyfikacji wydaj
git commit --amend
- to zmieni zatwierdzenie oznaczone jakoedit
Wywołanie
git rebase --continue
, które zakończy proces (jeśli jest więcej zatwierdzeń oznaczonych jakoedit
, powyższe kroki należy powtórzyć)Ważne notatki:
NIE usuwaj linii oznaczonych jako
pick
, których nie chcesz edytować - pozostaw je bez zmian. Usunięcie tych wierszy spowoduje usunięcie powiązanych zatwierdzeńGIT zmusza cię do zmiany
stash
bazy, jeśli twój katalog roboczy nie jest czysty; możesz jednakgit stash pop / git stash apply
podczas rebase, aby zmienić te zmiany (tj. zmiany schowane przed rozpoczęciem procesu rebase) do zatwierdzenia oznaczonego jakoedit
jeśli coś poszło nie tak i chcesz cofnąć zmiany dokonane podczas procesu rebase przed jego zakończeniem (tj. chcesz powrócić do punktu przed rozpoczęciem rebase), użyj
git rebase --abort
- przeczytaj również: Jak przerwać interaktywną rebase, jeśli --abort nie robi t działa?Jak powiedziano w zaakceptowanej odpowiedzi:
Odpowiedź dlaczego znajduje się w Git Book (akapit zatytułowany „ The Perils of Rebasing ”):
źródło