Git推送主分支致命错误:您当前不在分支上。

106

大师,我现在位于第10个提交。但是,在这个过程中我意识到我破坏了一些测试没有检测到的东西。

最终我回到了第5个提交,然后慢慢地重新做了每个提交的开发,并不断调整以确保它不会重新引起bug。现在我基本上又回到了第10个提交,但进行了许多更改以防止出现错误。

现在,我想使用我的更改创建第11个提交。但是当我尝试推送到主分支时,我收到以下提示:

fatal: You are not currently on a branch.
To push the history leading to the current (detached HEAD)
state now, use

    git push master HEAD:<name-of-remote-branch>

这是可以预料的。但我要如何将此推送到我的远程分支呢?

我尝试了git push origin HEAD:master,但得到了以下提示:

! [rejected]        HEAD -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/tomhammond/sample.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

当我执行 git status 命令时,我会看到 HEAD detached from 4a74ac3 的提示信息。


2
你确认你的提交历史记录直到 #10 是否与原始记录一致,并且只有你的第11次提交包含了更改吗?当你的分支和源分支具有不同的提交历史记录时(例如,当你重新进行每个提交的开发时),通常会出现这样的错误。 - scrowler
2
我非常确定他们不会这样做。我认为我在查看#5之后愚蠢地开始了开发工作。 - Tom Hammond
2
没问题,你可以执行以下命令:git reset [commit10Hash] 取消暂存的更改,然后 git stash 暂存这些更改,git reset --hard origin/nameofremotebranch 将分支重置为远程仓库的状态,git stash pop 重新应用你需要的更改,接着执行 git add .git commit -m "Your new changes on top of origin"。最后,你就可以无冲突地执行 git push origin nameofremotebranch 了。 - scrowler
8个回答

164

但是当我尝试推送到主分支时,我遇到了以下问题:

致命错误:您当前不在任何分支上。 要推送导致当前(脱离的 HEAD)的历史记录

这是可以预料的

处于分离状态下工作是不可预期的,除非您故意这样做,而我怀疑这不是您的情况。 您应该撤销到提交5或使用交互模式下的git rebase重新处理提交。

话虽如此,如果您确信分离状态下的master版本是您真正想要保留的,则可以通过强制将分支推送到远程来解决non-fast-forward错误:

git push origin HEAD:master --force

然而,如果您进行强制推送,可能会对所有已检出该分支的其他用户造成问题风险。一种风险较小的解决方法是从分离的HEAD创建临时分支,然后将该分支合并到 master 中:

git branch temp-branch
git checkout master
git merge temp-branch
git push origin master

1
但是这会给想要检查“master”的其他开发人员带来问题,不是吗? - Nathan majicvr.com

11

您是否确保自己真的在分支中?使用 git branch 检查您当前所在的分支。如果不在分支中,只需 git checkout 切换到您想要的分支名,然后再进行 git push 即可!


虽然这是一个非常简单的答案,但通常可以解决大多数导致 OP 问题的问题。在我的情况下,我已经回滚到了早期的提交,修复了一些问题,并进行了几次推送 - 但忘记了 HEAD 仍然是分离状态!你的解决方案为我解决了所有问题。谢谢。 - Gwyneth Llewelyn

5

git push只能让你快进远程分支。这意味着你尝试推送的提交需要是远程分支的后代。由于你在第5个提交之后编辑了先前的提交,所以你没有一个后代,而是一个堂兄弟。如果你想覆盖分支,可以使用 git push --force,但是如果其他人在当前主分支上进行了自己的更改,则他们将无法拉取该分支。此外,如果有其他人在你之前推送到主分支,他们的更改将会丢失。通常情况下,如果不是唯一使用该分支的人,就不要强制推送。


很棒的信息 - 目前我是唯一在这个项目上工作的人,所以我认为这应该可行。 - Tom Hammond

1
如果您正在推送到一个新的代码库,您可以使用
git push origin HEAD:refs/heads/main --force

main 这里是一个新的分支,如果目标仓库为空将会被创建。


1
你可以创建一个新的分支,并将这些更改合并到以前的分支中。
git checkout -b newBranch 
git checkout previousBranch
git merge newBranch
git push origin previousBranch
git branch -d previousBranch

0

如果你想不使用rebase,这个应该可以工作。

git config pull.rebase false 
git pull origin master
git add .
git commit -m "Your Commit message"
git push

现在你已经准备好了 ;-)


0
您可以创建一个新分支来保留您创建的提交,然后将它们推送到远程仓库。
使用以下命令:
git switch -c

0
除非你想丢失在分离的HEAD上的工作,否则运行以下命令:
git switch -c my_changes
git switch main
git merge my_changes

这将从分离的头部创建一个新的分支。然后将这些更改添加到主分支(您可以将main更改为master或任何您想要的分支)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接