【问题标题】:How to commit changes to a branch when head is "* (detached from <tag>)"当 head 为“*(与 <tag> 分离)”时如何将更改提交到分支
【发布时间】:2015-03-03 11:10:45
【问题描述】:

我想提交更改并将更改推送到远程,但我与标签分离。如何仅获取标签的名称并形成 git 命令,重新附加与它分离的头部,然后提交并推送到远程?

【问题讨论】:

    标签: git git-branch git-push git-commit


    【解决方案1】:

    我会在您所在的位置创建一个分支,提交您的更改,签出 master,然后将新分支合并到 master。

    git branch my-temporary-branch
    git commit -m "my temp work"
    git checkout master
    git merge my-temporary-branch
    git branch -d my-temporary-branch
    

    【讨论】:

      【解决方案2】:

      我如何 [...] 重新连接从 [...] 分离的头部?

      git branch 的输出是

      * (detached from <tag>)
        <possibly other branches...>
      

      表示您已运行git checkout &lt;tag&gt;。你的情况是这样的

      HEAD 不是指向一个分支,而是 直接 指向一个提交(标记 &lt;tag&gt; 也指向的那个,但这不是重点):你处于分离状态- HEAD 状态。要重新附加 HEAD,您需要使其指向一个分支,您可以通过运行来做到这一点

      git checkout <branch-in-question>
      

      但是,如果您不处于干净的工作状态,Git 通常会阻止您签出分支。这就是stashing 派上用场的地方。藏匿类似于整理办公桌,暂时将桌面上的所有东西都放在抽屉里,以便在以后需要时取回这些东西。

      在这里,你应该运行

      git stash save
      git checkout <branch-of-interest>
      git stash pop
      

      解决由于最后一个命令而引起的任何冲突。在我上面的例子中,你的仓库看起来像这样,

      在工作树中进行本地更改。然后,您可以暂存这些更改、提交并推送到远程。

      【讨论】:

      • 我可以在不引用分支名称且仅引用标签的情况下执行此操作吗?
      • 您似乎误解了一些东西: HEAD 只能附加到分支,不能附加到标签。如果要重新附加 HEAD,则需要在某处指定分支的名称。
      • 如果标签是分支的一个实例,不应该只是标签就足以重新附加头部吗?
      • @Emanegux 不。等等,我正在制作一些图表来解释这一点。
      • @Emanegux:标签不是分支的实例。标签名称只是原始 SHA-1 ID 的别名。分支名称也是原始 SHA-1 ID 的别名,但分支名称有两个额外属性:(1) 允许移动,(2) 使用 @ 允许您“在分支上” 987654330@ 带有分支名称。当您使用第 2 部分时,这会扩充第 1 部分,以便分支名称自动移动到您所做的每个新提交。
      【解决方案3】:

      除了Jubobs' (correct) answer,值得注意的是git记录HEAD在git的reflog中更新HEAD

      您可以简单地运行git reflog(没有额外的参数)来查看类似的内容(您的可能会更长):

      9b7cbb3 HEAD@{0}: checkout: moving from master to v2.2.1
      c5b9256 HEAD@{1}: checkout: moving from maint to master
      c2e8e4b HEAD@{2}: checkout: moving from master to maint
      c5b9256 HEAD@{3}: merge refs/remotes/origin/master: Fast-forward
      c18b867 HEAD@{4}: clone: from git://github.com/git/git
      

      这显示了我在 git 本身的源代码克隆中所做的所有动作。你可以看到我做了一个git checkout maint,然后是git checkout master,然后是git checkout v2.2.1,以达到我当前的“分离HEAD”状态。这里v2.2.1 是一个标签。要回到我之前所在的分支,我可以简单地观察到 reflog 说我从“master”移动,所以我只需要:

      git checkout master
      

      我会回到分支大师。

      (请注意,如果我在这里做了一些新的提交,这将“丢失”它们,除非我可以在 reflog 中再次找到它们。此外,如果我对工作目录进行了更改, git checkout master step 可能会抱怨更改为分支 master 会丢失我的更改。在这种情况下,提交、存储和/或创建新分支通常是正确的做法。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-31
        • 2014-06-04
        • 1970-01-01
        • 2023-04-09
        • 2020-04-29
        • 1970-01-01
        相关资源
        最近更新 更多