767

我是GitHub的新手。今天我在尝试将代码推送到 GitHub 时遇到了一些问题。

Pushing to git@github.com:519ebayproject/519ebayproject.git
To git@github.com:519ebayproject/519ebayproject.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:519ebayproject/519ebayproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我还没有在存储库中推送任何东西,那么为什么我需要拉一些东西呢?

4

30 回答 30

779

这可能会导致远程存储库丢失提交;小心使用它。

如果您不想将远程分支合并到本地分支(请参阅与git diff的区别),并且想要强制推送,请使用带有 -f 的 push 命令

git push -f origin <branch>

您的远程origin仓库的名称在哪里。

通常,该命令拒绝更新不是用于覆盖它的本地引用的祖先的远程引用。此标志禁用检查。这可能会导致远程存储库丢失提交;小心使用它。

于 2013-08-08T20:08:07.187 回答
244

正如消息告诉你的那样,

合并远程更改(例如“git pull”)

用于git pull将最新更改从远程存储库拉到本地存储库。在这种情况下,拉取更改将需要合并,因为您已对本地存储库进行了更改。

我将提供一个例子和一张图片来解释。假设您最后一次从源/分支拉取是在提交 B。您已经完成并提交了一些工作(提交 C)。同时,其他人完成了他们的工作并将其推送到源/分支(提交 D)。这两个分支之间需要合并。

local branch:                         --- Commit C 
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

因为您是想要推送的人,所以 Git 会强制您执行合并。为此,您必须首先从源/分支中提取更改。

local branch:                         --- Commit C -- Commit E
                                    /               /           
                                   /               /             
                                  /               /               
origin/branch: Commit A ------ Commit B ---- Commit D 

完成合并后,您现在可以通过推送更改将源/分支快进到 Commit E。

Git 要求您自己处理合并,因为合并可能会导致冲突。

于 2012-04-24T13:01:32.363 回答
201

你在推送之前更新了你的代码吗?

git pull origin master在你推动任何东西之前使用。

我假设您将origin其用作遥控器的名称。

您需要在推送之前拉取,以便在推送某些内容之前使您的本地存储库保持最新(以防其他人已经更新了代码github.com)。这有助于在本地解决冲突。

于 2012-04-24T13:01:03.530 回答
125

这通常发生在您之前git commit尝试在其他人已经进行更改的分支上进行更改时。git pushgit pullingx

正常流程如下,

第 1步:git stash您在该分支上的本地未提交更改。

第 2 步git pull origin branch_name -vpull and merge该分支上本地提交的更改(给这个合并一些消息,如果有的话,修复冲突。

git stash pop3步:stashed 更改(然后您可以根据需要对弹出的文件进行提交,或者先推送已提交的更改(STEP4),然后再对文件进行新的提交。

第 4 步git push origin branch_name -v合并的更改。

替换branch_namemastermaster分支)。

于 2014-06-03T18:09:49.183 回答
61

第一个简单的解决方案:

  • 试试这个命令git push -f origin master
  • 此命令将强制覆盖远程存储库(GitHub)

推荐解决方案 1:

  • 运行这些命令:
git pull --allow-unrelated-histories  //this might give you error but nothing to worry, next cmd will fix it
git add *
git commit -m "commit message"
git push

如果这不起作用,请继续

解决方案2(不推荐):

将删除您和您队友的所有提交历史记录。所以请不要在专业项目上这样做

  • 从文件夹中删除.git目录。

  • 然后执行这些命令:

      git init
      git add .
      git commit -m "First Commit"
      git remote add origin [url]
      git push -u origin master
    

或者

git push -f origin master 

git push -f origin master-u不适合您的情况下使用。

这将解决推送文件时发生的几乎所有类型的错误。

于 2018-08-29T04:48:49.510 回答
50

Sometimes we forgot the pulling and did lots of works in the local environment.

If someone want to push without pull,

git push --force

is working. This is not recommended when working with other people, but when your work is a simple thing or a personal toy project, it will be a quick solution.

于 2014-07-29T16:17:22.357 回答
35

你们中的一些人可能会收到此错误,因为 Git 不知道您要推送哪个分支。

如果您的错误消息还包括

error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

那么您可能需要遵循 Jim Kubicek 提供的便捷提示,将Git 配置为仅推送当前分支,将默认分支设置为当前分支。

git config --global push.default current
于 2012-11-19T06:14:11.577 回答
33
git pull origin branch_name --rebase

这对我有用——该命令git pull origin branch_name --rebase首先会从远程分支名称中提取更改,然后rebase是它顶部的当前分支。

于 2017-11-24T07:16:49.843 回答
20

除了上面的答案,以下对我有用: -

设想 -

  1. 我成功地将my_branch推到了原点。
  2. 我又做了一些改动。
  3. 当我再次尝试推送时(当然是在添加,提交之后),我得到了上述错误。

解决方案 -

 1. git checkout **my_branch**
 2. git add, commit your changes.
 3. git pull origin **my_branch** (not origin, master, or develop)
 4. git push origin **my_branch**

证明

于 2017-01-20T09:17:33.967 回答
19

我有同样的问题,我所做的是我首先用这个强行推动它

git push --force

我在提交文件后执行了此操作,并且收到了错误消息。它确实提交了所有文件并推送了它们。然后下次我推送到 github 时。我按照它的要求做了,然后就没事了。希望这对你也有用:)

