Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我运行Git checkout branch\u name时,Git实际上做了什么?_Git_Github_Gitlab - Fatal编程技术网

当我运行Git checkout branch\u name时,Git实际上做了什么?

当我运行Git checkout branch\u name时,Git实际上做了什么?,git,github,gitlab,Git,Github,Gitlab,我有一个名为testrepo的存储库 现在,我在该存储库上有两个分支,称为: 主人 主bkp 两个分支只包含一个名为test.txt的文件 master中的test.txt hello I am here hello I am there hello I am here hello I am there 主bkp中的test.txt hello I am here hello I am there hello I am here hello I am there 现在,在我的本地存储

我有一个名为
testrepo
的存储库

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

  • 主人
  • 主bkp
  • 两个分支只包含一个名为
    test.txt
    的文件

    master中的
    test.txt

    hello I am here
    
    hello I am there
    
    hello I am here
    hello I am there
    
    主bkp中的
    test.txt

    hello I am here
    
    hello I am there
    
    hello I am here
    hello I am there
    
    现在,在我的本地存储库中,我写道:

    git checkout master
    git merge master-bkp
    
    现在master中的
    test.txt
    包含

    hello I am here
    
    hello I am there
    
    hello I am here
    hello I am there
    
    有人能解释一下当我触发这两个命令时Git是如何在内部工作的吗

    git checkout master
    git checkout master-bkp
    
    注意:请不要对
    git checkout
    发表意见,我需要解释一下它背后的内部逻辑

    Git有很好的文档记录,这是来自文档:

    更新工作树中的文件以匹配索引或目录中的版本 指定的树。如果没有给出任何路径,git签出也将被删除 更新头以将指定的分支设置为当前分支

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

    幕后

    没有魔法。它在文档中说它只更新
    HEAD
    ,所以你在正确的分支上。就是这样。此外,正如@quetzalcatl所指出的,重要的是要知道,
    git checkout
    执行更改检测,该检测禁止在有未限制工作的情况下更改分支。因此,执行
    git签出可以被认为是“安全的”

    注意

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

    您想更新什么?

    如果答案是我的当前分支,请阅读git reset上的文档。如果您的目标是基于另一个分支更新工作树,那么您需要的是
    git checkout


    这句话只有一个例外。如果您的目标是覆盖一个文件,您可以使用
    git checkout
    ,看看这个。

    您可能至少应该给出一些您对所执行命令的理解。否则,您可能会要求某人从头开始解释有关git的一切。请阅读以下内容:在您描述的场景中,您仅在运行合并之前运行了一次git checkout master。您没有执行git checkout master bkp,甚至一次也没有。请澄清您的最后一个问题,或改进示例,以便我们知道您询问两次签出的原因和背景。另一件事是,您为什么在示例中包含
    merge
    ?您正在询问有关签出的问题。这两个是不相关的。你确定你没有把
    合并
    的效果误认为是
    签出
    的效果吗?我很确定他的问题只是关于
    签出
    ,也许我错了。
    它只更新HEAD
    ,当然也会更新工作副本中的文件以匹配HEAD——在那一刻,如果工作副本中有未提交的更改,它会执行更改检测和非破坏性合并。。所以事实上这里发生了一些事情,这是很好的一点!它缺少更改检测,我将添加它,谢谢<代码> Git签出和Git重置,即使它们完全不同 -考虑<代码> Git签出我的/目录/ FoABAR。CS < /代码>并将其与“代码>签出< /代码>和<代码>重置< /代码>进行比较。checkout的这个角落用例是一个单文件重置,相信我,我已经看到很多git for初学者网站展示了checkout命令的用例,声称从当前或不同版本获取文件的新版本很方便branch@quetzalcoatl我真的很欣赏你的洞察力!但我必须承认我不同意你的第二个评论。我不建议这样处理这种情况。看看这个。根据您的第一条评论更新了答案。Thanks@quetzalcoatl哦,我刚注意到你说了一个文件!我将添加一个链接