【问题标题】:Making a Git push from a detached head从一个分离的头部进行 Git 推送
【发布时间】:2016-06-14 15:36:39
【问题描述】:

我处于一个超然的状态并做了一些改变。我想用 Git 把这些改变推到这个分离的头上。我不希望我的更改进入开发分支,当然也不希望进入主分支。我正在与另一个人一起处理一个文件。

示例分支

   develop
   master
   *(HEAD detached at origin/49792_testMocha)

如何在不影响开发或掌握的情况下推入头部?

【问题讨论】:

  • HEAD 不是你推动(或推动)的东西。它是您当前分支的别名,或者(在本例中)是某个其他分支中最后一次提交之后的无名提交。您需要创建一个分支,以便与其他存储库共享(推送)。

标签: git git-push


【解决方案1】:

如果你处于超然状态,并且想要推送到远程分支

git push origin HEAD:name-of-your-branch

否则你可以创建一个新分支并推送到它(它将自动创建)

git branch new-branch-name
git push -u origin new-branch-name

【讨论】:

  • 太有帮助了,我登录 SO 只是为了支持这个。
  • 如果远程分支尚不存在,我无法使用第一个命令推送。
  • 使用您假设具有相同远程分支的第一个命令。否则你需要创建一个新分支并推送它。
  • 它有效.. 选项推送到远程或推送到新分支的好答案
  • 如果你的远程分支有一个特殊的名字并且你得到这样的消息:错误:无法推送到不合格的目的地:分支名称目的地参考规范既不匹配远程上的现有参考也不以refs/,我们无法根据源 ref 猜测前缀。错误:无法将一些引用推送到 'git@github.com:user/repo.git' 您可以在分支名称前加上 refs/heads:git push origin HEAD:refs/heads/branch-name
【解决方案2】:

使用git checkout -b BRANCH_NAME创建一个新分支

然后将新分支推送到远程:git push origin BRANCH_NAME

【讨论】:

  • @LMS 答案是我们想要的
  • 分支名称是你在 reflog 中看到的吗?
  • @Gray 创建分支后使用git reflog可以看到BRANCH_NAMEBRANCH_NAME 可以是您想要的任何名称。
  • 为了推送到主目录(通常你不会这样做,但如果有人想知道,请注意这里)......一旦我使用上述命令设置到新分支,我必须合并BRANCH_NAME 进入主分支(或你想要的头分支),然后执行 git push ...
【解决方案3】:

虽然这里的所有答案都回答了原始问题(如何在不影响其他分支的情况下从分离的头部推送),但都建议创建一个新分支。

以下是如何在不创建新本地分支的情况下推送到新的远程分支

git checkout --detach # (or anything else that leaves you with a detached HEAD - guillotine anyone?)
[change stuff & commit]
git push origin HEAD:refs/heads/my-new-branch

origin 替换为适当的远程名称(您具有写入权限),并将my-new-branch 替换为您希望调用新分支的任何名称。

您在HEAD 上的提交将被推送到一个名为my-new-branch 的新分支。 ?

【讨论】:

  • 我同意,这是一个很好的答案。 +1。但我的 (stackoverflow.com/a/41790114/6309) 仍然适用:尝试使用 Git 2.11 或更低版本会出现段错误。
  • 我不小心使用HEAD:refs/features/my-new-branch 而不是HEAD:refs/heads/features/my-new-branch 推送 - 我没有看到新分支。在 SO 上进行一些搜索后,我找到了一种查看方法:git ls-remote 并使用git push origin :refs/features/my-new-branch 将其删除。希望它可以帮助其他忘记heads/ 的人;-)
  • 有什么方法可以做到这一点,甚至不需要创建远程分支? IE。将未引用的提交推送到远程,只能由其 SHA1 引用,直到它被垃圾收集?我猜我们只能从远程获取标签或分支引用的提交,但我不确定,因此是这个问题。
  • @Irfy - 用例是什么?
  • 在数十台虚拟机上安排重复部署以确定最佳进程参数,例如进程数、每个进程的线程数与虚拟机 vCPU 的数量。没有任何更改会持续存在,也没有有意义的历史可言,所以我不想污染分支命名空间——但我知道我仍然可以推送到临时分支并稍后修剪它,没有什么错有了这个,所以我没有分支的推动可能是毫无根据的。
【解决方案4】:

git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

这将签出指向所需提交的新分支。
此命令将签出给定的提交。
此时您可以创建一个分支并从这一点开始工作。

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
#in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

【讨论】:

    【解决方案5】:

    注意:在 推送之前创建一个分支更推荐 git 2.11 或更低版本用于段错误!

    Git 2.12+(2017 年第一季度)不会出现这种情况

    参见Kyle Meyer (kyleam)commit b10731f(2017 年 1 月 7 日)。
    (由 Junio C Hamano -- gitster -- 合并到 commit b85f79c,2017 年 1 月 18 日)

    branch_get_push: HEAD 分离时不要进行段错误

    git &lt;cmd&gt; @{push}”在一个分离的 HEAD 上用于段错误;它有 已通过消息更正错误。

    现在的错误是:

    HEAD does not point to a branch
    

    使用 Git 2.12 或更高版本,您可以将分离的 HEAD 推送到远程分支,如 Mattanswer 所示。

    【讨论】:

      【解决方案6】:

      为该提交创建一个新分支并将其签出:git checkout -b &lt;branch-name&gt; &lt;commit-hash&gt;。现在您可以将更改推送到新分支:git push origin &lt;branch-name&gt;

      如果您需要从剩余提交中清理其他分支,请务必运行 git reset --hard &lt;branch-name&gt;

      这里有一篇文章解释了branching and detached head 的工作原理。

      【讨论】:

        【解决方案7】:

        Detached head 通常意味着你签出到的分支没有最新的提交。所以,基本上你需要将当前分支的 HEAD 调整为最新的提交。

        通常有两种方法。

        1. 如果你想使用相同的分支 - 你可以使用:

          git push origin HEAD:

        2. 您可以创建一个新分支,将您的代码推送到该分支(这也会拉取您分离的代码)。

          git checkout -b 混帐提交。 git推送

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-09
          • 2022-10-23
          • 1970-01-01
          • 2011-11-17
          • 2019-03-15
          相关资源
          最近更新 更多