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


743

我是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.

我尚未在存储库中推送任何内容,那么为什么需要提取内容?


6
请注意,对于先前在本地访问的分支(在上游存储库中已提交),也可能发生这种情况。有没有简单的方法可以快速转发这样的旧分支,或者只是让git在本地存储库中忘记它?
托尔比约恩Ravn的安德森

50
@ThorbjørnRavnAndersen-我设法使用'git push -f'修复了这种情况,这似乎使git忘记了其想象中的问题:)
Echelon

6
从git newcomer看到了对此的抱怨。原因是,当他们在GitHub上创建新项目时,他们留下了“使用自述文件初始化”复选框或选择.gitignore / GPL选项,因此新项目已经具有本地没有的提交,因此,上述错误引起了混乱。
Ruslan Kabalin

4
@Echelon -f选项强制执行推送是危险的。我只是在团队项目中使用过它,并且“提交”了6次提交,只是从服务器中删除了,没有办法将它们退回!
Deleplace 2014年

42
赞美git的新潮。但是我与之交谈的几乎每个开发人员都私下同意他们个人讨厌git。与使用perforce或TFS所花费的时间相比,现在他们使用git所花费的时间要多得多。
developer747

Answers:


762

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

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

git push -f origin <branch>

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

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


1
这为我在Github上的回购工作了,但我的应用程序中有一个Heroku的子模块。我必须将文件从子模块中取出,然后将更新的应用程序推送到Heroku。
JGallardo 2013年

24
确保您阅读了这篇文章的评论的最后一行!“这可能会导致远程存储库丢失提交;请谨慎使用。” 在团队环境中强行推动是一件危险的事情,通常应避免。
亚当·卡尔纳斯

这也可以使用cherry-pick在“提交”之间移动“仅”一次提交,从而将所有历史记录从原始存储库添加到远程数据库。从所需的备份还原...
rickfoosusa 16'Aug9

还值得一提的是,如果您使用的是Github,这可能会覆盖您先前使用最新提交创建的打开的Pull Request。来自Github Docs:“强行推入可能会破坏您的拉取请求”。
Armfoot

这对我有用。我已经尝试过,$ git pull origin master -v但是会出错fatal: refusing to merge unrelated histories。然后我尝试了一下,它就起作用了,我的本地文件出现在github远程仓库中。
Vir

238

消息告诉您,

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

使用git pull拉从远程资源库的最新变化,以本地资源库。在这种情况下,因为您已经对本地存储库进行了更改,所以提取更改将需要合并。

