“ git checkout-...”中的-(单破折号)是什么意思?

时间:2019-06-26 09:54:25

标签: git

我在存储库中做了一些更改(例如,所有已编辑文件的路径都以abc_开头),我想使用以下命令将其丢弃:

git checkout -- abc_*

但是,我打了一个错字,我只用了一个而不是两个破折号:

git checkout - abc_*

该命令似乎没有放弃更改,而是添加了更多要提交的更改-实际上,它添加了几百个文件的名称以abc_开头(但不是项目中的所有文件!) 。

我的问题是: 我刚刚做了什么?或者,更准确地说:破折号代表什么?

我能找到的所有答案都解释了两个破折号(-)的作用,但我理解这一点。我也相信我了解git checkout的工作原理,无论是使用branch / tree-ish参数还是使用文件路径。我找不到有关单破折号含义的任何信息,但是-破折号也用于指定参数(例如git checkout -b ...),这使搜索此命令变得很麻烦。

3 个答案:

答案 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