4

当我第一次开始使用 Git 时,我发现这个checkout命令相当混乱。然而,当我适应了 Git 的版本控制模型时,它开始变得有意义了。现在我不得不向我的同事教 Git,我试图checkout简单地解释一下。我以为我有一个简单的解释(来自文档):

签出工作树的分支或路径

这似乎统一了一些你可以用 checkout 做的事情,对于 Git 新手来说,这似乎是一组多样化的操作:

git checkout .
git checkout HEAD .
git checkout HEAD~2
git checkout feature/update-readme README.md

...除了最后一个,因为这不仅会更新工作目录,还会暂存文件。

我如何理解为什么或何时结帐会导致某些内容暂存而不是仅复制到工作目录中?

4

2 回答 2

6

git checkout实际上总是暂存所有签出的文件。但是,如果您没有指定路径(如前三个示例中所示),您的 HEAD 也将设置为您签出的提交,因此您的阶段与您的 HEAD 相同,即没有要提交的更改。

于 2015-03-03T17:03:15.527 回答
3

我如何理解为什么或何时结帐会导致某些内容暂存而不是仅复制到工作目录中?

从 Git 2.21(2019 年第一季度)开始,您将确切知道 git checkout 何时修改文件(而不是 HEAD 或分支):“ git checkout [<tree-ish>] path...”学会报告已从索引或树中签出的路径数,这使它具有与命令签出分支的情况相同程度的噪声。

请参阅Nguyễn Thái Ngọc Duy ( ) 的提交 0f086e6(2018 年 11 月 13 日(由Junio C Hamano 合并 -- --提交 4084df4中,2019 年 1 月 14 日)pclouds
gitster

checkout:检查路径时打印一些东西

“”的问题之一git checkout是它做了很多不同的事情,当我们不能正确处理歧义时,它可能会特别混淆人们。

帮助解决这个问题的一种方法是告诉用户实际执行了哪种操作。切换分支时,我们总是打印一些东西,除非--quiet

HEAD is now at ..."
Reset branch ..."
Already on ..."
Switched to and reset ..."
Switched to a new branch ..."
Switched to branch ..."

然而,检查路径是无声的

打印一些东西,这样如果我们弄错了用户意图,他们就不会浪费太多时间来发现它

对于剩余的结帐情况,我们现在打印:

Checked out ... paths out of the index
Checked out ... paths out of <abbrev hash>

由于打印 this 的目的是帮助消除歧义,因此仅在缺少"" 时才这样做--

但是:“ git checkout [<tree-ish>] <pathspec>”开始报告最近更新的路径数,但在“ git checkout -m <pathspec>”解决刚刚解决的冲突时给出了相同的消息。
该消息现在将这些未解析的路径与从索引中检出的路径分开报告。

请参阅Nguyễn Thái Ngọc Duy ( )的提交 1d1f689提交 3c5883b(2019 年 2 月 6 日) 。(由Junio C Hamano 合并 -- --提交 87c9831中,2019 年 2 月 9 日)pclouds
gitster

checkout: 分别计算和打印-m路径

0f086e6 开始checkout:在签出路径时打印一些东西 - 2018-11-13),此命令报告从哪个源(从树或从索引)更新了多少路径。
我忘记了还有第三个来源:-m使用时,会重新创建合并冲突(授予,也来自索引,但它不是索引的直接副本)。

分别计算和报告未合并的路径。
有更多更新以避免报告:

Recreated X merge conflicts
Updated 0 paths from the index

第二行是不必要的。虽然如果没有冲突娱乐,我们仍然报告

Updated 0 paths from the index

明确地说,我们并没有真正做任何事情。

于 2019-01-20T23:31:41.677 回答