【发布时间】:2015-03-03 11:10:45
【问题描述】:
我想提交更改并将更改推送到远程,但我与标签分离。如何仅获取标签的名称并形成 git 命令,重新附加与它分离的头部,然后提交并推送到远程?
【问题讨论】:
标签: git git-branch git-push git-commit
我想提交更改并将更改推送到远程,但我与标签分离。如何仅获取标签的名称并形成 git 命令,重新附加与它分离的头部,然后提交并推送到远程?
【问题讨论】:
标签: git git-branch git-push git-commit
我会在您所在的位置创建一个分支,提交您的更改,签出 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
【讨论】:
我如何 [...] 重新连接从 [...] 分离的头部?
git branch 的输出是
* (detached from <tag>)
<possibly other branches...>
表示您已运行git checkout <tag>。你的情况是这样的
HEAD 不是指向一个分支,而是 直接 指向一个提交(标记 <tag> 也指向的那个,但这不是重点):你处于分离状态- HEAD 状态。要重新附加 HEAD,您需要使其指向一个分支,您可以通过运行来做到这一点
git checkout <branch-in-question>
但是,如果您不处于干净的工作状态,Git 通常会阻止您签出分支。这就是stashing 派上用场的地方。藏匿类似于整理办公桌,暂时将桌面上的所有东西都放在抽屉里,以便在以后需要时取回这些东西。
在这里,你应该运行
git stash save
git checkout <branch-of-interest>
git stash pop
解决由于最后一个命令而引起的任何冲突。在我上面的例子中,你的仓库看起来像这样,
在工作树中进行本地更改。然后,您可以暂存这些更改、提交并推送到远程。
【讨论】:
除了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 会丢失我的更改。在这种情况下,提交、存储和/或创建新分支通常是正确的做法。)
【讨论】: