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