为什么git不能通过路径进行硬/软复位?

$ git reset -- <file_path>可以通过路径重置。

但是,$ git reset (--hard|--soft) <file_path>将报告如下错误:

Cannot do hard|soft reset with paths.
yao asked 2019-07-10T10:44:53Z
6个解决方案
113 votes

因为没有意义(其他命令已经提供了该功能),并且它减少了偶然做错事的可能性。

A&#34;硬重置&#34; 路径刚刚用git reset -- <path>(签出文件的现有版本)完成。

路径的软复位没有意义。

路径的混合重置是git reset -- <path>

Amber answered 2019-07-10T10:45:33Z
18 votes

您可以使用git reset完成您尝试执行的操作。

也就是说,提供的错误消息对我没有意义(因为git reset在子目录上运行得很好),我认为没有理由为什么git reset --hard不应该完全按照您的要求进行操作。

Aaron Kent answered 2019-07-10T10:46:07Z
8 votes

问题如何已经回答,我将解释为什么部分。

那么,git reset会做什么? 根据指定的参数,它可以做两件事:

  • 如果指定路径,它会将索引中的匹配文件替换为提交中的文件(默认情况下为HEAD)。 这个动作根本不会影响工作树,通常用作git add的反面。

  • 如果您没有指定路径,它会将当前分支头移动到指定的提交,并且可以选择将索引和工作树重置为该提交的状态。 此附加行为由mode参数控制:
    --soft:不要触摸索引和工作树。
    --mixed(默认值):重置索引但不重置工作树。
    --hard:重置索引和工作树。
    还有其他选项,请参阅完整列表的文档和一些用例。

    如果您没有指定提交,则默认为HEAD,因此git reset --soft将不执行任何操作,因为它是将头部移动到HEAD(到其当前状态)的命令。 另一方面,git reset --hard由于其副作用而有意义,它表示将头移至HEAD并将索引和工作树重置为HEAD。

    我认为现在应该清楚为什么这个操作本身不适用于特定文件 - 它的目的是首先移动分支头,重置工作树,索引是辅助功能。

user answered 2019-07-10T10:48:01Z
0 votes

说明

git reset [<mode>] [<commit>]手册列出了3种调用方式:

  • 2是文件方式:这些不影响工作树,但仅对git reset [<mode>] [<commit>]指定的索引中的文件进行操作:

    • git reset [<mode>] [<commit>]
    • git reset [<mode>] [<commit>]
  • 1是提交方式:对引用的git reset [<mode>] [<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>

(助记符号为recoreset&amp;&amp; checkout)

Tom Hale answered 2019-07-10T10:50:50Z
0 votes

这背后有一个非常重要的原因:git reset -- <files>--hard的原则。

在Git术语中,结帐意味着&#34;带入当前的工作树&#34;。 使用git reset -- <files>,我们可以使用来自任何区域的数据填充工作树,无论是来自存储库中的提交还是来自提交或临时区域的单个文件(这是默认的)。

反过来,git reset没有这个角色。 顾名思义,它将重置当前的ref,但始终将存储库作为源,而不是&#34;到达&#34; (--soft,--mixed或--hard)。

概括:

  • checkout:从任何地方(索引/ repo提交) - &gt; 工作树
  • 重置:回购提交 - &gt; 覆盖HEAD(以及可选的索引和工作树)

因此,可能有点令人困惑的是git reset -- <files>的存在,因为&#34;覆盖HEAD&#34; 只有一些文件没有意义!

在没有官方解释的情况下,我只能推测git开发人员发现git reset -- <files>仍然是丢弃对暂存区域所做更改的命令的最佳名称,并且鉴于唯一的数据源是存储库,那么&#34 ;让我们扩展功能&#34; 而不是创建一个新命令。

所以git reset -- <files>已经有点特殊:它不会覆盖HEAD。 恕我直言所有这些变化将是例外。 即使我们可以设想--hard版本,其他人(例如--soft)也没有意义。

F Pereira answered 2019-07-10T10:52:47Z
-1 votes

git reset --soft HEAD~1 filename撤消提交,但更改仍保留在本地。 filename可以是 - 对于所有提交的文件

Peiti Li answered 2019-07-10T10:53:35Z
translate from https://stackoverflow.com:/questions/11200839/why-git-cant-do-hard-soft-resets-by-path