如果我在没有创建分支的情况下检出标记版本的源代码,Git会指示我与任何分支都没有关联。它很高兴让我进行更改并将其提交。那些更改去哪了?如果我切换回'master',它们就消失了(被master中的内容覆盖),我似乎无法再找到它们。为什么呢?如果Git允许我对实质上是匿名分支的内容进行提交更改,我肯定可以找回它们的。
$ 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
checkout
命令会将项目文件夹中的所有文件以某个提交时的状态放入我的文件系统(工作目录)中。实际上,工作目录就像是本地Git仓库的浏览器。所以你的更改并没有在仓库中被覆盖,只是当你切换到主分支时,在你的工作目录中没有显示出来而已。是的,它们将出现在reflogs中。
您可以随时像这样为分支命名:
git checkout -b my-branch-name
另外,您还可以将提交合并回主分支,而无需创建新的分支,只需找到其 SHA1(如上所述使用 git reflog),然后执行以下操作:
git checkout master
git merge SHA1
回答第二个问题,您可以使用 git reset --hard yourtagname
至于会发生什么,实际上您在标记名称处分叉了您的分支,并留在同一分支上。旧分叉中的提交仍然存在...只是很难看到。您可能需要使用 reflog 找到旧分叉。
git checkout master
,git merge newbranch
,git branch -d newbranch
和git push
。 - Markus Hedlundgit checkout master
然后git merge 96c3b03
(用git reflog
找到正确的 SHA1 替换)(就像 gjvis 的解决方案 一样)。 - Anthony O.