在没有分支的情况下对标签进行Git提交

57
如果我在没有创建分支的情况下检出标记版本的源代码,Git会指示我与任何分支都没有关联。它很高兴让我进行更改并将其提交。那些更改去哪了?如果我切换回'master',它们就消失了(被master中的内容覆盖),我似乎无法再找到它们。为什么呢?如果Git允许我对实质上是匿名分支的内容进行提交更改,我肯定可以找回它们的。
4个回答

79
因为你的提交不属于任何分支,所以除非你使用其SHA1检出该特定提交,否则无法在工作目录中看到它。你可以通过查看reflog来找到该提交,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仓库的浏览器。所以你的更改并没有在仓库中被覆盖,只是当你切换到主分支时,在你的工作目录中没有显示出来而已。

1
自己注意:然后执行 git checkout mastergit merge newbranchgit branch -d newbranchgit push - Markus Hedlund
1
甚至更简单,不需要创建分支:git checkout master 然后 git merge 96c3b03(用 git reflog 找到正确的 SHA1 替换)(就像 gjvis 的解决方案 一样)。 - Anthony O.

8

是的,它们将出现在reflogs中。

您可以随时像这样为分支命名:

git checkout -b my-branch-name

5

另外,您还可以将提交合并回主分支,而无需创建新的分支,只需找到其 SHA1(如上所述使用 git reflog),然后执行以下操作:

git checkout master
git merge SHA1

0

回答第二个问题,您可以使用 git reset --hard yourtagname

至于会发生什么,实际上您在标记名称处分叉了您的分支,并留在同一分支上。旧分叉中的提交仍然存在...只是很难看到。您可能需要使用 reflog 找到旧分叉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接