Mój problem polega na tym, że zmieniłem plik, np .: README, dodałem nowy wiersz „ this for my test line ” i zapisałem plik, a następnie wydałem następujące polecenia
git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README
#
no changes added to commit (use "git add" and/or "git commit -a")
git add README
git commit -a -m 'To add new line to readme'
Nie wypchnąłem kodu do github, teraz chcę anulować to zatwierdzenie.
Do tego użyłem
git reset --hard HEAD~1
Ale zgubiłem nowo dodaną linię „ to dla mojej linii testowej ” z pliku README. To nie powinno się zdarzyć. Potrzebuję treści, aby tam być. Czy istnieje sposób na zachowanie zawartości i anulowanie mojego lokalnego zatwierdzenia?
git
git-reset
git-commit
Amal Kumar S.
źródło
źródło
git revert
, co tworzy nowe zatwierdzenie z odwrotnym różnicą cofniętego zatwierdzenia. Resetowanie po prostu wskazuje bieżącą gałąź na inne zatwierdzenie, w tym przypadku przed zatwierdzeniem, które chcesz „zapomnieć”.git-commit
można przerwać, jeśli zostawisz wiadomość pustą, więc jeśli faktycznie nie ukończyłeś zatwierdzenia, może to być pomocne.Odpowiedzi:
Po prostu użyj
git reset
bez--hard
flagi:PS: W systemach opartych na Uniksie możesz używać
HEAD^
równegoHEAD~1
. W systemie WindowsHEAD^
nie będzie działać, ponieważ^
sygnalizuje kontynuację linii. Więc twój wiersz polecenia po prostu cię zapytaMore?
.źródło
--mixed
w instrukcji .@^
na skrótHEAD^
.Użyj
--soft
zamiast--hard
flagi:źródło
git reset --soft HEAD^
usunie ostatni lokalny (unpushed) zobowiązać ale zachować zmiany zostały zrobionegit reset --soft HEAD~
wJeśli jesteś w środku zatwierdzenia (tj. Już w edytorze), możesz go anulować, usuwając wszystkie wiersze powyżej pierwszego
#
. To przerwie zatwierdzenie.Możesz więc usunąć wszystkie wiersze, aby komunikat zatwierdzenia był pusty, a następnie zapisz plik:
Otrzymasz wiadomość z napisem
Aborting commit due to empty commit message.
.EDYTOWAĆ :
Możesz także usunąć wszystko linie, a wynik będzie dokładnie taki sam.
Aby usunąć wszystkie wiersze w vimie (jeśli jest to domyślny edytor), po przejściu do edytora wpisz,
gg
aby przejść do pierwszego wiersza, a następniedG
usuń wszystkie wiersze. Na koniec napisz i zamknij plik,wq
a zatwierdzenie zostanie przerwane.źródło
rebase -i mybranchname
Pierwszą rzeczą, którą powinieneś zrobić, to ustalić, czy chcesz zachować lokalne zmiany przed usunięciem komunikatu zatwierdzenia.
Służy
git log
do wyświetlania bieżących komunikatów zatwierdzania, a następnie znajdźcommit_id
przed zatwierdzeniem, który chcesz usunąć, a nie zatwierdzenie, które chcesz usunąć.Jeśli chcesz zachować zmienione lokalnie pliki i po prostu usuń komunikat zatwierdzenia:
git reset --soft commit_id
Jeśli chcesz usunąć wszystkie lokalnie zmienione pliki i komunikat zatwierdzenia:
git reset --hard commit_id
To jest różnica miękkości i twardości
źródło
Możesz powiedzieć Gitowi, co zrobić ze swoim indeksem (zestawem plików, które staną się następnym zatwierdzeniem) i katalogiem roboczym podczas wykonywania resetowania gita, używając jednego z parametrów:
--soft
: Tylko zatwierdzenia zostaną zresetowane, podczas gdy indeks i katalog roboczy nie zostaną zmienione.--mixed
: Spowoduje to zresetowanie indeksu zgodnie z HEAD, podczas gdy katalog roboczy nie zostanie zmieniony. Wszystkie zmiany pozostaną w katalogu roboczym i pojawią się jako zmodyfikowane.--hard
: Resetuje wszystko (zatwierdza, indeks, katalog roboczy), aby dopasować HEAD.W twoim przypadku chciałbym
git reset --soft
zachować zmodyfikowane zmiany w indeksie i katalogu roboczym. Sprawdź to, aby uzyskać bardziej szczegółowe wyjaśnienie.źródło
Użyj poniższego polecenia:
Po tym możesz również przeglądać pliki, które cofają się jak poniżej odpowiedzi.
źródło