Git提交没有分支的标记

时间:2008-12-14 02:36:18

标签: git branch tags commit

如果我在没有创建分支的情况下检查我的源代码的标记版本,Git表示我根本没有与任何分支相关联。我很高兴让我做出改变并检查它们。这些变化在哪里?如果我切换回'master',它们就会消失(被master中的东西覆盖),我似乎无法再找到它们。是什么赋予了?如果Git让我对基本上是匿名的分支进行更改,那么我肯定可以让它们回来吗?

4 个答案:

答案 0 :(得分:79)

由于您的提交不在任何分支上,除非您使用其SHA1签出该特定提交,否则无法在工作目录中看到它。您可以通过查看reflog来查找提交,该XXX跟踪您从回购中检出的内容的更改。如果您的代码为$ git reflog 7a30fd7... HEAD@{0}: checkout: moving from master to XXX ddf751d... HEAD@{1}: checkout: moving from 96c3b0300ccf16b64efc260c21c85ba9030f2e3a to master 96c3b03... HEAD@{2}: commit: example commit on tag XXX, not on any branch 7a30fd7... HEAD@{3}: checkout: moving from master to XXX ,您会看到以下内容:

checkout

它告诉你SHA1你需要$ git checkout 96c3b03 Note: moving to "96c3b03" which isn't a local branch If you want to create a new branch from this checkout, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new_branch_name> HEAD is now at 96c3b03... example commit on tag XXX, not on any branch $ git checkout -b newbranch $ git branch #lists all branches feature1 master * newbranch 才能在工作目录中看到你的提交。

checkout

这一切对我来说似乎有些奇怪,直到我意识到git {{1}}将所有项目文件作为特定提交放入我的文件系统(工作目录)。实际上,工作目录充当本地Git存储库上的浏览器。因此,您的更改尚未在存储库中被覆盖,当您签出主文件时,它们就不会显示在您的工作目录中。

答案 1 :(得分:8)

是的,他们会在reflogs中。

您可以随时命名分支:

git checkout -b my-branch-name

答案 2 :(得分:5)

或者,您可以通过查找SHA1(使用上面的git reflog)然后执行以下命令将提交合并回master而不使用新分支:

git checkout master
git merge SHA1

答案 3 :(得分:0)

要回答第二个问题,你要使用git reset --hard yourtagname

至于会发生什么,你基本上将你的分支分叉到标记名并保持在同一个分支上。你在旧叉子里的提交仍在那里......他们很难看到。您可能必须使用reflog来查找旧的fork。