当我运行$ git checkout --detach时,我知道引擎盖下发生了什么。而在master上,当我$ git checkout --detach时,我的.git/HEAD不是指向ref: refs/heads/master,而是指向一个散列(与refs/heads/master相同)。当我真的想这么做的时候,用例是什么?
$ git checkout --detach
master
.git/HEAD
ref: refs/heads/master
refs/heads/master
gwbalxhn1#
根据commit that introduced the flag:例如,在进行临时合并以测试两个主题是否能够很好地协同工作时,可以使用此方法。我猜这个想法是故意分离允许您再进行一些提交,而这些提交在完成后(以及在GC运行后)将被丢弃。注意,这个标志实际上并不添加任何新功能;您可以使用git checkout some-branch^0获得相同的结果。
git checkout some-branch^0
rdrgkggo2#
tl; dr: checkout 已经在另一个工作树中 checkout 的分支是非法的。输入git checkout --detach master现在,为了更清楚地解释如何达到这种情况,下面是我个人如何使用git checkout --detach的一个真实示例。我正在开发一个程序,叫做midimap,我也有一个稳定的长期运行的进程在后台。为此,我使用了两个worktrees、~/vc/github.com/fossegrim/midimap(在此称为DEV)用于开发,~/vc/github.com/fossegrim/midimap-stable(在此称为STABLE)用于长期流程。当我启动我的计算机时,我在STABLE中运行midimap程序,并在DEV中打开GNU Emacs。当我在DEV中处理我的项目时,我最终会到达一个点,我想更新USAGE工作树以包含DEV的更改。因为 checkout 一个已经在另一个工作树中 checkout 的分支是非法的。我必须用另一种方法 checkout 它:git checkout --detach master.
git checkout --detach master
git checkout --detach
~/vc/github.com/fossegrim/midimap
~/vc/github.com/fossegrim/midimap-stable
tmb3ates3#
当您选择 checkout 一个提交哈希,或者使用--detach checkout 一个分支时,任何提交都不会属于某个特定的分支。因此,在测试某些东西时,拥有一个分离的头(就像这个场景所称的那样)是很有用的。参考文献:
8iwquhpp4#
当您在多开发人员环境中工作时,您可能会遇到这样的情况:在代码评审期间,您希望尝试某些代码更改,以便更好地了解其他开发人员所做的工作,从而提供更好的反馈。您添加的任何提交都挂起在void中,实际上并没有添加到任何分支中。另一个开发人员随后调整代码并推送新的提交。在这之后,您只需执行一次获取和 checkout --再次分离原始分支,而不必显式地丢弃任何内容或解决合并冲突。你实际上也没有在本地提取分支,所以在你完成代码评审之后,你不需要删除分支(或者你添加的提交)。
命令git checkout origin/master --detach允许你 checkout 分支指向的提交,而不需要提取和跟踪分支本身。当你 checkout 另一个分支时,你所做的任何修改和创建的提交都将被自动丢弃(包括“分支”本身),而不需要手动删除它们。
git checkout origin/master --detach
4条答案
按热度按时间gwbalxhn1#
根据commit that introduced the flag:
例如,在进行临时合并以测试两个主题是否能够很好地协同工作时,可以使用此方法。
我猜这个想法是故意分离允许您再进行一些提交,而这些提交在完成后(以及在GC运行后)将被丢弃。
注意,这个标志实际上并不添加任何新功能;您可以使用
git checkout some-branch^0
获得相同的结果。rdrgkggo2#
tl; dr: checkout 已经在另一个工作树中 checkout 的分支是非法的。
输入
git checkout --detach master
现在,为了更清楚地解释如何达到这种情况,下面是我个人如何使用
git checkout --detach
的一个真实示例。我正在开发一个程序,叫做midimap,我也有一个稳定的长期运行的进程在后台。
为此,我使用了两个worktrees、
~/vc/github.com/fossegrim/midimap
(在此称为DEV)用于开发,~/vc/github.com/fossegrim/midimap-stable
(在此称为STABLE)用于长期流程。当我启动我的计算机时,我在STABLE中运行midimap程序,并在DEV中打开GNU Emacs。当我在DEV中处理我的项目时,我最终会到达一个点,我想更新USAGE工作树以包含DEV的更改。
因为 checkout 一个已经在另一个工作树中 checkout 的分支是非法的。我必须用另一种方法 checkout 它:
git checkout --detach master
.tmb3ates3#
当您选择 checkout 一个提交哈希,或者使用--detach checkout 一个分支时,任何提交都不会属于某个特定的分支。
因此,在测试某些东西时,拥有一个分离的头(就像这个场景所称的那样)是很有用的。
参考文献:
8iwquhpp4#
当您在多开发人员环境中工作时,您可能会遇到这样的情况:在代码评审期间,您希望尝试某些代码更改,以便更好地了解其他开发人员所做的工作,从而提供更好的反馈。
您添加的任何提交都挂起在void中,实际上并没有添加到任何分支中。
另一个开发人员随后调整代码并推送新的提交。
在这之后,您只需执行一次获取和 checkout --再次分离原始分支,而不必显式地丢弃任何内容或解决合并冲突。
你实际上也没有在本地提取分支,所以在你完成代码评审之后,你不需要删除分支(或者你添加的提交)。
简而言之
命令
git checkout origin/master --detach
允许你 checkout 分支指向的提交,而不需要提取和跟踪分支本身。当你 checkout 另一个分支时,你所做的任何修改和创建的提交都将被自动丢弃(包括“分支”本身),而不需要手动删除它们。