Zwykle, aby odrzucić zmiany w pliku, należy:
git checkout -- <file>
Co jeśli zmiana, którą chcę odrzucić, polega na usunięciu pliku? Powyższa linia dałaby błąd:
error: pathspec '<file>' did not match any file(s) known to git.
Jakie polecenie przywróci ten pojedynczy plik bez cofania innych zmian?
punkt bonusowy: Co też, jeśli zmiana, którą chcę odrzucić, polega na dodaniu pliku? Chciałbym również wiedzieć, jak wprowadzić tę zmianę w życie.
git
git-checkout
lurscher
źródło
źródło
Odpowiedzi:
Zakładając, że chcesz cofnąć efekty,
git rm <file>
lubrm <file>
po nich,git add -A
lub coś podobnego:Aby cofnąć
git add <file>
, wystarczy pierwsza linia powyżej, zakładając, że jeszcze tego nie zrobiłeś.źródło
--
jest klucz.git reset <file>
nie działa, co mnie tu sprowadziło.end-of-options-marker
wymagane tylko w przypadku usuniętego pliku?git reset HEAD <file>
, co jest równoważne), alegit reset
traktuje swój pierwszy argument wcześniejend-of-options-marker
jako nazwę ref, a nie nazwę pliku. Czy można to napisać nieco bardziej elastycznie? Prawdopodobnie. Dlaczego nie było Prawdopodobnie tylko programiści wiedzą na pewno.git reset filename
działa dobrze w przypadku plików nieskasowanych.Na oba pytania udzielono odpowiedzi
git status
.Aby wycofać scenę z dodawania nowego pliku, użyj
git rm --cached filename.ext
Aby cofnąć scenę, usuń plik
git reset HEAD filename.ext
Z drugiej strony,
git checkout --
nigdy nie rezygnuj ze sceny, po prostu odrzuca zmiany bezetapowe.źródło
git status
cytowane; pokazuje użytkownikom sposób na samopomoc teraz i następnym razem, w przypadku gdy informacje zostaną dodane lub zaktualizowane w przyszłych wersjach git.git reset
. Po tymgit reset
zobaczysz „Zmieniono, ale nie zaktualizowano”, co najwyraźniej oznacza „Zmiany niewprowadzone” w ojczystym języku autorów git. Co ważniejsze, cały dogmat o „statusie gita mówi ci wszystko, co wiesz” jest kłamstwem. (Menedżerowie, którzy twierdzą, że marnują czas ludzi i powinni zostać zwolnieni).Odpowiedzi na twoje dwa pytania są powiązane. Zacznę od drugiego:
Po umieszczeniu pliku (często za pomocą
git add
, choć niektóre inne polecenia pośrednio również wprowadzają zmiany, na przykładgit rm
), możesz wycofać tę zmianę za pomocągit reset -- <file>
.W twoim przypadku musiałeś użyć
git rm
do usunięcia pliku, co jest równoznaczne z usunięciem go,rm
a następnie zainscenizowaniem tej zmiany. Jeśli najpierw go odetnieszgit reset -- <file>
, możesz go odzyskaćgit checkout -- <file>
.źródło
Jeśli został wyreżyserowany i zatwierdzony, następujące operacje zresetują plik:
Będzie to działać w przypadku usunięcia, które miało miejsce kilka poprzednich zatwierdzeń.
źródło
git revert COMMIT_HASH
Począwszy od git v2.23 , masz inną opcję:
git restore --staged -- <file>
źródło