Po ostatnim zatwierdzeniu zmodyfikowałem kilka plików w kopii roboczej, ale chcę cofnąć zmiany w jednym z tych plików, ponieważ przywracam go do tego samego stanu, co w ostatnim zatwierdzeniu.
Chcę tylko cofnąć zmiany kopii roboczej tylko jednego pliku, nic więcej z tym.
Jak mogę to zrobić?
git reset HEAD <filename> ; git checkout -- <filename>
HEAD^^
dla 2 zatwierdzeń od najnowszego lubHEAD^^^
dla 3 zatwierdzeń z powrotem. Możesz także użyćHEAD~2
, lubHEAD~3
, co staje się wygodniejsze, jeśli chcesz cofnąć więcej zatwierdzeń, podczas gdyHEAD^2
oznacza to „drugiego rodzica tego zatwierdzenia”; z powodu zatwierdzeń scalania, zatwierdzenie może mieć więcej niż jedno poprzednie zatwierdzenie, więc zHEAD^
liczbą wybiera, który z tych rodziców, podczas gdy zHEAD~
liczbą zawsze wybiera pierwszego rodzica, ale ta liczba zatwierdza z powrotem. Zobaczgit help rev-parse
po więcej szczegółów.Po prostu użyj
Spowoduje to zastąpienie nazwy pliku najnowszą wersją z bieżącego oddziału.
OSTRZEŻENIE: zmiany zostaną odrzucone - kopia zapasowa nie jest przechowywana.
źródło
git checkout x
x to nazwa gałęzi, a także nazwa pliku, nie jestem pewien, jakie jest domyślne zachowanie, ale myślę, że git zakłada, że chcesz przejść na gałąź x. Kiedy używasz--
, mówisz, że to, co następuje, to nazwy plików.--
. Mimo że nadal jest poprawny, jak wskazuje @hasen, jeśli istnieje niejednoznaczność między nazwą pliku a nazwą gałęzi, może dojść do bardzo niepożądanego zachowania!--
, przyjemny i łatwy. Kiedy nazywasz gałęzie za pomocą nazw plików, gdzieś musi być złe myślenie ...Użyłem tego dzisiaj, ponieważ zdałem sobie sprawę, że mój favicon został zastąpiony kilka commits temu, kiedy uaktualniłem do drupal 6.10, więc musiałem go odzyskać. Oto co zrobiłem:
źródło
git log --oneline <filename>
da ci bardziej zwarty dziennik i będzie zawierać tylko zmiany w konkretnym plikugit reflog <filename>
Jeśli plik jest już przemieszczany (dzieje się to po dodaniu git itp. Po edycji pliku), aby wycofać zmiany.
Posługiwać się
Następnie
Jeśli nie jest już wystawiany, po prostu użyj
źródło
Jeśli chcesz po prostu cofnąć zmiany poprzedniego zatwierdzenia dla tego jednego pliku, możesz spróbować:
Spowoduje to pobranie pliku tak, jak przed ostatnim zatwierdzeniem. Jeśli chcesz cofnąć się o kilka kolejnych zatwierdzeń, użyj
branchname~n
notacji.źródło
branchname^
Zrobiłem poprzez git bash:
(use "git checkout -- <file>..." to discard changes in working directory)
źródło
Zawsze się z tym mylę, więc oto przypadek testowy przypomnienia; powiedzmy, że mamy ten
bash
skrypt do przetestowaniagit
:W tym momencie zmiana nie jest przenoszona do pamięci podręcznej, podobnie jak
git status
:Jeśli od tego momentu to zrobimy
git checkout
, wynik będzie następujący:Jeśli zamiast tego zrobimy
git reset
, wynik będzie:Tak więc w tym przypadku - jeśli zmiany nie są wprowadzane, nie
git reset
ma znaczenia, a zmiany sągit checkout
zastępowane.Powiedzmy teraz, że ostatnia zmiana z powyższego skryptu jest przenoszona / buforowana, to znaczy, że zrobiliśmy to również
git add b.txt
na końcu.W tym przypadku
git status
w tym momencie jest:Jeśli od tego momentu to zrobimy
git checkout
, wynik będzie następujący:Jeśli zamiast tego zrobimy
git reset
, wynik będzie:Tak więc w tym przypadku - jeśli zmiany są wprowadzane etapowo,
git reset
zasadniczo zmieniają zmiany etapowe w zmiany niestacjonarne - jednocześniegit checkout
całkowicie je nadpisując.źródło
Ta odpowiedź dotyczy polecenia potrzebnego do cofnięcia lokalnych zmian, które znajdują się w wielu określonych plikach w tym samym lub wielu folderach (lub katalogach). Odpowiedzi te dotyczą w szczególności pytania, w którym użytkownik ma więcej niż jeden plik, ale nie chce cofnąć wszystkich lokalnych zmian:
W przypadku wielu plików w tym samym folderze:
Gwiazdka w powyższym przykładzie polega na cofnięciu wszystkich plików w tej lokalizacji pod nazwą1 / nazwa2.
Uwaga: nazwa1, nazwa2, nazwaA, podfolder - wszystkie te przykładowe nazwy folderów wskazują folder lub pakiet, w którym mogą znajdować się dane pliki.
źródło
Przywracam moje pliki przy użyciu identyfikatora SHA. To, co robię, to
git checkout <sha hash id> <file name>
źródło
Dla mnie tylko ten działał
źródło
Jeśli jeszcze nie wypchnąłeś lub w inny sposób nie podzieliłeś się swoim zatwierdzeniem:
źródło
Jeśli jest już zatwierdzony, możesz cofnąć zmianę pliku i zatwierdzić ponownie, a następnie zgnieść nowe zatwierdzenie z ostatnim zatwierdzeniem.
źródło
Nie wiem dlaczego, ale kiedy próbuję wprowadzić kod, pojawia się on jako obraz.
źródło