使用git log
我发现了一个我想搞砸的项目的旧版本。我做了git checkout version52
导致项目处于“分离”状态,进行了一些更改,然后对其进行了git commit
。我没有意识到这会在一个独立的状态下进行。
在此之后,我使用git checkout master
回到了我的主人,但当我git log
时,我的更改不再出现了。我现在意识到这些变化都停留在我的version52
。
我可以使用git merge version52
轻松地应用这些更改,但我只是想知道,能够在git中以分离状态提交的重点是什么?作为一个新手,这让我困惑了一段时间,我不明白为什么允许,或何时使用这样的功能。
答案 0 :(得分:6)
将来,你应该创建一个分支来解决问题
git branch branchName version52
git checkout branchName
或
git checkout -b brannchName version52
在评论后编辑
我写的关于here的git对象模型只是跟踪一个对象树。分支是指向提交的指针。虽然这两者是相关的,但你不必有一个分支指向一行提交的提示。
当您创建提交时,您仍然在创建存储库中存在的对象树,直到它变旧并运行git-gc来清理这些孤立的提交。我认为你担心的是在分支机构中没有强制要求提交。这为工具创造了灵活性,有时会吸引用户,但git是一种高级工具。
在你的情况下,你做了一个提交,然后回到你的主分支,你以为你丢失了你的提交,但如果你看过git reflog
的输出,你会看到提交的sha即使它不在分支上也会创建。您可以通过git branch branchName <sha of commit>
在此处创建分支。或者您可以将这些提交合并或重新绑定到另一个分支,而无需执行为此创建和删除分支的额外步骤。好吧,所以这只是几个额外的步骤,只需几次按键;但在少数情况下它很有用。
问题在于,分支只是提交树的简写,就像标记是特定提交的简写一样。除了在分支上进行提交时,分支指针随最新提交一起移动。
总有head
指针指向最近一次提交,你已经签出,所以你永远不会'断开'
答案 1 :(得分:3)
单独提交一个独立的头是相当无用的,但它也在交互式变基术期间使用,它允许你重写树的历史,如果你标记一个提交进行编辑。
git在重新定位时达到这样的提交后,它会停止进程并允许您使用git commit --amend
更改此提交,或者甚至像往常一样插入新的提交。最重要的是,这些提交属于没有分支,git status
清楚地显示,所以你承诺一个独立的头。
包括我在内的许多Git用户认为交互式变基是更有用的git功能之一,如果不可能提交分离的HEAD,它将无法工作。