git - 为什么在分离状态下使用 `git commit`?

标签 git

使用 git log 我发现了我想要处理的项目的旧版本。我执行了 git checkout version52 导致项目处于“分离”状态,进行了一些更改,然后对它执行了 git commit。我没有意识到这会在分离状态下提交。

在此之后,我使用 git checkout master 返回到我的 master,但是当我执行 git log 时,我的更改不再显示。我现在意识到更改停留在我的 version52 中。

我可以使用 git merge version52 轻松应用这些更改,但我只是想知道,能够在 git 中以分离状态提交有什么意义?作为新手,这让我困惑了一段时间,我不明白为什么允许这样做,或者何时使用这样的功能。

编辑:抱歉,我之前写过“断开连接”,但我的意思是“分离”。在 git 中,当您决定查看以前 checkin 的项目版本时,就会发生这种情况。

最佳答案

为了将来,你应该创建一个分支来工作

git branch branchName version52
git checkout branchName

git checkout -b brannchName version52

评论后编辑

我写过的 git 对象模型 here ,简单地跟踪对象树。分支是指向提交的指针。尽管这两者是相关的,但您不必有一个分支指向一行提交的末尾。

当您创建一个提交时,您仍然在创建一个对象树,该树将存在于存储库中,直到它变旧并且您运行 git-gc 来清理这些孤立的提交。我认为您担心的是没有强制要求在分支机构中进行提交。这在有时吸引用户的工具中创造了灵 active ,但 git 是一种高级工具。

在你的例子中,你做了一个提交,然后回到你的主分支,你认为你已经丢失了你的提交,但是如果你查看了 git reflog 的输出你会看到你创建的提交的 sha,即使它不在分支上。您可以通过 git branch branchName <sha of commit> 在此处创建一个分支.或者您可以将这些提交与另一个分支 merge 或重新定位到另一个分支,而无需为此创建和删除分支的额外步骤。好的,这只是几个额外的步骤,只需几次按键;但它在少数情况下很有用。

问题在于,分支只是提交树的简写,就像标记是特定提交的简写一样。除了当您在分支上进行提交时,分支指针会随着最新的提交而移动。

总是有 head指向最新提交的指针,您已 checkout ,因此您永远不会真正“断开连接”

关于git - 为什么在分离状态下使用 `git commit`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4469436/

相关文章:

git - Gerrit 项目未复制到 bitbucket,错误 : channel is not opened

git - 用于脚本编写的 haskell 中的表达式评估模式

git - 从 git 中删除历史记录 - git 命令失败

git - 我可以使用 Github 存储库作为 Docker 镜像的来源吗?

linux - 使用 Linux 和 Windows 时最好的 git 配置设置是什么?

git - 'Poll SCM' Jenkins 功能如何知道存储库和分支轮询?

git - 在 satis 仓库中使用本地仓库

Git 历史 - 通过关键字查找丢失的行

java - Maven Release Plugin 在 git push 时挂起

ruby-on-rails - 如何在执行 git pull 时忽略 Github 上的文件