当我运行git checkout branch_name时,Git实际上做了什么?

时间:2017-10-31 13:09:26

标签: git github gitlab

我有一个名为test-repo的存储库。

现在,我在该存储库上有两个分支,名为:

  1. 主BKP
  2. 两个分支只包含一个名为test.txt的文件。

    master中的

    test.txt包含

    hello I am here
    

    和master-bkp中的test.txt包含

    hello I am there
    

    现在,在我的本地存储库中,我写道:

    git checkout master
    git merge master-bkp
    

    现在test.txt包含

    hello I am here
    hello I am there
    

    当我触发这两个命令时,有人可以解释Git如何在内部工作吗?

    git checkout master
    git checkout master-bkp
    

    注意:请不要就git checkout发表意见,我需要解释其背后的内部逻辑。

1 个答案:

答案 0 :(得分:2)

Git checkout有详细记录,这来自doc:

  

更新工作树中的文件以匹配索引中的版本或   指定的树。如果没有给出路径,git checkout也会   更新HEAD以将指定的分支设置为当前分支。

因为我知道你可以在这里阅读文档是我如何看待它。 Git是一个修订控制系统,它提供了许多工具来管理您的代码历史记录。由于你有很多分支,我会假设你正确理解它们是如何工作的。 Checkout只是您用于移动到其他分支的命令。主要目标是更新工作树中的文件,以便获取与某个分支关联的数据。

幕后花絮

没有魔力。它是否在文档中说它只更新HEAD所以你在正确的分支上。就是这个。另外,正如@ quetzalcoatl指出的那样,重要的是要知道git checkout执行变更检测,禁止更改分支,同时执行未完成的工作。因此,执行git checkout可视为'安全'

注意

有时初学者很难理解git checkoutgit reset之间的区别,即使它们完全不同。在我看来,最简单的方法是:

您想要更新什么内容?

如果答案是我当前的分支,请阅读git reset上的文档。如果您的目标是根据其他分支更新工作树,那么git checkout就是您正在寻找的。

此声明只有一个例外。如果您的目标是覆盖一个文件,则可以使用git checkout,请查看此answer