我将提供示例和图片进行说明。假设您最后一次从起源/分支开始是在CommitB。您已经完成并完成了一些工作(Commit C)。同时,其他人也完成了他们的工作并将其推到起点/分支(Commit 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 

完成合并后,现在可以通过推送更改将源/分支快速转发到CommitE。

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


7
如果您不想合并怎么办?只需将D留为侧支(至少现在如此)。以后,我可能会在C之后做出更多承诺。在D之后,其他人可能会做出更多承诺。合并有什么急事?如何在不合并的情况下推动侧枝?~~~
史蒂夫·投手

3
本地/分支和起源/分支旨在表示相同的分支,但在不同的机器上(本地与起源);推送本地/分支是更新源/分支。如果您希望分支的状态对其他人可见(即在原点上),但又不想与原点/分支合并,则应从本地/分支(git branch [name])创建一个新分支,然后将分支推送到原点(git push -u origin [name])
杰克·格林

1
很好的解释。该视频简要展示了该问题以及如何按照@JakeGreene的描述解决该问题,以及在设置新存储库时首先避免该问题的两种方法。
凯文·马克汉姆

4
一些年后,它似乎只是这个答案是非常非常相似,这等
superjos

1
对我来说git pull也印了Already up-to-date。原来我虽然不在,但我不在分支上,而是一个独立的HEAD分支(可能来自失败的合并?)。跑步后这很明显git branch。运行后,git checkout mybranch一切正常。

200

您在推送之前是否已更新代码?

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

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

您需要先进行推送,然后再进行推送(以防他人已更新上的代码github.com),以使本地存储库处于最新状态。这有助于在本地解决冲突。


1
我怎么知道仓库名称?当我输入git pull origin mastergit时抱怨'origin' does not appear to be a git repository
ziyuang

3
“起源”是一个远程站点。您可以git remote --verbose用来查看git文件夹下配置的所有远程。屏幕上显示的信息还将包括“ git@github.com”路径或HTTPS路径,您应该可以从中确定要推送到的位置。希望这可以帮助 !
AYK 2012年

16
git pull origin master显示已经是最新的。但是然后当尝试推动origin_branch时,请说同样的问题。任何建议!
CoDe 16'Apr 20'13

2
@Shubh您是否解决了这个问题?我得到了同样的东西!
OriginalAlchemist

3
@OriginalAlchemist是..因为我只是在远程本地分支上工作的开发人员...所以我确实强行推送了本地分支..并且我用本地系统的更改覆盖了服务器上打开的分支的所有更改。git push -f <remote> <branch>例如git push origin <your_local_branch>检查此线程
CoDe

122

通常,当您git commit尝试在其他人已经进行了更改的那个分支上进行git push更改之前git pulling,通常会发生这种情况x

正常流程如下

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

步骤2git pull origin branch_name -vpull and merge该分支上本地提交的更改(向此合并发送一些消息,并修复冲突(如果有)。

STEP 3git stash popstash编的变化(然后,你可以,如果你想或推已经提交的修改(STEP4)首先做出新的承诺文件,后来就弹出的文件提交。

步骤4git push origin branch_name -v合并的变更。

替换branch_namemaster(用于master分支)。


3
在哪里commit?之后不应该提交更改stash pop吗?
2016年

我应该。通常,我通常先推送合并的代码,然后提交本地的未提交更改。您也可以一次提交并推送。只是偏爱。
祈祷者

51

第一个简单的解决方案(不推荐)

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

推荐方案

  • 运行以下命令:
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

如果这不起作用,请遵循🔰

  • .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不为您工作时使用。

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


4
删除git repo并丢失整个提交历史记录是“推荐”的解决方案吗?似乎草率。
尼尔斯·

@Nils Guillermin这取决于您的情况。如果我在一个大型项目中必须解决所有合并冲突,那么我将使用vscode轻松查看和合并所有更改。谢谢您的意见。
Smit Patel

47

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

如果有人想推而不拉,

git push --force

正在工作。与他人一起工作时不建议这样做,但是当您的工作是简单的事情或个人玩具项目时,这将是一个快速的解决方案。


$ git push --force原点大师
shaurya uppal '17

2
这对我有用:与其他0个合作者的私人项目。我在SO上尝试了其他一些建议的“解决方案”,但都没有解决一个非常简单的问题:我对reset --hard较旧的提交进行了本地处理,然后又做了一些。然后我只是想,push但是远程存储库还没有准备好让我使用。WarrenP实际上可以通过减少较弱的语气来帮助git学习者。也许他不想。
麦克啮齿动物

2
要么不使用它,要么学习正确使用它。如果您强制推送到团队共享的重要中央存储库,则应失去对所有重要仓库的所有推送访问权限。为避免学习其他解决方法,您在自己的个人存储库上执行的操作最终将影响您处理共享存储库的能力。如果您知道在强行按下之前发生了什么,则有时可以进行强行按下。如果您不这样做,那就永远不会好。
沃伦·P

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配置为仅推送当前分支”将默认分支设置为current。

git config --global push.default current

32
git pull origin branch_name --rebase

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


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

证明


1
你帮了我 我很难注意到我需要签到另一个分支并将其从远程拉出,即使我正在使用该--all标志拉到另一个分支上也是如此。
MZanetti

18

我遇到了同样的问题,我所做的是首先使用此功能将其强行推入

git push --force

我在提交文件后遇到了这个错误,因为它确实提交了所有文件并推送了它们。然后下一次我推到github时,我做了它要求我做的事,然后就可以了。希望这也对您有用:)


它会工作,但可能不是您想要的!这意味着您基本上只是忽略现在将永远丢失的更改。
轧辊

3
git push --set-upstream origin master --force
传奇

1
销毁存储库的好方法。如果您强行推动,您将摧毁历史。同样,许多专业设置的git代码库也不允许您执行此操作。
奥利弗·迪克森

这是重复的答案,无论如何,最初的建议不是很好。
moopet '18

这实际上是我想要做的,但是我只是尝试使用Gitlab,而Gitlab不允许在设计
上将

13

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

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

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

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

我知道这是一年后的事,但是在所有这些答案中,您的答案是唯一可以真正解释为什么我在github上遇到麻烦的唯一答案。但是pull和fetch有什么区别?
Xander Luciano

1
通过Fetch,您可以浏览更改,而无需将其合并到本地分支中。拉是获取然后合并的快捷方式。我敢肯定,您在最近13个月中就知道了。我只是因为我自己创建了一个烂摊子而已。;-)
wolfhoundjesse

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


6

git push -f原始分支名称

仅在确定不需要远程分支代码的情况下,才使用上述命令,否则请先合并然后再推送代码


5
这是一个错误答案的重复。
moopet '18年

5

如果您不想进入当前项目(可能会遇到合并冲突,而又不想解决),又不想创建另一个分支(管理另一个分支将很繁琐),而您不想不想做任何冒险和永久的git force命令(即使在阅读了它们的内容后,我也常常对这样做的含义感到惊讶)。

解决方案:您可以简单地将文件夹的内容拖到另一个文件夹中,将项目拖到现在为空的文件夹中,将提取的内容拖到垃圾箱中,然后将正确的项目拖回到文件夹中。您应该能够正确推动并获得所需的结果。从字面上看,我只需不到10秒即可完成此操作。

对于那些会在没有任何后果的情况下告诉我这是不适当的,或者告诉我使用导致我将来烦恼的命令的人们来说,我说:“这种方法实际上只花了我不到10秒的时间。” 如果遇到执行不到10秒且效果完全相同的git命令,我将采用该命令。在此之前,我一直在使用这种方法。

这种方法的一个缺点是,当您在分支中实际合并而未记录合并时,提交历史记录将显示为线性。当使用组时,这可能不是最佳方法。在这种情况下,请在分支机构上工作!


4

只是有同样的问题,但在我的情况下,我在遥控器上键入了错误的分支。因此,这似乎是此问题的另一个来源。仔细检查您是否将推送到正确的分支。


1
我有一个类似的事情,我想起了以前的命令,该命令用于一个完全不同的存储库!
克莱尔·麦克雷

4

我遇到了同样的问题,结果发现我所处的本地分支与我以前认为的不同,并且正确的本地分支位于远程提交中。

我的解决方案:签出正确的分支,从其他本地分支中挑选提交,git pull和git push


4

我遇到了类似的问题,结果是我的使分支保持最新状态的工作流程有错。我正在执行以下操作:

在我当地的“主人”

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专家,但我得到可靠的通知,该工作流程可能会避免我遇到的特定问题。


3

以我为例,我已经签出“ mybranch”,并完成了操作git pull,因此我不知道为什么该推送不起作用。最终,我意识到我推错了分支。我输入的git push origin master不是git push origin mybranch

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


3

您的分支机构名称与远程分支机构名称相同吗?

如果否,则应签出一个与远程分支同名的新分支,然后尝试再次将其推送。

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

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

git checkout test

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

git checkout -b testing

现在,该推送它了:

git push [remote repo] testing

2
仅用于$git branch -M <new_name>重命名本地分支。
coms 2014年

3

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

希望会有所帮助。


2

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


2

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

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

2

如果您确定没有人对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 )