于 2018-02-11T14:57:34.323 回答
14

我在我的教程如何使用 GitHub:初学者教程中提到了这一点。

当您在 GitHub 上创建新存储库时,GitHub 可能会要求您创建自述文件。如果您直接在 GitHub 上创建自述文件,那么您需要先发出“拉取”请求,然后“推送”请求才会成功。这些命令将“拉”远程存储库,将其与您当前的文件合并,然后将所有文件“推送”回 GitHub:

git pull https://github.com/thomas07vt/MyFirstRepo.git master

git push https://github.com/thomas07vt/MyFirstRepo.git master
于 2014-01-25T06:02:36.740 回答
7

git push -f origin分支名

仅当您确定不需要远程分支代码时才使用上述命令,否则请先合并然后推送代码

于 2017-08-22T12:15:18.230 回答
6

当我尝试推送当前分支时收到上述错误消息foobar

git checkout foobar
git push origin foo

原来我有两个本地分支跟踪同一个远程分支:

foo -> origin/foo (some old branch)
foobar -> origin/foo (my current working branch)

它对我有用,可以通过以下方式推送我当前的分支:

git push origin foobar:foo

...并清理git branch -d

于 2015-07-22T13:58:46.583 回答
6

一旦你注意到它们,你的分支应该包含最新的合并更改,但你还没有提取最新的更改。

git fetch 

可能就是所有需要的。如果这不起作用,那么您可能需要:

git pull <sharedRepo> <branch> --rebase

如果您没有任何合并冲突,您应该能够成功推送您的更改。

git push <forkedRepo> <branch>

如果遇到合并冲突,则无法在 GitHub 中远程解决。您必须在本地解决它们,然后使用强制标签推送解决方案,因为合并冲突解决方案会更改历史记录。

git push <forkedRepo> <branch> -f
于 2017-08-28T09:41:40.710 回答
5

只是遇到了同样的问题,但就我而言,我在遥控器上输入了错误的分支。所以,这似乎是这个问题的另一个来源......仔细检查你正在推动正确的分支。

于 2013-04-10T01:33:42.323 回答
5

我遇到了同样的问题,结果发现我在与我想象的不同的(本地)分支上,并且正确的本地分支落后于远程提交。

我的解决方案:检查正确的分支,从另一个本地分支中挑选提交,git pull 和 git push

于 2015-04-21T10:04:51.263 回答
5

我遇到了类似的问题,结果证明我保持分支最新的工作流程有问题。我正在做以下事情:

在我当地的“主人”中

git fetch upstream
git merge upstream/master --ff-only

然后回到我当地的分支机构

git rebase master

这适用于以前的 git 流,但不适用于 github。这git rebase是导致同步问题的问题(我承认这是我在没有完全理解的情况下不得不接受的事情),不幸的是让我处于git push -f可能成为最简单选择的位置。不好。

我的新流程是直接使用git merge如下更新分支:

在我当地的分支机构

git fetch upstream
git merge upstream/master

没有快进,因为我当然会在本地分支中进行更改。

正如您可能知道的那样,我不是 git 专家,但我被可靠地告知这个工作流程可能会避免我遇到的特定问题。

于 2016-09-02T09:53:42.060 回答
4

您的分支名称是否与远程分支名称相同?

如果不是,您应该签出一个与远程分支同名的新分支,然后再次尝试推送它。

假设你要推送的远程分支是 [ testing ],而你的本地分支被命名为 [ test ]。

如果您不在测试分支中,请先切换到它。

git checkout test

然后打开一个新分支并将其命名为testing

git checkout -b testing

现在,是时候推动它了:

git push [remote repo] testing
于 2013-11-23T05:05:06.823 回答
4

就我而言,我已经检查了“mybranch”,并且已经完成了git pull,所以我无法弄清楚为什么推送不起作用。最终,我意识到我推错了分支。我在打字git push origin master而不是git push origin mybranch.

因此,如果您已经完成git pull并且仍然收到此消息,请确保您正在推送正确的分支。

于 2014-09-07T07:13:04.077 回答
4

