无法推送到GitHub-一直说需要合并

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

Pushing to git@github.com:519ebayproject/519ebayproject.gitTo 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 behindhint: 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.

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

870262 次浏览

你有没有在推送前更新你的代码?

在推送任何东西之前使用git pull origin master

我假设您使用origin作为遥控器的名称。

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

正如信息告诉你的,

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

使用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要求你自己处理合并,因为合并可能会导致冲突。

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

git clone --bare <source repo path> <target bare repo path>

你们中的一些人可能会遇到这个错误,因为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 remotehint: counterpart. If you did not intend to push that branch, you may want tohint: specify branches to push or set the 'push.default' configurationhint: variable to 'current' or 'upstream' to push only the current branch.

然后,您可能希望按照Jim Kubicek将Git配置为仅推送当前分支的方便提示将默认分支设置为当前分支。

git config --global push.default current

刚刚遇到了同样的问题,但在我的情况下,我在遥控器上输入了错误的分支。所以,似乎这是这个问题的另一个来源……仔细检查你正在推送到正确的分支。

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

如果您不希望将远程分支合并到本地分支中(请参阅与gitdiff的差异),并且想要进行强制推送,请使用使用-f推送命令

git push -f origin <branch>

其中origin远程存储库的名称。

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

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

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

假设您要推送的远程分支是[测试],而您的本地分支名为[测试]。

如果你不在测试分支,首先切换到它。

git checkout test

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

git checkout -b testing

现在是时候推动它了:

git push [remote repo] testing

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

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

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

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

正常流量如下,

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

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

STEP 3git stash popstashed更改(然后,如果需要,您可以对弹出的文件进行提交,或者先推送已经提交的更改(STEP4),然后再对文件进行新的提交。

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

branch_name替换为master(对于master分支)。

有时我们忘记了拉动,在当地环境中做了很多工作。

如果有人想推而不拉,

git push --force

当与其他人一起工作时,这是不推荐的,但是当你的工作是一件简单的事情或一个个人玩具项目时,这将是一个快速的解决方案。

在我的例子中,我签出了“my分支”,并且完成了git pull,所以我无法弄清楚为什么推送不起作用。最终,我意识到我推错了分支。我输入的是git push origin master而不是git push origin mybranch

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

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

我的解决方案:签出正确的分支,从另一个本地分支中挑选提交,git拉和git推

另一种解决方案是如果可以的话,通过再次提交来推进远程的头部。将此高级头部拉入本地子树后,您将能够再次从它推送。

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

git checkout foobargit push origin foo

事实证明,我有两个本地分支跟踪同一个远程分支:

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

它为我工作推送我的当前分支使用:

git push origin foobar:foo

…用git branch -d清理

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

那么这可能就是发生的事情,你用了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拉取后的git历史:A->B->C->D)

更多详情:如何更改您的最新提交

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

在我当地的“主人”

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

然后回到我当地的分部

git rebase master

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

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

在我当地的分公司

git fetch upstreamgit merge upstream/master

没有快进,因为我当然会在当地分支机构做出改变。

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

我已经在我的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>

希望能有所帮助。

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

情景-

  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**

证明

这个问题的另一个原因(显然不太常见)…

我推的时候我的服务器落后了12个小时

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

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

git ush-f来源品牌名称

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

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

git fetch

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

git pull <sharedRepo> <branch> --rebase

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

git push <forkedRepo> <branch>

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

git push <forkedRepo> <branch> -f

如果有任何机会git pull打印Already up-to-date,那么您可能需要检查全局gitpush.default参数(在~/.gitconfig中)。如果它在matching中,请将其设置为simple。下面的答案解释了原因:

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

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

git pull origin branch_name --rebase

这对我很有效——命令git pull origin branch_name --rebase将首先从远程branch_name中提取更改,然后rebase当前分支在其顶部。

使用git pull https://github.com/username/repository这是因为Github和远程存储库不同步。如果你pull存储库,然后Push,一切都将同步,错误将消失。

'

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

git push --force

我是在提交文件后这样做的,并且得到了一个错误。它确实提交了所有文件并推送了它们。然后下一次我推到github。我做了它要求我做的事情,然后就好了。希望这对你也有效:)

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

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

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

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

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

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

第一个简单的解决方案:

  • 试试这个命令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 itgit add *git commit -m "commit message"git push

如果这不起作用,那就跟着🔰

解决方案2(不推荐):

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

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

  • 然后执行这些命令:

      git initgit 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不适合你。

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

这个问题通常是由创建一个readme.md文件引起的,该文件被视为提交,在系统本地没有同步,并且在头部后面缺少,因此,它显示了一个git拉取请求。您可以尝试避免自述文件文件,然后尝试提交。它在我的案例中起作用了。

您将无法将更改推送到远程分支,除非您取消暂存暂存文件,然后保存本地更改并应用远程拉取,然后您可以将更改推送到远程。

步骤如下-->

git复位--soft HEAD~1(获取暂存文件)

git状态(检查暂存的文件)

git恢复--分阶段<文件…>(恢复分阶段)

git stash(保存当前更改)

git拉取(从远程获取更改)

git stash应用(应用本地更改以添加和提交)

git add(添加本地文件进行提交)

git msg-m'提交msg'

git推送