To, co musisz zrobić, to utworzyć nowe zatwierdzenie z tymi samymi szczegółami, co bieżące HEAD
zatwierdzenie, ale z nadrzędnym jak poprzednia wersja HEAD
. git reset --soft
przesunie wskaźnik gałęzi, tak aby następne zatwierdzenie miało miejsce na innym zatwierdzeniu niż w miejscu, w którym znajduje się obecnie nagłówek gałęzi.
# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}
# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
git reflog
celu znalezienia poprawnego numeru np{2}
.git commit --amend
. Drugi to „przeróbka” na nowy zatwierdzenie. Działa to dla każdegogit commit
, nie tylko--amend
.git commit
.git reset --soft HEAD@{1}
:fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
. Kiedy zastąpiłemHEAD@{1}
odpowiednikiem skrótu zatwierdzenia pokazanego wgit reflog
(dzięki JJD!), Ta odpowiedź zadziałała cudownie!HEAD@{1}
. Jeśliecho HEAD@{1}
na przykład uruchomię w tcsh, wynik jest taki,HEAD@1
że nawiasy klamrowe zostały zinterpretowane przez tcsh. Jeśli użyję pojedynczych cudzysłowów, nawiasy klamrowe zostaną zachowane.użyj dziennika ref :
powinieneś mieć wszystkie wcześniej zmienione zmiany tylko w kopii roboczej i możesz je ponownie zatwierdzić
aby zobaczyć pełną listę poprzednich typów indeksów
git reflog
źródło
HEAD@{1}
iHEAD~1
?HEAD~1
jest dokładnie taki sam jakHEAD^
i identyfikuje element nadrzędny bieżącego zatwierdzenia.HEAD@{1}
z drugiej strony odnosi się do zatwierdzenia, na które HEAD wskazywał przed tym, tzn. oznacza różne zatwierdzenia, kiedy kasujesz inny oddział lub zmieniasz zatwierdzenie.git reset HEAD@{1}
wystarczy.Znajdź swoje zmienione zobowiązania przez:
Uwaga: Możesz dodać,
--patch
aby zobaczyć treść zatwierdzeń dla przejrzystości. Tak samo jakgit reflog
.następnie zresetuj HEAD do dowolnego poprzedniego zatwierdzenia w punkcie, w którym było w porządku przez:
Uwaga: Zamień SHA1 na swój prawdziwy hash zatwierdzenia. Pamiętaj też, że to polecenie spowoduje utratę wszelkich niezatwierdzonych zmian, więc możesz je wcześniej ukryć. Możesz też użyć
--soft
zamiast tego, aby zachować najnowsze zmiany, a następnie zatwierdzić je.Następnie wybierz inne zatwierdzenie, które potrzebujesz na nim:
źródło
git reset SHA1 --soft
, możesz zachować najnowsze zmiany, a następnie je zatwierdzić.Zawsze możesz podzielić zatwierdzenie, z instrukcji
źródło
git reflog
to wszystko, czego potrzebujeszgit reset
zamiastgit reset --soft
, a następnie zróbgit add --patch
.Być może warto zauważyć, że jeśli nadal jesteś w edytorze z komunikatem zatwierdzenia, możesz usunąć komunikat zatwierdzenia, a to przerwie
git commit --amend
polecenie.źródło
Może można użyć,
git reflog
aby uzyskać dwa zatwierdzenia przed poprawką i po zmianie.Następnie użyj,
git diff before_commit_id after_commit_id > d.diff
aby uzyskać różnicę między przed i po zmianie.Następnie użyj,
git checkout before_commit_id
aby cofnąć się przed zatwierdzeniemI ostatnie użycie,
git apply d.diff
aby zastosować prawdziwą zmianę, którą zrobiłeś.To rozwiązuje mój problem.
źródło
Jeśli wypchnąłeś zatwierdzenie na zdalne, a następnie błędnie poprawiono zmiany w tym zatwierdzeniu, rozwiąże to problem. Wydaj a,
git log
aby znaleźć SHA przed zatwierdzeniem. (zakłada to, że pilot ma nazwę pochodzenia). Teraz wydaj te polecenia za pomocą tego SHA.źródło
Możesz zrobić poniżej, aby cofnąć swoje
git commit —amend
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull origin your_branch_name
====================================
Teraz twoje zmiany są takie, jak poprzednio. Skończyłeś cofanie
git commit —amend
Teraz możesz zrobić
git push origin <your_branch_name>
, aby przejść do oddziału.źródło
Prawie 9 lat spóźniło się z tym, ale nie zauważyłem, by wspomniana odmiana osiągnęła to samo (to rodzaj połączenia kilku z nich, podobnie jak najlepsza odpowiedź ( https://stackoverflow.com/a/1459264/4642530 ) .
Przeszukaj wszystkie odłączone głowy na gałęzi
git reflog show origin/BRANCH_NAME --date=relative
Następnie znajdź skrót SHA1
Zresetuj do starego SHA1
git reset --hard SHA1
Następnie popchnij go z powrotem.
git push origin BRANCH_NAME
Gotowy.
Spowoduje to całkowite przywrócenie starego zatwierdzenia.
(W tym data wcześniejszego zastąpienia odłączonej głowy zatwierdzenia)
źródło
--soft
aby zachować zmiany. Chcę tylko, żeby zostało popełnione osobnoKasa do tymczasowego oddziału z ostatnim zatwierdzeniem
git branch temp HEAD@{1}
Zresetuj ostatnie zatwierdzenie
git reset temp
Teraz będziesz mieć wszystkie pliki swojego zatwierdzenia, a także poprzednie zatwierdzenie. Sprawdź status wszystkich plików.
git status
Zresetuj swoje pliki zatwierdzania od etapu git.
git reset myfile1.js
(wkrótce)Ponownie podłącz to zatwierdzenie
git commit -C HEAD@{1}
Dodaj i zatwierdź swoje pliki do nowego zatwierdzenia.
źródło