为什么“git push”被拒绝?(“git pull”无效)

26

我目前所在的分支是my_branch。 尝试将更改推送到远程存储库时,我收到以下错误信息:

$ git push
Counting objects: 544, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (465/465), done.
Writing objects: 100% (533/533), 2.04 MiB | 1.16 MiB/s, done.
Total 533 (delta 407), reused 0 (delta 0)
To git@......git
   4ed90a6..52673f3  my_branch -> my_branch
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@......git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

尝试执行 git pull 后出现以下结果:

$ git pull
Already up-to-date.

我为什么会收到这个错误信息? 如何解决这个问题并成功执行git push

5个回答

35

我的当前分支是 my_branch。

这是你的问题。当你拉取代码时,Git会告诉你你的分支my_branch已经是最新的了,而不是mastermaster落后于origin/master,这就导致了无法进行快速合并。

为了能够推送master,你需要切换到master分支并进行拉取,这样就可以合并origin/master上等待的更改,然后你就可以推送你自己的更改了。

git checkout master
git pull
# resolve conflicts, if any
git push

3
如果你只想推送“my_branch”:git push origin my_branch。 - ysdx
1
只是为了澄清一下被接受的答案:4ed90a6..52673f3 my_branch -> my_branch 表示 my_branch 已经成功更新,但是 ! [rejected] master -> master (non-fast-forward) 表示主分支已经失败。这意味着 某些引用 未能推送到仓库,但是其他一些引用 可能 已经成功了,比如 my_branch - Ryan Bigg
如果您自己托管git存储库,并且通过终端远程检查(例如登录),则也可能发生这种情况,您想要推送到远程分支。在这种情况下,请切换分支(在远程上)并再次推送。 - Markus Zeller

11
[如果你的主分支已经配置为在拉取时进行变基,则只需要按照其他答案中所描述的方式在主分支上执行一次拉取即可,但如果没有这样的配置,则:]

如果你收到一个非快进消息,这意味着你只能在现有提交的基础上推送提交,但你正在尝试进行其他操作。在推送之前,在主分支上进行变基(假设远程名称为origin):

git checkout master
git pull --rebase origin master
git push

另请参阅此问题:git rebase和git push:非快进,为什么使用?


4

将开发者权限更改为“维护者”


2
这不是一个高质量的评论回答吗? - Mathews Sunny

3

这也可能是Git Hook引起的! 这将导致相同的错误。

Git Hooks在本地运行,因此它们可以在提交被推送之前截取和“预处理”您的提交。

更多关于Git Hooks的信息请访问这里:https://githooks.com/ 您应该能够在存储库的根目录中找到钩子,位置在这里:.git/hooks。 阅读钩子文件可能有助于解决问题,也可能无法帮助您;这些文件充满了高级的Git命令和正则表达式。 使用文件资源管理器或Finder来查看,因为以句点(.git、.gitignore)作为前缀的文件通常在IDE中是隐藏的。

当我尝试推送一个名为feature/JIRA-123_description-text的分支时,我遇到了相同的错误。经过一番寻找,我发现所有其他项目分支都以features/...命名,所以我只是漏掉了单词“features”中的一个s。重命名分支解决了问题。

因此,如果拉取主干等操作无法解决问题,请尝试查看其他分支名称并匹配格式。或者检查文档以查看是否有特殊的分支命名策略,或者检查是否尝试将某些东西推送到错误的文件格式等。


2

以下是我的解决方法:

前往https://github.com/settings/emails

取消选中:"阻止命令行推送,以避免公开我的电子邮件地址"

我的问题是:我在许可证中使用了我的电子邮件地址。


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