如果您确定没有人对您的 git 存储库进行更改并且您正在使用最新版本,git pull那么作为您心中的解决方案没有意义......

那么这可能就是发生了什么,你用git commit --amend

它使您可以将分阶段的更改与先前的提交结合起来,而不是将其作为全新的快照提交。它还可以用于简单地编辑先前的提交消息而不更改其快照。

ATLASSIAN 教程:重写历史

git commit --amend 但是,如果您已经将提交推送到 GitHub ,则不建议执行,这是因为“修改不只是更改最近的提交——它会完全替换它。对于 Git,它看起来像一个全新的提交”这意味着对于你 GitHub 上的其他开发人员来说,历史看起来像 A->B->C 但对你来说它看起来像 A->B->D,如果 GitHub 允许你push,其他人将不得不手动修复他们的历史

这就是您收到错误消息的原因! [rejected] master -> master (non-fast-forward),如果您知道没有人拉您最新的更改,您可以这样做git push --force,这将改变您公共仓库中的 git 历史记录。否则......你可以执行git pull,但我相信这会产生与你没有经历相同的结果git commit --amend,它会创建一个新的提交(即:git pull之后的git历史:A->B->C->D )

更多细节:如何更改您的最新提交

于 2016-08-19T21:27:44.663 回答
4

我已经在我的 GIT 存储库中解决了这个问题。在这种情况下不需要rebaseforce承诺。使用以下步骤解决此问题 -

local_barnch> git branch --set-upstream to=origin/<local_branch_name> 

local_barnch>git pull origin <local_branch_name>

local_barnch> git branch --set-upstream to=origin/master

local_barnch>git push origin <local_branch_name>

希望它会有所帮助。

于 2016-11-15T06:31:35.103 回答
3

在将最新更改推送到我用于gitweb的裸 Git 存储库时,我遇到了类似的错误。就我而言,我没有在裸存储库中进行任何更改,所以我只是删除了我的裸存储库并再次克隆:

git clone --bare <source repo path> <target bare repo path>
于 2012-07-19T21:18:31.157 回答
3

另一个解决方案是如果可以的话,通过再次提交来提升遥控器的头部。将这个高级头拉入本地子树后,您将能够再次从中推送。

于 2015-05-27T14:32:50.877 回答
3

另一种选择:在本地将您的分支重命名为新的名称。

然后,您将能够将其推送到远程存储库,例如,如果这是您保留副本(备份)并确保不会丢失任何内容的方式。

您可以获取远程分支以获得本地副本,并检查 (i) 远程拥有的内容(使用旧分支名称)和 (ii) 您拥有的内容(使用新分支名称)之间的差异,然后决定做什么. 由于您一开始并没有意识到遥控器的差异(因此出现了问题),因此简单地在某处合并或强制更改太残酷了。

查看差异,选择您想要处理的分支,从另一个分支中挑选您想要的更改,或者在您拥有的分支上恢复您不想要的更改等。

然后,您应该能够决定是否要将您的干净版本强制到遥控器上,或者添加新的更改,或者其他什么。

于 2018-06-14T11:02:57.713 回答
2

这个问题一般是因为创建了一个readme.md文件导致的,这个文件算作commit,在系统本地没有同步,heading后面缺少,所以显示了一个git pull request。您可以尝试避开自述文件,然后尝试提交。它在我的情况下有效。

于 2019-03-15T20:44:35.577 回答
2

push 命令的问题是您的本地和远程存储库不匹配。如果在从 git hub 创建新存储库时默认初始化自述文件,则会自动创建 master 分支。但是,当您尝试推送时,它没有任何分支。你不能推送......所以,最好的做法是在没有默认自述文件初始化的情况下创建 repo。

于 2018-02-25T11:57:59.687 回答
0

这个问题的另一个原因(显然不那么常见)......

当我进行推送时,我的服务器落后了约 12 小时

我在服务器上配置了 NTP 同步我的时钟。

我执行了一个新的 git push,它导致了这篇文章中讨论的错误。

于 2017-03-16T15:30:19.197 回答
0
于 2020-08-03T20:23:00.023 回答
0

如果有任何机会git pull打印Already up-to-date,那么您可能需要检查全局 gitpush.default参数 (In ~/.gitconfig)。如果它simplematching. 以下答案解释了原因:

Git - push.default“匹配”和“简单”有什么区别

此外,值得检查您的本地分支是否已过时,git remote show origin并在需要时进行拉取

于 2017-10-11T23:29:40.223 回答
0

use git pull https://github.com/username/repository It's because the Github and remote repositories aren't in sync. If you pull the repo and then Push everything will be in sync and error will go away.

`

于 2018-01-28T10:05:09.220 回答