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.
 148
Author: user, 2012-06-26

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>.

 152
Author: Amber,
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.

 18
Author: Aaron Kent,
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ą.

 12
Author: user,
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ą).

Z kolei git reset nie ma takiej roli. Jako nazwa wskazuje, że resetuje bieżący ref, ale zawsze mając repozytorium jako źródło, niezależnie od "reach" (--soft, --mixed lub --hard).

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.

 4
Author: F Pereira,
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`
 4
Author: Pascal Nitcheu,
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: reset & & c heck o ut)

 0
Author: Tom Hale,
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

 -2
Author: Peiti Li,
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