我在存储库中做了一些更改(例如,所有已编辑文件的路径都以abc_
开头),我想使用以下命令将其丢弃:
git checkout -- abc_*
但是,我打了一个错字,我只用了一个而不是两个破折号:
git checkout - abc_*
该命令似乎没有放弃更改,而是添加了更多要提交的更改-实际上,它添加了几百个文件的名称以abc_
开头(但不是项目中的所有文件!) 。
我的问题是: 我刚刚做了什么?或者,更准确地说:破折号代表什么?
我能找到的所有答案都解释了两个破折号(-)的作用,但我理解这一点。我也相信我了解git checkout
的工作原理,无论是使用branch / tree-ish参数还是使用文件路径。我找不到有关单破折号含义的任何信息,但是-破折号也用于指定参数(例如git checkout -b ...
),这使搜索此命令变得很麻烦。
答案 0 :(得分:5)
这里的短划线表示上一个活动分支或分离的HEAD。
情况1:
git checkout master
git checkout dev
# here - means master
git checkout -
# here - means dev
git checkout -
情况2:
# detached HEAD
git checkout refs/heads/master
# back to master
git checkout master
# detached HEAD again
git checkout -
# master again
git checkout -
因此git checkout - abc_*
意味着通过替换为先前活动分支或分离的HEAD中的内容来覆盖工作树中的路径(abc_ *)。参见git checkout
答案 1 :(得分:2)
--
是special argument,它告诉Git后面的参数是路径;之前的内容还有其他内容(命令选项,远程名称,分支名称,标记名称等)
-
中的 git checkout -
是branch name。 -
是"@{-1}"
的别名,代表先前的当前分支的名称(该分支是用于更改分支的最后一个git checkout
命令之前的当前分支)。 / p>
答案 2 :(得分:2)
其他人已经回答,git checkout -
检出最后一个分支。检查release notes:
@{-1}
是一种引用您所在的最后一个分支的方法。
这是 不仅在需要对象名称的地方,而且在任何地方都接受 分支名称是预期的,就像您键入分支名称一样。 例如。 “git branch --track mybranch @{-1}
”,“git merge @{-1}
”和 “git rev-parse --symbolic-full-name @{-1}
”将按预期工作。
为了演示发生了什么,让我们尝试以下示例:
$ (master) echo 'Hello from master' > test
$ (master) git commit -am 'Hello from master'
现在让我们创建另一个分支branch_1
并修改“测试”文件:
$ (master) git checkout branch_1
$ (branch_1) echo 'Hello from branch_1' > test
$ (branch_1) git commit -am 'Hello from branch_1'
如果您现在运行git checkout -
,您将回到主目录:
$ (branch_1) git checkout -
$ (master)
最后,运行git checkout - test
将从branch_1
分支中检出测试文件:
$ (master) git checkout - test
Updated 1 path from e2bcb78
$ git diff --cached
@@ -1 +1 @@
-Hello from master
+Hello from branch_1