git checkout commit-name和git checkout branchname有什么区别

时间:2017-07-17 06:32:13

标签: git gitlab

如果我们签出提交名称而不是分支名称会怎样?

4 个答案:

答案 0 :(得分:2)

我不同意那些说“他们是相同的”或“没有坏事”的评论。

它们在一个重要方面明显不同。 antak在一篇文章中正确地描述了它,但我想强调潜在的危险,即你可能会忘记新的提交。

如果通过分支签出,则分支指针将指向提交,下次提交时,将添加新提交,并且分支指针将随之移动。这通常是人们想要发生的事情。

如果您只是通过提交签出,然后进行新提交,那么您没有指向该新提交的分支。只有HEAD指向它。

如果您此时要结帐其他分支,您可能会忘记新的提交。 (如果你不知道像ref-log这样的特殊事情,你就会忘记它。)

正如antak指出的那样,你可以进行新的提交,然后在那时创建一个分支,但是如果你不知道原始问题的答案那么你可能不知道该怎么做,对吧?

Nutshell:除非你有特殊的理由不这样做,否则你通常想要结帐。

答案 1 :(得分:1)

简而言之,一切都不会发生。签出branch更容易,让您及时了解最新信息(即最新commit)。通过commit签出可能 <或em> 将您置于分支机构的最新状态之后。

git checkout <branch>将在其最新提交时签出<branch>,即HEAD将指向该分支的最后一次提交。

git checkout <commit>有点不同。如果签出<commit>,您可能会指向最新的提交,因此您将与HEAD同步。 但是你也可以checkout以前的提交,这会让你处于detached HEAD状态,即HEAD指向你的git历史记录中的不同提交(最有可能是最新的)。您也可以重置HEAD,以指向您已签出的当前提交。

您通常应该<branch>结帐,因为您始终知道您拥有最新版本的分支(除非有上游更改,否则您应该git pull)。

Heregit checkout的文档,如果您想了解更多信息。

答案 2 :(得分:1)

checkout <commit>checkout <branch>都是相同的,因为它们会对工作树中的文件和目录进行必要的更改,以使其最终看起来与提交记录的文件状态相同由<commit><branch>参数指定。

除此之外,后者(<branch>)还设置您指定为活动分支的任何分支。通过这样做,它完成了&#34;在分支上的概念&#34;。

分支只是一个赋予提交的可移动标签,它会自动移动到您提交的任何新提交。这些标签使提交更易于管理和记忆。

checkout <commit>可能会让您进入detached state。在这种状态下,您无法获得自定义标签。但是您可以创建提交并在之后的该位置创建新分支。除了未被分支(或标签)标记的提交最终将在garbage collected之后获得{{3}}之外,无论是否处于独立状态的工作都是个人偏好和/或方便的问题。

答案 3 :(得分:0)

简单地git checkout branch_name将带您进入该分支的最新提交,因为您将提交其名称提交到提交。