当 head 为“*(从 <tag> 分离)”时如何提交对分支的更改

How to commit changes to a branch when head is "* (detached from <tag>)"

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

我会在你所在的地方创建一个分支,提交你的更改,检出 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

How do I [...] reattach the head where it was detached from [...]?

git branch 的输出是

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

表示您已经 运行 git checkout <tag>。你的情况是这样的

HEAD 指向的不是分支,而是直接 提交(标签 <tag> 也指向的提交,但这不是重点) : 您处于 detached-HEAD 状态。要重新附加 HEAD,您需要使其指向一个分支,您可以通过 运行ning

git checkout <branch-in-question>

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

在这里,你应该运行

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

解决由于最后一条命令引起的任何冲突。在我上面的示例中,您的回购协议将如下所示,

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

除了 , it's worth noting that git records HEAD updates in git's 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 以达到我当前的 "detached HEAD" 状态。这里 v2.2.1 是一个标签。要回到我之前所在的分支,我可以简单地观察到 reflog 说我移动了 "from master",所以我只需要:

git checkout master

我会回到分支机构。

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