Git提交没有分支的标签

如果我在不创build分支的情况下检出我的源代码的标记版本,Git表明我根本没有与任何分支关联。 很高兴让我做出改变,然后检查他们。 这些变化在哪里? 如果我切换回“主人”,他们消失(被主人的东西覆盖),我似乎无法再find他们。 是什么赋予了? 如果Git允许我对本质上是匿名的分支进行修改,那么我可以把它们还原吗?

由于您的提交不在任何分支上 ,除非您使用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 

这告诉你SHA1,你将不得不checkout ,以便看到你的工作目录提交。

 $ 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 

起初,这对我来说似乎有点奇怪,直到我意识到git checkout将所有项目文件作为特定提交放入我的文件系统(工作目录)。 实际上,工作目录充当本地Git存储库上的浏览器。 因此,您的更改没有被覆盖在存储库中 ,当您检出主服务器时 ,它们只是不会显示在您的工作目录中。

是的,他们会在reflogs。

你可以随时这样命名分支:

 git checkout -b my-branch-name 

或者,您可以通过查找其SHA1(使用上面的git reflog)将提交合并到没有新分支的主服务器,然后:

 git checkout master git merge SHA1 

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

至于会发生什么事情,你基本上把你的分支放在标记名上,并留在同一个分支上。 你在旧叉上的承诺仍然存在……他们很难看清楚。 您可能不得不使用reflog来查找旧的分支。