有关更多详细信息:如何更改您的最新提交


2

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

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

您可以获取远程分支以获取本地副本,并检查(i)远程拥有的(具有旧的分支名称)和(ii)您拥有的(具有新的分支名称)之间的区别,然后决定要做什么。由于您一开始并不了解遥控器的差异(因此出现了问题),因此仅合并或强制某个地方的更改就太残酷了。

查看差异,选择您要使用的分支,从另一个分支中挑选您想要的更改,或者在您拥有的分支上还原您不想要的更改,等等。

然后,您应该可以决定是否要将纯净版本强加到遥控器上,还是要添加新更改,还是执行其他操作。


1

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


1

此问题通常是由创建一个readme.md文件引起的,该文件被视为一次提交,在系统上本地未同步,并且缺少头部,因此显示了git pull请求。您可以尝试避开自述文件,然后尝试提交。就我而言,它奏效了。


0

造成此问题的另一个原因(显然不是很普遍)...

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

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

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



0

使用git pull https://github.com/username/repository 这是因为Github和远程存储库不同步。如果您进行pull了回购,那么Push一切将同步,错误将消失。

`


0

git pull 已打印 up-to-date

解:

您可能会在remote(server)中创建一个存储库/项目,并在其中添加了一些文件,然后再次在本地和初始化的git中创建了一个Folder- git init这是错误的信息,您不应该创建git init在本地,而是将项目克隆到本地使用git clone

然后拉

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.