当我第一次开始使用Git时,我发现checkout
命令非常令人困惑。但是,当我适应Git的版本控制模型时,它开始变得有意义了。现在我不得不向我的同事们教Git,而我正试图简单地解释checkout
。我以为我有一个简单的解释(来自documentation):
签出一个或多个工作树的路径
这似乎统一了一些你可以用结帐做的事情,这对于Git的新手来说似乎是一组多样化的操作:
git checkout .
git checkout HEAD .
git checkout HEAD~2
git checkout feature/update-readme README.md
...除了最后一个,因为这不只是更新工作目录,它会分段文件。
我怎样才能理解为什么或什么时候结账会导致某些事情上演而不是仅仅复制到工作目录中?
git checkout
实际上总是将所有检出的文件分阶段。但是如果您没有指定路径(如前三个示例中所示),您的HEAD也将设置为您检出的提交,因此您的阶段与您的HEAD相同,即没有提交更改。
我怎样才能理解为什么或什么时候结账会导致某些事情上演而不是仅仅复制到工作目录中?
从Git 2.21(2019年第一季度)开始,您将确切知道git checkout何时修改文件(而不是HEAD或分支):“git checkout [<tree-ish>] path...
”学会报告已从索引或树中检出的路径数量 - ish,它给出了与命令检出分支的情况相同程度的噪声。
参见commit 0f086e6撰写的Nguyễn Thái Ngọc Duy (pclouds
)(2018年11月13日)。
(由Junio C Hamano -- gitster
--合并于commit 4084df4,2019年1月14日)
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>
由于打印的目的是为了帮助消除歧义,只有在缺少“
--
”时才这样做。
但是:“git checkout [<tree-ish>] <pathspec>
”开始报告最近更新的路径数量,但是当“git checkout -m <pathspec>
”解决刚刚解决的冲突时,会给出相同的消息。
该消息现在将这些未解析的路径与从索引中检出的路径分开报告。
见commit 1d1f689,commit 3c5883b,Nguyễn Thái Ngọc Duy (pclouds
)(2019年2月6日)。
(由Junio C Hamano -- gitster
--合并于commit 87c9831,2019年2月9日)
checkout
:分别计算和打印-m
路径从0f086e6(
checkout
:在检查路径时打印一些东西 - 2018-11-13),此命令报告从哪个源(从树或从索引)更新了多少路径。 我忘记了第三个来源:当使用-m
时,重新创建合并冲突(也从索引中授予,但它不是索引的直接副本)。分别计算和报告未合并的路径。 还有一些更新可以避免报告:
Recreated X merge conflicts Updated 0 paths from the index
第二行是不必要的。虽然如果没有冲突娱乐,我们仍然会报道
Updated 0 paths from the index
说清楚我们并没有真正做任何事情。