! [rejected] master -> master (首先获取)

161
有没有一个好的方法来解释如何解决Git中的"! [rejected] master -> master (fetch first)'"问题?
当我使用这个命令$ git push origin master时,它显示一个错误消息。
! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:zapnaa/abcappp.git'

10
git push origin master --force - Omar bakhsh
它对我起作用了。我一直在收到错误提示,但是仓库是空的。首先没有东西可拉取... - githeko
是的!那就是方法。 - Michael Espinoza Betanco
@Omarbakhsh 不要采取上述行动,这样可能会删除你可能遗漏的提交记录。这个意图完全不清楚! - undefined
27个回答

205

答案就在那里,git 告诉你需要先fetch。

可能有其他人已经push到主分支了,而你的提交落后了。因此你需要先fetch,合并变更集,然后才能再次push。

如果你不这样做(甚至更糟的是使用 --force选项强制执行),你可能会搞乱提交历史记录。

编辑:我会更详细地解释最后一点,因为这里有个人给出了非常糟糕的建议,让你使用 --force 选项。

由于git是一个DVCS,理想情况下许多其他开发人员正在使用相同的存储库(或其分支)。如果你强制用你的变更集覆盖了别人的变更集,那么你的存储库将与其他人的存储库不匹配,因为“你重写了历史记录”。这将使其他人不高兴,存储库也会受到影响。可能全世界还会有一只小猫咪哭泣。

简而言之:

  1. 如果想解决问题,请先fetch(然后再合并)。
  2. 如果想Hack,使用 --force 选项。

然而你要求前者,因此始终使用1)即使你总是自己使用git,因为这是一个好的实践方法。


6
无法获取删除本地文件中的重要更改吗? - Leonardo Castro
2
获取后它不会改变。 - dhein
@dhein 正如我所写的,fetch 必须跟随合并操作 - 关键是你必须"对齐"本地树和远程树(因此需要合并)-- 不过谢谢,我也在 TL;DR 中写了这个。 - linuxbandit
1
@cantaş 单独使用 fetch 不会在本地更改您的代码,因为它只获取有关远程存储库中最新更改的元数据信息。基本上,它向您提供了自上次拉取以来发生的最新情况。如果您想将实际更改带入本地存储库,则需要使用 pullpull 所做的与 fetch 相同,并且实际上获取它们。 - minasrc
fetch and merge实现了pull的功能,但允许他们先审查更改内容。 - undefined
显示剩余3条评论

139

尝试:

git fetch origin master
git merge origin master

写完这段代码后,我收到了另一个错误:(非快进)

我写的代码如下:

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp

并解决了我的问题


对我来说也一样。这解决了我的问题。有几个警告。我弄错了一个子存储库,但是通过这个链接解决了:https://dev59.com/HGIk5IYBdhLWcg3wG6w6 - M. Beausoleil
2
@Aurelio A,你的合并命令不正确,应该是git merge master - mike
2
为什么我们需要使用 git branch -D tmp 命令? - Милош Вељковић
我更喜欢这个。它完美地工作。谢谢! - Jessie M

41

你应该使用 git pull 命令,它会执行 git fetch 然后再执行 git merge

如果你使用 git push origin master --force 命令,未来可能会遇到问题。


1
如果你是项目中唯一的人,并且在尝试第一次推送时感到沮丧,那么只有在这种情况下才应该使用--force选项吗? - chrips

35

拉取(pull)始终是正确的方法,但有一种例外情况,那就是当您尝试将非Git文件系统转换为Github存储库时。在那种情况下,您需要强制执行第一个提交。

git init
git add README.md
git add .
git commit -m "first commit"
git remote add origin https://github.com/userName/repoName.git
git push --force origin master

1
对我来说可以,我重新开始了一个新项目(同一仓库),我想要替换它。 - ucotta
1
哇!谢谢!我已经寻找这个答案好几个月了!!! - user15265822

27

正如错误信息所述,您必须“先拉取(fetch)”。这对我起了作用。

使用以下命令:

  1. git fetch origin master

然后按照以下步骤合并:

  1. git pull origin master
  2. git add .
  3. git commit -m '您的提交信息'
  4. git push origin master

24

尝试使用这个git命令

git push origin master --force

或者使用强制选项 -f

git push origin master -f


3
这将覆盖git push限制,不建议团队合作使用。根据git push文档:如果在你变基时有人在你的原始历史记录上进行了构建,则远程分支的末尾可能随着她的提交而推进,并且使用--force盲目推送会丢失她的工作 - Casey

9
请按照以下步骤操作,因为我也遇到了相同的问题:
$ git pull origin master --allow-unrelated-histories 

(查看本地分支是否可以轻松合并到远程分支)

$ git push -u origin master 

现在把本地Git存储库的所有内容推送到您的在线存储库。

5

这种情况发生在你的队友已经提交代码并且他的提交位于最上方。为了避免你需要进行rebase(合并、抓取)操作。

我通过以下步骤解决了我的问题。

  1. git pull --rebase origin master
  2. git push -u origin master

你可以使用 git log 查看日志记录。


4
您可以使用以下命令: 首先,使用 --mirror 标志克隆您的存储库的新副本:
$ git clone --mirror git://example.com/some-big-repo.git

然后根据代码进行操作:

使用命令行将现有项目添加到GitHub

如果以上方法不起作用,您可以简单地编写代码:

$ git push origin master --force 

或者

$ git push origin master -f

4

最快的解决方案-

  1. 执行git log -> 您将看到有人可能在您拉取最新代码库之后推送了一些代码。
  2. 执行git pull --rebase,这将首先将HEAD回滚以重新播放您的工作,并将您提交的更改应用于其上。
  3. 现在您已准备好进行git push了。

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