Dlaczego git nie może resetować twardych / miękkich ścieżek?
$ git reset -- <file_path>
można zresetować według ścieżki.
Jednak $ git reset (--hard|--soft) <file_path>
zgłosi błąd jak poniżej:
Cannot do hard|soft reset with paths.
7 answers
Ponieważ nie ma sensu (inne komendy już zapewniają tę funkcjonalność), a to zmniejsza możliwość zrobienia niewłaściwej rzeczy przez przypadek.
"twardy reset" ścieżki jest wykonywany za pomocą git checkout HEAD -- <path>
(sprawdzanie istniejącej wersji pliku).
Miękki reset ścieżki nie ma sensu.
Mieszany reset ścieżki jest tym, co robi git reset -- <path>
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-24 02:34:43
Możesz osiągnąć to, co próbujesz zrobić używając git checkout HEAD <path>
.
To powiedziawszy, podany komunikat o błędzie nie ma dla mnie sensu (ponieważ git reset
działa dobrze na podkatalogach) i nie widzę powodu, dla którego git reset --hard
nie powinien robić dokładnie tego, o co prosisz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-22 21:30:26
Pytanie Jak jest już odpowiedział , wyjaśnię Dlaczego część.
Więc co robi git reset ? W zależności od podanych parametrów może robić dwie różne rzeczy:
Jeśli określisz ścieżkę, zastąpi ona dopasowane pliki w indeksie plikami z zatwierdzania (domyślnie nagłówek). Ta akcja w ogóle nie wpływa na działające drzewo i jest zwykle używana jako przeciwieństwo git add.
-
Jeśli nie określa ścieżkę, przenosi bieżącą gałąź do określonego commita i, wraz z , opcjonalnie resetuje indeks i drzewo robocze do stanu tego commita. To dodatkowe zachowanie jest kontrolowane przez parametr mode:
--soft: nie dotykaj indeksu i Drzewa roboczego.
--mixed (domyślnie): resetuje indeks, ale nie drzewo robocze.
--hard : zresetuj indeks i drzewo robocze.
Są też inne opcje, pełna lista i niektóre przypadki użycia znajdują się w dokumentacji.Jeśli nie podasz commita, domyślnie jest to HEAD, więc
git reset --soft
nic nie zrobi, ponieważ jest to polecenie do przeniesienia head do HEAD (do aktualnego stanu).git reset --hard
, z drugiej strony, ma sens ze względu na jego skutki uboczne , mówi przesuń głowę do głowy i zresetuj indeks i drzewo robocze do głowy.Myślę, że powinno być już jasne, dlaczego ta operacja ze swej natury nie dotyczy konkretnych plików - ma on na celu przede wszystkim przesunięcie głowicy gałęzi, zresetowanie drzewa roboczego, a indeks jest funkcją drugorzędną.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-11 15:55:30
Kryje się za tym bardzo ważny powód: Zasady checkout
i reset
.
W języku Git, checkout oznacza "wprowadzenie do bieżącego drzewa roboczego". I za pomocą git checkout
możemy wypełnić drzewo robocze danymi z dowolne Obszar, czyli z commita w repozytorium lub pojedynczych plików z commita lub strefy przejściowej (która jest parzystą wartością domyślną).
Podsumowanie:
- checkout: z dowolnego miejsca (index / repo commit) - > working tree
- reset: Repo commit - > Overwrite HEAD (i opcjonalnie indeks i drzewo robocze)
Dlatego to, co może być nieco mylące, to istnienie git reset COMMIT -- files
, ponieważ "nadpisywanie głowy" tylko niektórymi plikami nie ma sensu!
Z powodu braku oficjalnego wyjaśnienia, mogę tylko spekulować, że deweloperzy Gita stwierdzili, że reset
to wciąż najlepsza nazwa polecenia do odrzucania zmian wprowadzonych w staging area i, biorąc pod uwagę, że jedynym źródłem danych było repozytorium, to " rozszerzmy funkcjonalność " zamiast tworzyć nowe polecenie.
Więc jakoś git reset -- <files>
jest już trochę wyjątkowy: nie nadpisze głowy. IMHO wszystkie takie wariacje byłyby wyjątkami. Nawet jeśli możemy wyobrazić sobie wersję --hard
, inne (na przykład --soft
) nie mają sensu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-12 22:20:04
Upewnij się, że umieścisz ukośnik między origin lub upstream (source) a rzeczywistą gałęzią:
git reset --hard origin/branch
Lub
git reset --hard upstream/branch`
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-28 03:15:13
Wyjaśnienie
The git reset
Instrukcja wymienia 3 sposoby wywołania:
-
2 są plikami: nie wpływają one na drzewo robocze , ale działają tylko na plikach w indeksie określonym przez
<paths>
:git reset [-q] [<tree-ish>] [--] <paths>..
git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]
-
1 jest commit-wise: działa na wszystkich plikach w odwołanym
<commit>
i może wpływać na działanie drzewo:git reset [<mode>] [<commit>]
Nie ma trybu wywołania, który działa tylko na określonych plikach i wpływa na drzewo robocze.
Obejście
If you want to both:
- Zresetuj wersję indeksu / pamięci podręcznej pliku(ów) W tym celu należy sprawdzić, czy plik (y) jest zgodny z indeksem i wersją zatwierdzania.]}
Możesz użyć tego aliasu w pliku konfiguracyjnym git:
[alias]
reco = !"cd \"${GIT_PREFIX:-.}\" && git reset \"$@\" && git checkout \"$@\" && git status --short #" # Avoid: "fatal: Cannot do hard reset with paths."
Można wtedy zrobić jeden of:
$ git reco <paths>
$ git reco <branch/commit> <paths>
$ git reco -- <paths>
(Mnenonic for reco
: re
set & & c
heck o
ut)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 12:27:09
Git reset --soft HEAD~1 nazwa pliku cofa zatwierdzenie, ale zmiany pozostają w trybie lokalnym. nazwa pliku może być -- dla wszystkich zgłoszonych plików
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-25 21:21:11