当 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 创建一个新分支通常是正确的做。)
我想提交更改并将其推送到远程,但我与标签分离。我如何只获取标签的名称并形成 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
解决由于最后一条命令引起的任何冲突。在我上面的示例中,您的回购协议将如下所示,
在工作树中进行本地更改。然后您可以暂存这些更改、提交并推送到远程。
除了 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 创建一个新分支通常是正确的做。)