代码之家  ›  专栏  ›  技术社区  ›  Andrew

Git针对没有分支的标记提交

  •  56
  • Andrew  · 技术社区  · 17 年前

    如果我在没有创建分支的情况下签出标记版本的源代码,Git表示我与任何分支都没有关联。很高兴让我进行更改并将其签入。这些变化将走向何方?如果我切换回“master”,它们就会消失(被master中的内容覆盖),我似乎再也找不到它们了。有什么好处?如果Git允许我提交对本质上是匿名分支的更改,那么我肯定可以把它们取回吗?

    4 回复  |  直到 17 年前
        1
  •  79
  •   Flow Matt McDonald    15 年前

    因为你的 提交不在任何分支上 ,除非使用其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 以便在工作目录中查看您的提交。

    $ 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 放置所有项目文件 关于一个特定的承诺 进入我的文件系统(工作目录)。实际上,工作目录充当本地Git存储库上的浏览器。所以您的更改没有被覆盖 在存储库中 ,当您签出主机时,它们不会显示在您的工作目录中。

        2
  •  8
  •   Dustin    17 年前

    是的,他们将在重播中。

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

    git checkout -b my-branch-name
    
        3
  •  5
  •   gjvis    14 年前

    或者,您可以通过查找其SHA1(如上所述使用git reflog),然后:

    git checkout master
    git merge SHA1
    
        4
  •  0
  •   Clintm    16 年前

    至于会发生什么,您基本上在标记名处分叉分支,并停留在同一个分支上。你在旧叉子里的承诺仍然存在。。。他们只是很难看到。您可能必须使用reflog来查找旧的fork。