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

时间:2015-01-05 20:44:05

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

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

3 个答案:

答案 0 :(得分:2)

  

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

git branch的输出

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

表示您已运行git checkout <tag>。您的情况类似于以下

enter image description here

HEAD指向的不是分支,而是直接到提交(标记<tag>也指向的那个,但是在该点旁边):你处于分离-HEAD状态。要重新连接HEAD,您需要将其指向分支,您可以通过运行

来执行此操作
git checkout <branch-in-question>

但是,如果您没有处于干净的工作状态,Git通常会阻止您检查分支机构。这就是stashing派上用场的地方。 Stashing类似于整理你的桌面,暂时将所有东西放在抽屉里,只在需要的时候在后期检索这些东西。

在这里,您应该运行

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

解决由于最后一个命令而产生的任何冲突。在上面的例子中,你的回购将会是这样的,

enter image description here

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

答案 1 :(得分:2)

除了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来了解我当前的&#34;分离的HEAD&#34;州。这里v2.2.1是一个标签。为了回到我之前所处的分支,我可以简单地观察到reflog说我从主人那里移动了#34;所以我只需要:

git checkout master

我将回到分公司主人那里。

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

答案 2 :(得分:1)

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