Почему git не может выполнять жесткие/мягкие сбросы по пути?



$ git reset -- <file_path> можно сбросить по пути.



, $ git reset (--hard|--soft) <file_path> появляется сообщение об ошибке, как показано ниже:

Cannot do hard|soft reset with paths.
1067   5  

5 ответов:

потому что нет смысла (другие команды уже предоставляют эту функциональность), и это уменьшает вероятность того, что вы случайно сделаете что-то не так.

"жесткий сброс" для пути просто делается с git checkout HEAD -- <path> (проверка существующей версии файла).

мягкий сброс для пути не имеет смысла.

смешанный сброс для пути-это то, что git reset -- <path> делает.

вы можете выполнить то, что вы пытаетесь сделать с помощью git checkout HEAD <path>.

тем не менее, предоставленное сообщение об ошибке не имеет смысла для меня (как git reset отлично работает на подкаталогах), и я не вижу причин, почему git reset --hard не надо делать именно то, что вы от него требуете.

вопрос как уже ответил, я объясню почему часть.

Итак, что же делает git reset делать? В зависимости от заданных параметров, он может делать разные вещи:

  • Если вы укажете путь, он заменит соответствующие файлы в индексе файлами из фиксации (HEAD по умолчанию). Это действие не влияет на рабочую дерева и обычно используется как противоположность git add.

  • Если вы не укажете путь, он переместит текущую головку ветви в указанную фиксацию и,вместе с дополнительно сбрасывает индекс и рабочее дерево в состоянии этого совершить. Это дополнительные поведение контролируется параметром mode:
    --soft: не трогайте индекс и рабочее дерево.
    -- mixed (по умолчанию): сброс индекса, но не рабочий дерево.
    --hard: сброс индекса и рабочего дерева.
    Есть также другие варианты, см. документацию для полного списка и некоторых вариантов использования.

    когда вы не указываете фиксацию, по умолчанию используется HEAD, поэтому git reset --soft ничего не будет делать, так как это команда для перемещения голова к голове (в ее нынешнем состоянии). git reset --hard, С другой стороны, имеет смысл из-за его побочные эффекты, Он говорит двигать голову к голове и сброс индекса и рабочее дерево в голову.

    Я думаю, что теперь должно быть ясно, почему эта операция не предназначена для конкретных файлов по своей природе - она предназначена для перемещения головки ветви в первую очередь, сброса рабочего дерева и индекса вторичной функциональности.

объяснение

The git reset руководство перечисляет 3 способа вызова:

  • 2 являются файловыми:они не влияют на рабочее дерево, но работать только с файлами в индексе, указанном <paths>:

    • git reset [-q] [<tree-ish>] [--] <paths>..
    • git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]
  • 1 является commit-wise: работает на все файлы в указанной <commit>, и мая влияет на рабочее дерево:

    • git reset [<mode>] [<commit>]

нет режима вызова, который работает только с указанными файлами и влияет на рабочее дерево.

решение

если вы хотите:

  • сброс индекса / версии кэша файла(ов)
  • Проверьте файл (ы) (т. е. сделайте рабочее дерево соответствующим индексу и зафиксируйте версия)

вы можете использовать этот псевдоним в вашем файле конфигурации git:

[alias]
  reco   = !"cd \"${GIT_PREFIX:-.}\" && git reset \"$@\" && git checkout \"$@\" && git status --short #"  # Avoid: "fatal: Cannot do hard reset with paths."

вы можете сделать один из:

$ git reco <paths>

$ git reco <branch/commit> <paths>

$ git reco -- <paths>

(Mnenonic для reco:re set &&cчертo ut)

git reset --мягкая головка~1 filename отменить фиксацию, но изменения остаются локальными. filename может быть -- для всех введенных файлов

Comments

    Ничего не найдено.