混帐为什么不能用做道路硬/软复位?(Why git can't do hard/soft r

2019-06-25 18:46发布

$ git reset -- <file_path>可以通过路径复位。

然而, $ git reset (--hard|--soft) <file_path>将报告类似下面的错误:

Cannot do hard|soft reset with paths.

Answer 1:

因为没有点(其他命令提供该功能的话),并减少潜在的意外做了错误的事情。

“硬重置”的路径,只是做git checkout HEAD -- <path> (检查出该文件的现有版本)。

对于路径软复位没有意义。

对于路径的混合复位是什么git reset -- <path>一样。



Answer 2:

你可以成就你试图用做什么git checkout HEAD <path>

这就是说,所提供的错误信息是没有意义的,我(作为git reset工作的子目录就好了),我认为没有理由git reset --hard不应该做你问它到底是什么。



Answer 3:

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

那么,是什么混帐复位吗? 根据规定,它可以做两件不同的事情的参数:

  • 如果指定的路径,它取代了(默认为HEAD)与文件索引从提交匹配的文件。 此操作并不影响工作树都和通常用作混帐的相对增加。

  • 如果不指定路径,它会将当前分支头到指定的承诺,并与一起 ,选择地重置索引和工作树中犯下的状态。 这种额外的行为由模式参数控制:
    --soft:不要触摸索引和工作树。
    --mixed(默认):重置索引而不是工作树。
    --hard:重置索引和工作树。
    还有其他选项,请参阅完整列表和一些使用情况的文档。

    当你不指定提交,默认为HEAD,所以git reset --soft不会做任何事情,因为它是移动的头对头的命令(其当前状态)。 git reset --hard ,在另一方面,是有道理的,因为它的副作用 ,它说将磁头移动头部重置索引和工作树头。

    我觉得应该由现在为什么这个操作不是由它的性质特定的文件明确 - 这是为了在第一时间移动分公司负责人,重置工作树和索引是次要功能。



Answer 4:

说明

git reset手动列出调用的3种方式:

  • 2文件明智: 这不影响工作的树 ,但仅限于在由指定的索引中的文件操作<paths>

    • git reset [-q] [<tree-ish>] [--] <paths>..
    • git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]
  • 图1是提交明智:操作上的所有文件中所引用的<commit> ,并且可能会影响工作树:

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

有没有调用的模式才动作指定的文件影响工作树。

解决方法

如果你既想:

  • 重置文件的索引/缓存版本(S)
  • 结帐的文件(S)(即,使工作树匹配指数和提交版本)

您可以在您的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为recore组&& c赫克o UT)



Answer 5:

有背后的一个很重要的原因: 原则checkoutreset

在Git中的术语,指结账 “纳入当前工作树”。 并与git checkout ,我们可以从任何地方使用数据填充工作树,被它承诺在从提交或临时区域 (这是即使是默认值)的存储库或单个文件。

反过来,git的复位没有这个角色。 顾名思义,它会重置当前REF但总是具有独立的“到达”的存储库作为源,(--soft,--mixed或--hard)。

概括:

  • 结账 :从任何地方(索引/回购承诺) - >工作树
  • 复位 :回购提交- >覆盖HEAD(以及可选地索引和工作树)

因此,有什么可以让人有点困惑是存在git reset COMMIT -- files ,因为“覆盖HEAD”,只有一些文件是没有意义的!

在没有一个官方的解释,我只能猜测,git的开发商发现, reset仍然是一个命令丢弃到临时区域和所做的更改的最好的名字,给了我们唯一的数据来源是仓库,然后在“ 让我们延长功能 “,而不是创建一个新的命令。

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



Answer 6:

git的复位--soft HEAD〜1 取消提交,但变化仍留在地方。 文件名可以是-所有COMMITED文件



文章来源: Why git can't do hard/soft resets by path?
标签: git git-reset