【问题标题】:Why does checkout sometimes stage a file?为什么结帐有时会暂存文件?
【发布时间】:2015-05-04 10:12:42
【问题描述】:

当我第一次开始使用 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 feature/update-readme -- README.md
  • 我只提到这一点是因为-- 将commitRef 与文件名/路径分开更明确,所以我发现这样更清楚。 (事实上​​,您的第二次结帐也可能有一个--。)
  • @LưuVĩnhPhúc 我的问题早于那个问题。它是这个的副本,而不是相反。
  • @KeithPinson 一般规则是keep the one with the better set of answers,而不是旧的

标签: git git-checkout working-directory git-index git-stage


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    参见Nguyễn Thái Ngọc Duy (pclouds)commit 0f086e6(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 [&lt;tree-ish&gt;] &lt;pathspec&gt;”开始报告号码 最近更新的路径,但相同的消息是 当“git checkout -m &lt;pathspec&gt;”解决冲突时给出 刚刚解决了。
    该消息现在将这些未解析的路径与从索引中检出的路径分开报告。

    commit 1d1f689commit 3c5883b(2019 年 2 月 6 日)Nguyễn Thái Ngọc Duy (pclouds)
    (由 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
    

    明确表示我们并没有真正做任何事情。

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2020-11-26
      • 2021-02-21
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多