Git checkout with dot

53
以下是以下git命令之间的区别:
git  checkout branch
git  checkout branch .
git  checkout  .  #<-- used at the branch

为什么当我将不同的分支检出到不同的文件夹时,第一个分支会丢失一些文件,但是使用第二个命令时,一切都正常?

这不是在“分支”中使用的。只有当第一个参数实际上命名了一个分支时,它才被视为分支,而 . 并没有。所以它只是路径。只有当你说 git checkout . -- 时,它才会成为分支,此时 git 会抱怨没有名为 . 的修订版本。 - Jan Hudec
使用第一种形式,您可以将分支检出到当前工作副本中。那么,“不同文件夹”是什么意思? - Jan Hudec
我的意思是,例如我有两个分支。第一个会成功检出,但第二个会缺少一些文件。但如果我使用第二行,一切都会没问题。 - Laser
2个回答

76
当给定路径说明符时,git checkout(1)的功能与仅给定分支说明符时截然不同。
1. 只使用分支说明符git checkout branch)会将当前工作目录切换到指定的分支,并尝试在可能的情况下保留本地更改,否则失败。如果您已经在branch上,则不会有任何操作。它只修改工作目录中在HEADbranch之间有差异的文件,并且如果其中任何一个具有本地修改(已索引或未索引),则会失败。
2. 使用路径说明符将覆盖所有匹配的文件(所有文件都匹配.)以指定的内容为准: - 仅使用路径说明符git checkout .)会从索引中写入内容,即撤消未暂存的本地修改。要撤消已暂存的修改,请使用带有路径说明符的git reset。 - 同时使用分支和路径说明符git checkout branch .)会在指定的修订版中写入内容。它不会修改HEAD指向的位置,因此如果branchHEAD不同,则之后会有未暂存的更改。
请注意,手册区分使用-b/--branch选项和-p/--patch选项的其他情况,但这些大多是上述情况的简单扩展。

2
@Pepelac:在man页面中就有,谷歌在第一页的结果中找到了几个版本。你试过吗? - Jan Hudec

21
上面的解释很好,但让我举例说明。
`git checkout` 可以用于文件夹和分支。
假设有一个 `index.html` 文件和 `dev` 文件夹。
如果我不小心更改了 `index.html` 并想撤销更改,我只需运行 `git checkout index.html` 。它会将我的文件恢复到原始状态。
现在假设我在 `dev` 文件夹中进行了一些更改,并希望将这些更改还原到 `dev` 文件夹中。如果我使用 `git checkout dev` ,并且如果存在任何 `dev` 分支,则会检出该 `dev` 分支而不是名为 `dev` 的文件夹。
因此,我会运行以下命令 `git checkout -- dev`。
现在这个裸的双破折号代表当前分支。因此,上面的命令正在向 git 请求,请从当前分支中提供名为 'dev' 的文件夹。
让我们谈谈您的用例。
`git checkout branch` 这个命令会简单地切换到名为 'branch' 的分支
`git checkout branch .` 第二个命令将告诉 git,请从名为 'branch' 的分支中检出或当前文件夹名称。
`git checkout . #<--用于分支` 正如您所说,首先使用 `git checkout branch` 切换到名为 'branch' 的分支,然后只需执行 `git checkout .`。现在没有名为 `.` 的分支,因此它将简单地从当前分支中拉取当前文件夹名称。

2
现在这个裸的双破折号代表当前分支。所以上面的命令是在请求Git从当前分支中提供名为“dev”的文件夹。但我认为这个说法不正确,--只是表示选项结束,其后的文本是文件路径。如果没有指定分支,它意味着获取索引中的更改,而不是从“当前分支”中获取(“索引”和“当前分支”之间有区别)。 - lordvcs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接