11

在我的本地 git 分支上按 enter 之前,我错过了 tab 键,我最终执行:

git reset --har

与预期相比

git reset --hard

通常 git 在运行似乎输入错误的命令时会抱怨。我查看了 git reset 的 --help 并没有发现 "h","a","r" 的参数。

它似乎已经运行了硬重置,它实际上运行了什么?或者如果它运行“--hard”,为什么?

附加信息:sylvesterjakubowski$ git --version git 版本 1.7.12.4 (Apple Git-37) #关于山狮。

4

3 回答 3

8

这是根据gitcli文档页面:

许多命令只允许将长选项“--option”缩写为其唯一前缀(例如,如果没有其他名称以“opt”开头的选项,您可以拼写“--opt”来调用“ --option" 标志),但是在编写脚本时应该将它们完全拼写出来;更高版本的 Git 可能会引入一个名称共享相同前缀的新选项,例如“--optimize”,以使过去唯一的短前缀不再唯一。

同样在同一页面上:

支持增强选项解析器的命令接受长选项的唯一前缀,就好像它已完全拼写一样,但请谨慎使用。例如,git commit --amen 的行为就像您键入了 git commit --amend,但只有在更高版本的 Git 引入另一个共享相同前缀的选项之前,这才是正确的,例如 `git commit --amenity" 选项。

所以是的,它跑了git reset --hard

于 2013-08-15T17:25:01.430 回答
3

它没有运行等效的,-h -a -r因为前面有两个破折号,而不是一个。

Git 可能在这里实现了一种算法,以允许您对长标志名称使用最短的唯一匹配。由于git resetstart with没有 long 标志--har,因此它可以将请求视为明确的并继续运行git reset --hard

于 2013-08-15T16:58:23.353 回答
0

根据您的使用情况,不要依赖 parse-options API 提供的缩写选项名称,以保护您免受曾经在命令中唯一的选项的缩写形式在共享相同的新选项时变得非唯一添加前缀。

请参阅提交 b02e7d5(2019 年 4 月 12 日),以及提交 effc2ba提交 c4932b0提交 f6188dc提交 ae0a11c提交 7076e44提交 f927ae6提交 dd605e4(2019 年 3 月 25 日),作者为Johannes Schindelin ( dscho)
(由Junio C Hamano 合并 -- gitster--提交 39e4773中,2019 年 4 月 22 日)

tests: 禁止使用缩写选项(默认)

Git 的命令行解析器支持唯一缩写选项,例如 git init --ba会自动扩展--ba--bare.

对于GIT用户来说,这是日常生活中非常方便的功能,特别是当不可用的情况下。

但是,在 Git 的测试套件中依赖它并不是一个好主意,因为今天是命令行选项的唯一缩写,明天可能不再是唯一的缩写。

例如,如果未来的贡献添加了一个新模式git init --babyproofing并且之前引入的测试用例使用了git init --ba扩展为的事实git init --bare,那么未来的贡献现在必须触及看似不相关的测试,以防止测试套件失败。

因此,默认情况下,让我们在测试套件中禁止缩写选项。

例如:

测试(rebase):拼出--keep-empty选项

该测试希望git rebase使用该--keep-empty选项运行,但它实际上只拼写--keep并信任 Git 的选项解析,以确定这是真实选项的唯一缩写。

然而,Denton Liu 提供了一个补丁系列,其中引入了一个git rebase名为 的新选项--keep-base,这使得这个以前唯一的缩写不唯一。

不管这个补丁系列是否被接受,在我们的测试套件中使用缩写选项实际上是一个不好的做法,因为这些唯一选项名称不能保证在未来保持唯一的问题。

所以我们不要在测试套件中使用缩写选项。

于 2019-04-22T19:16:14.680 回答