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

nat*_*a_m 2 git

在我的存储库中,我abc_想使用以下命令放弃一些更改(假设所有已编辑文件的路径均以开头):

git checkout -- abc_*
Run Code Online (Sandbox Code Playgroud)

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

git checkout - abc_*
Run Code Online (Sandbox Code Playgroud)

看起来该命令没有放弃更改,而是添加了更多要提交的更改-实际上,它添加了几百个文件的名称以其开头abc_(但并非项目中的所有文件都以此类推)。

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

我能找到的所有答案都解释了两个破折号(-)的作用,但我理解这一点。我也相信我理解git checkout分支/树形参数或文件路径的工作原理。我找不到有关单破折号含义的任何信息,但是-破折号也用于指定参数(例如git checkout -b ...),这使搜索此命令成为问题。

Elp*_*Kay 6

此处的单破折号表示先前的活动分支或分离的HEAD。

情况1:

git checkout master
git checkout dev

# here - means master
git checkout -

# here - means dev
git checkout -
Run Code Online (Sandbox Code Playgroud)

情况2:

# detached HEAD
git checkout refs/heads/master
# back to master
git checkout master

# detached HEAD again
git checkout -

# master again
git checkout -
Run Code Online (Sandbox Code Playgroud)

因此,git checkout - abc_*意味着通过替换为先前活动分支或分离的HEAD中的内容来覆盖工作树中的路径(abc_ *)。查看git checkout

  • 另外值得一提的是`git checkout -`是`git checkout @ {-1}`的简写。因此,基本上,您可以运行`git checkout @ {-N}`移至历史记录的第N个分支。 (3认同)
  • 一个相关的事实:bash 中的 cd - 会将您带回之前的位置。[更多详情](https://unix.stackexchange.com/q/3284/265710) (2认同)

axi*_*iac 5

--是一个特殊的参数,它告诉 Git 跟在它后面的参数是路径;之前的那些是别的东西(命令选项、远程名称、分支名称、标签名称等)

-ingit checkout -分支名称-是它的别名"@{-1}",表示前一个当前分支的名称(在git checkout用于更改分支的最后一个命令之前的当前分支的分支)。


Mar*_*oun 5

正如其他人已经回答的那样,git checkout -检查最后一个分支。检查发行说明

@{-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'
Run Code Online (Sandbox Code Playgroud)

现在让我们创建另一个分支,branch_1并修改“test”文件:

$ (master) git checkout branch_1
$ (branch_1) echo 'Hello from branch_1' > test
$ (branch_1) git commit -am 'Hello from branch_1'
Run Code Online (Sandbox Code Playgroud)

如果你现在运行git checkout -,你将回到 master :

$ (branch_1) git checkout -
$ (master)
Run Code Online (Sandbox Code Playgroud)

最后,运行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
Run Code Online (Sandbox Code Playgroud)

  • 感谢发行说明的链接!在第 85 行,`* "git checkout -" 是 "git checkout @{-1}" 的简写。` (2认同)