Egit拒绝了非快进式合并

104

我在向github仓库推送代码时收到了这个消息。 你能告诉我一步一步的解决方法吗? 我只推送过一次,那时是成功的。 但是,当我更新了项目并尝试推送第二次提交时,它显示“主线拒绝非快进”并且不允许我推送。 请解释一下步骤。


在使用“使用README初始化此存储库”创建新存储库后,我遇到了相同的问题。我删除了该存储库并再次创建了没有此复选框的存储库。 - andrew
@andrew 是正确的。 - Dany Wehbe
10个回答

242

我曾经遇到过同样的问题,并且已经解决了。Afk5min是正确的,问题在于你拉取代码的分支在远程仓库上已经发生了改变。根据标准的git实践(http://git-scm.com/book/en/Git-Basics-Working-with-Remotes),你需要(现在)将这些更改合并到本地更改中,然后再提交。这很有道理,它强制你接受别人的更改并将它们合并到你的代码中,确保你的代码在其他更改的情况下继续正常运行。

接下来步骤如下:

  1. 配置'fetch'以获取最初拉取的分支。

  2. 获取远程分支。

  3. 将远程分支合并到您的本地分支。

  4. 在本地存储库中提交(合并)更改。

  5. 将更改推送到远程存储库。

详细步骤如下:

  1. 在Eclipse中打开“Git Repositories”视图。

  2. 确保你可以看到你的本地仓库,并且可以将远程仓库作为子文件夹查看。在我的版本中,它被称为Remotes,然后我可以在其中看到远程项目。

  3. 查找指向左侧的绿色箭头,这是“fetch”箭头。右键单击并选择“Configure Fetch”。

  4. 你应该能看到URI,请确保它指向远程仓库。

  5. 查看弹出窗口中的引用映射部分。我的是空的。这将指示您要获取哪些远程引用。点击“添加”。

  6. 键入需要从远程仓库获取的分支名称。我的是'master'(顺便说一下,在此处下拉菜单将非常好!,现在,你必须手动输入)。继续进行弹出窗口,最终点击“完成”。

  • 点击“保存并获取”。这将获取远程参考。

  • 在本地存储库的“分支”文件夹中查看。现在您应该能在远程文件夹中看到该远程分支。同样,我看到的是 'master'。

  • 右键单击“分支”文件夹中命名为“master”的本地分支。选择“合并”,然后选择名为“origin/master”的远程分支。

  • 处理合并过程。

  • 提交任何更改到本地存储库。

  • 将更改推送到远程存储库。

  • 恭喜你,去享受美味的饮料吧!今天可以休息了。


  • 7
    应将此标记为答案。起到了很好的作用。即使我在创建Eclipse项目的GitHub仓库时没有添加任何文件(通常的README文件),问题仍会出现。非常感谢易于跟随的逐步说明。 - rbaleksandar
    这个问题让我花了一年时间才解决,直到我看了你的帖子。在我的情况下,我没有远程,但Eclipse创建了一个名为“origin”的默认远程。 - Eugene van der Merwe
    1
    虽然这样做可以起作用,但会创建一个不必要的合并提交。在这里应该使用rebase,因为你的更改只是本地的,所以你不会更改任何已发布的历史记录(如果你这样做了,git也会因为非快进推送而警告你)。我喜欢MYN的答案。 - alexia
    1
    右键单击项目,然后在主分支上执行“合并”,然后再次右键单击项目,“推送分支Master”即可。 - user1207289
    这只对我有一次帮助,但在任何其他更改中,如果明确远程没有更改任何内容,则会再次抛出rejected-non-fast-forward。 - lingar
    显示剩余4条评论

    21

    在我的情况下,我选择了推送时的Force Update复选框。它表现得非常出色。


    这对我也起作用了。在“修改”提交后,我有OP的条件。并且fetch给了我“没有要获取的内容”。 - Twilite

    12

    与此同时(当您更新项目时),其他提交已经被推送到“主”分支。因此,您必须先拉取这些更改才能推送您的更改。


    4
    在这种情况下,Git 相当愚蠢,因为我已经将所有更改推送到远程,并且我是唯一在项目上工作的人。为什么我需要在再次推送之前拉取远程?所拉取的更改原本就来自我的本地。 - Junchen Liu

    7

    适用于Eclipse Luna和Eclipse Git 3.6.1

    我:

    1. 克隆了Git存储库
    2. 更改了源代码
    3. 从Git分区视图中暂存更改
    4. 最后,提交并推送!

    但是我遇到了EGit的问题,以下是我解决问题的方法。

    是的,在我提交更改之前有人已经提交了更改。所以这些更改被拒绝了。 在出现此错误后,更改实际上被提交到了本地存储库。 我不想仅仅进行Pull更改,因为我想保持线性历史记录,正如在哪些情况下`git pull`可能会有害?中指出的那样。

    所以,我执行了以下步骤:

    从Git仓库的角度,右键单击相关的Git项目。选择Fetch from Upstream - 它会获取远程更新(ref和对象),但不会在本地进行更新。更多信息请参见git pull和git fetch有什么区别?。然后选择Rebase... - 这会打开一个弹出窗口,在其中点击Preserve merges during rebase,了解原因请参见git的rebase --preserve-merges的作用是什么(以及为什么)?。 接着点击Rebase按钮。如果存在冲突,请执行步骤6,否则执行步骤11。会出现一个名为Rebase Result的弹出窗口,请单击OK。此时将打开文件比较器,您需要修改左侧的文件。一旦正确合并更改,转到Git Staging视图。将更改加入索引即stage the changes。在同一视图中,单击Rebase->Continue。重复7到10,直到解决所有冲突。从History视图中,选择您的提交行并选择Push Commit。选择Rebase Commits of local.......复选框并单击下一步。了解原因请参见Git:从上游重新基于开发分支。最后单击Finish按钮。 注意: 如果您有多个本地仓库提交,请将它们压缩成一个提交以避免多个合并。

    我同意使用rebase而不是merge。这样做更好,因为它不会创建不必要的合并提交。(离题:Stack Overflow非常荒谬,仅仅因为我最初写了“+1 for”,就拒绝了我的评论。我的评论完全是建设性的,谢谢。) - alexia

    4

    配置 当您推送代码时,如果收到拒绝消息,请单击“配置”并单击“添加规范”,如此图所示

    源参考和目标参考 下拉菜单中单击“ref/heads/yourbranchname”,然后再次单击“添加规范”

    输入图像描述 确保选择强制更新

    输入图像描述 最后保存并将代码推送到仓库


    3
    这个错误意味着远程仓库已经有了其他的提交,超过了你本地分支的进度。
    我尝试执行 git pull 和 git push 操作。如果没有冲突的更改,git pull 会将最新的代码获取到我的本地分支,并保留我的更改。
    然后,git push 将我的更改推送到主分支。

    3

    打开 Git 视图:

    1- 选择您的项目并选择合并 2- 选择远程跟踪 3- 点击确定

    Git 将会将远程分支与本地仓库合并

    4- 然后推送


    1

    在我的情况下,我忘记从git拉取新的更改。

    1. 右键单击项目,选择“从上游获取”
    2. 右键单击项目,选择“拉取”
    3. 右键单击项目,选择“推送到上游”

    0
    我发现你必须在git的最新提交上才能进行操作。因此,需要执行以下步骤: 1)确保你没有在同一文件上工作,否则会遇到DITY_WORK_TREE错误。 2)拉取最新更改。 3)提交你的更新。
    希望这可以帮助到你。

    -2
    1. 在Github上创建一个新代码的repo。
    2. 在Eclipse中进行向上推送时,请使用新的https或ssh URL;

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