关于git:无法推送到GitHub – 一直说需要合并


Cannot push to GitHub - keeps saying need merge

我对Github不熟悉。今天我在试图将代码推送到Github时遇到了一些问题。

1
2
3
4
5
6
7
8
Pushing to [email protected]:519ebayproject/519ebayproject.git
To [email protected]:519ebayproject/519ebayproject.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '[email protected]: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.

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


This can cause the remote repository to lose commits; use it with care.

如果不希望将远程分支合并到本地分支中(请参见与git diff的区别),并且希望执行强制push,请将push命令与-f一起使用

1
git push -f origin <branch>

其中,origin是远程回购的名称。

Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it. This flag disables the check. This can cause the remote repository to lose commits; use it with care.


信息告诉你,

Merge the remote changes (e.g. 'git pull')

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

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

1
2
3
4
5
local branch:                         --- Commit C
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

因为你是想要推动的人,所以Git强制你执行合并。要执行此操作,必须首先从原点/分支提取更改。

1
2
3
4
5
local branch:                         --- Commit C -- Commit E
                                    /               /          
                                   /               /            
                                  /               /              
origin/branch: Commit A ------ Commit B ---- Commit D

完成合并后,您现在可以通过推送更改来快速转发源站/分支以提交E。

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


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

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

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

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


这种情况通常发生在你在git commit之前,尝试在该分支x上的git pulling之前进行git push更改,而其他人已经进行了更改。

正常流量如下,

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

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

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

第四步:git push origin branch_name -v合并变更。

master替换branch_name(用于master分支)。


有时候我们忘了拉车,在当地做了很多工作。

如果有人想推而不拉,

1
git push --force

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


第一个简单的解决方案

  • 试试这个命令git push -f origin master
  • 此命令将强制执行对存储库所需的所有更改。

推荐解决方案

  • 从文件夹中删除.git目录。
  • 然后执行以下命令:

    1
    2
    3
    4
    5
    git init
    git add .
    git commit -m"First Commit"
    git remote add origin [url]
    git push -u origin master

1
git push -f origin master

只有当-u不适合你时,才使用git push -f origin master

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


有些人可能会收到这个错误,因为Git不知道您要推哪个分支。

如果您的错误消息还包括

1
2
3
4
5
error: failed to push some refs to '[email protected]: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.

然后,您可能希望遵循JimKubicek提供的便利提示,将git配置为仅推送当前分支,将默认分支设置为当前分支。

1
git config --global push.default current

1
git pull origin branch_name --rebase

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


我也有同样的问题,我做的是我第一次用这个用力推它

1
git push --force

我在提交了文件之后做了这个,并且得到了一个你所得到的错误,它提交了所有的文件,并推送了它们。下一次我推到Github的时候,我做了它要求我做的事情,然后就没事了。希望这对你也有用:)


除上述答案外,以下内容对我也有效:

情景-

  • 我成功地把我的分支推到了原点。
  • 我做了一些改变。
  • 当我再次尝试推送时(当然,在执行了添加、提交之后),我得到了上面提到的错误。
  • 解决方案-

    1
    2
    3
    4
     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**

    Proof


    我在我的教程《如何使用Github:初学者教程》中提到过这一点。

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

    1
    2
    3
    git pull https://github.com/thomas07vt/MyFirstRepo.git master

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


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

    1
    2
    git checkout foobar
    git push origin foo

    结果发现我有两个本地分支跟踪同一个远程分支:

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

    我可以通过以下方式推动我目前的分支机构:

    1
    git push origin foobar:foo

    …用git branch -d清理


    git push-f源分支名称

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


    如果您不想参与当前的项目(并且可能面临合并冲突,您不愿意解决),并且不想创建另一个分支(管理另一个分支会很麻烦),并且您不想执行任何风险和永久的git force命令(即使在阅读了它们所做的操作之后,我也常常感到惊讶)做这件事的意义)。

    解决方案:您可以简单地将文件夹的内容拖到另一个文件夹中,将项目拖到现在为空的文件夹中,将拉出来的内容拖到垃圾桶中,然后将正确的项目拖回文件夹中。您应该能够正确地推动并获得所需的结果。我花了不到10秒钟的时间。

    对于那些不说任何后果就告诉我这是不恰当的,或者人们告诉我使用一个命令来引起我未来的烦恼,我说:"这个方法实际上需要我不到10秒的时间。"如果我遇到一个执行时间不到10秒并且效果完全相同的git命令,我会采用它。在此之前,我一直在使用这种方法。

    这种方法的一个缺点是,当您实际上合并到一个分支中而没有记录合并时,提交历史将呈现线性。这可能不是处理组时的最佳方法。在这种情况下,对分支机构进行操作!


    只是有同样的问题,但在我的例子中,我在遥控器上输入了错误的分支。所以,这似乎是这个问题的另一个来源…仔细检查你是否按到正确的分支。


    我也遇到过类似的问题,结果发现我保持分支机构最新状态的工作流程出了问题。我在做以下工作:

    在我的本地"大师"中

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

    然后回到我当地的分公司

    1
    git rebase master

    这对于以前的Git流很有效,但对于GitHub却没有。git rebase是这里的问题,导致同步出现问题(我承认这是我在完全不理解的情况下不得不接受的),不幸的是,我处于这样一个位置,git push -f可能是最简单的选择。不好的。

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

    在我的地方分部

    1
    2
    git fetch upstream
    git merge upstream/master

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

    正如你可能知道的,我不是Git专家,但我得到了可靠的消息,这个工作流可能会避免我遇到的特定问题。


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

    我的解决方案:签出正确的分支,cherry从另一个本地分支中选择commit,git pull和git push


    在我的例子中,我检查了"MyBranch",并执行了git pull,所以我无法理解为什么推不起作用。最后,我意识到我推错了树枝。我在输入git push origin master,而不是git push origin mybranch

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


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

    1
    2
    3
    4
    5
    6
    7
    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
    git checkout test

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

    1
    git checkout -b testing

    现在,是时候推动它了:

    1
    git push [remote repo] testing


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


    我在将最新的更改推送到一个用于GitWeb的裸Git存储库时,也遇到了类似的错误。在我的例子中,我没有在裸存储库中做任何更改,所以我只是删除了我的裸存储库,然后再次克隆:

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

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

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

    您可以获取远程分支以获得本地副本,并检查(i)远程分支具有的内容(使用旧分支名称)和(ii)您具有的内容(使用新分支名称)之间的差异,然后决定要做什么。因为您一开始不知道远程的区别(因此出现问题),所以简单地合并或强制在某个地方进行更改太残忍了。

    查看这些差异,选择您要处理的分支,从另一个分支中挑选您想要的更改,或者恢复您不希望在现有分支中进行的更改,等等。

    然后,您应该能够决定是将干净的版本强制到远程,还是添加新的更改,或者其他什么。


    如果您确信没有人对您的Git存储库进行过更改,并且您正在开发最新版本,那么git pull在您的心中并不能作为一种解决方案…

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

    It lets you combine staged changes with the previous commit instead of committing it as an entirely new snapshot. It can also be used to simply edit the previous commit message without changing its snapshot.

    Atlassian教程:重写历史

    但是,不建议执行git commit --amend,如果您已经将提交推送到了github,这是因为"修改不仅改变了最近的提交,而且完全取代了它"。对Git来说,它看起来像是一个全新的提交",这意味着对GitHub上的其他开发人员来说,历史看起来像a->b->c,但对您来说,历史看起来像a->b->d,如果GitHub允许您执行cx1(9),其他人都必须手动修复其历史记录。

    这就是您收到错误消息! [rejected] master -> master (non-fast-forward)的原因,如果您知道没有人提取您的最新更改,您可以执行git push --force,这将更改您的公开报告中的git历史记录。否则……你可以执行git pull,但我相信这会产生与你没有通过git commit --amend相同的结果,它会创建一个新的提交(即:git pull之后的git历史:a->b->c->d)

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


    push命令的问题是您的本地和远程存储库不匹配。如果在从Git Hub创建新存储库时默认初始化自述文件,那么会自动创建主分支。但是,当你试图推动它时,它没有任何分支。你不能推…因此,最佳实践是在不进行默认自述初始化的情况下创建repo。


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


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

    我推的时候,我的服务器落后了大约12个小时。

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

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


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

    git-push.default"matching"和"simple"有什么区别?

    另外,有必要检查您当地的分支机构是否使用git remote show origin过期,并在需要时进行拉拽。


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

    `


    git pull已打印up-to-date

    解决方案:

    您可能会在远程(服务器)中创建一个存储库/项目,并在其中添加一些文件,然后在本地创建一个文件夹并初始化git git init--这是错误的,您不应该在本地创建git init,而是使用git clone将项目克隆到本地。

    然后拉