首页 文章

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

提问于
浏览
631

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

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

30 回答

  • 4

    有些人可能会收到此错误,因为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的方便提示,Configure Git to Only Push Current Branch,将默认分支设置为当前 .

    git config --global push.default current
    
  • 653
    git pull origin branch_name --rebase
    

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

  • 3

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

    git push --force
    

    我提交文件之后我就这样做了,因为你得到了一个错误 . 它确实提交了所有文件并推送了它们 . 然后下次我推送到github . 我按照它的要求做了,然后就没事了 . 希望这也适合你:)

  • 3

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

    如果您不希望将远程分支合并到本地分支(请参阅与git diff的差异),并且想要强制推送,请使用push command with -f

    git push -f origin <branch>
    

    其中 originremote repo的名称 .

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

  • 2

    正如消息告诉你的那样,

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

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

    我将提供一个示例和图片来解释 . 让我们假设您从origin / branch的最后一次拉动是在Commit B.您已完成并提交了一些工作(Commit C) . 与此同时,其他人已完成工作并将其推送到原点/分支(提交D) . 这两个分支之间需要合并 .

    本地分支:---承诺C.
    /
    /
    /
    origin / branch:Commit A ------ Commit B ---- Commit D

    因为你是想要推送的人,Git会强制你执行合并 . 为此,您必须首先从origin / branch中提取更改 .

    本地分支:---提交C - 提交E
    //
    //
    //
    origin / branch:Commit A ------ Commit B ---- Commit D

    完成合并后,您现在可以通过推送更改将原点/分支快进到Commit E.

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

  • 2

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

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

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

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

  • 16

    这通常发生在 git commit 并在 git pulling 之前尝试 git push 更改该分支 x ,其他人已经进行了更改 .

    The normal flow would be as below,

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

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

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

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

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

  • 14

    有时我们忘了拉动并在当地环境中做了很多工作 .

    如果有人想要不拉,

    git push --force
    

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

  • -1

    如果没有其他人在使用分支,我的猜测是你做了以下事情:

    1. $git commit                    #you committed your changes. 
    2. $git push origin <branch>      #you pushed your commit to remote origin (yeah, success!)
    3. $git commit --amend            #you did some changes locally and committed with --amend 
    4. $git push origin <branch>      #you pushed the "old", just amended commit to the remote origin and you thought "WTF?".
    

    第4步是你的问题的原因,我...

  • 4

    除上述答案外,以下内容对我有用: -

    Scenario -

    • 我成功地将 my_branch 推送到原点 .

    • 我做了一些更改 .

    • 当我再次尝试推送时,(在添加,当然提交之后),我得到了上面提到的错误 .

    Solution -

    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

  • 2

    首先是简单的解决方案

    • 试试这个命令 git push -f origin master .

    • 此命令将强制执行存储库所需的所有更改 .

    推荐解决方案

    • 从文件夹中删除 .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
    

    如果 -u 不适合您,请仅使用 git push -f origin master .

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

  • 0

    我提到过这个我的教程,How To Use GitHub: A tutorial for beginners .

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

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

    git push -f origin branchname

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

  • 119

    当我尝试推送当前分支 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 进行清理

  • 20

    如果你不小心解决问题,你就不想做任何冒险和永久性的git force 命令(即使在阅读了他们所做的事情后,我也经常对这样做的意义感到惊讶) .

    Solution :您可以简单地将文件夹的内容拖到另一个文件夹中,将项目拉到现在空的文件夹中,将拉出的内容拖到垃圾箱中,然后将正确的项目拖回文件夹 . 您应该能够正确推动并获得所需的结果 . 它实际上花了我不到10秒的时间 .

    对于那些不会引用任何后果的人告诉我这是不恰当的,或者人们告诉我使用导致我未来烦恼的命令,我说:“这种方法花了我不到10秒 . ”如果我遇到一个执行时间不到10秒且具有完全相同效果的git命令,我将采用它 . 在那之前,我正在使用这种方法 .

    此方法的一个缺点是,如果在分支中实际合并而未记录合并,则提交历史记录将显示为线性 . 在处理组时,这可能不是最好的方法 . 在那些案件中分支机构工作!

  • 23

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

  • 1

    我有一个类似的问题,事实证明我保持我的分支更新的工作流程是错误的 . 我正在做以下事情:

    In my local 'master'

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

    then back in my local branch

    git rebase master
    

    这适用于以前的git流程,但不适用于github . git rebase 是这里引起同步问题的问题(而且我在没有完全理解的情况下不得不接受这个问题)并且不幸地让我处于 git push -f 可能是最简单的选择的位置 . 不好 .

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

    In my local branch

    git fetch upstream
    git merge upstream/master
    

    没有快进,因为我将在当地分支机构进行更改 .

    你可能会说,我不是git专家,但我可靠地告知,这个工作流程可能会避免我遇到的具体问题 .

  • 0

    在我的情况下,我已经签出了"mybranch"并完成了 git pull ,所以我无法工作 . 最终,我意识到我正在推动错误的分支 . 我正在输入 git push origin master 而不是 git push origin mybranch .

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

  • 6

    我遇到了同样的问题,事实证明我在一个不同的(本地)分支上,而不是我认为的那样,并且正确的本地分支落后于远程提交 .

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

  • 219

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

    如果不是,您应该签出一个与远程分支同名的新分支,然后尝试再次推送它 .

    假设您要推送的远程分支是[testing],并且您的本地分支被命名为[test] .

    如果您不在测试分支中,请先切换到它 .

    git checkout test
    

    然后打开一个新分支并命名为test .

    git checkout -b testing
    

    现在,是时候推动它了:

    git push [remote repo] testing
    
  • 187

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

    希望它会有所帮助 .

  • 45

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

  • 33

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

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

    如果你确定 no one made changes to your git repository and that you are working on the latest version, git pull doesn't make sense as a solution in your heart...

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

    它允许您将暂存的更改与先前的提交相结合,而不是将其作为一个全新的提交快照 . 它还可用于简单地编辑先前的提交消息,而无需更改其快照 .

    ATLASSIAN tutorial: rewriting history

    但是,不建议执行 git commit --amend if you have already pushed the commit to GitHub ,这是因为"amending doesn’t just alter the most recent commit—it replaces it entirely. To Git, it will look like a brand new commit"对GitHub上的其他开发人员来说意味着,历史看起来像A-> B-> C但是对于你看起来像A-> B-> D,如果是GitHub让你 push ,其他人都必须手动修复他们的历史记录

    这就是为什么你得到错误消息 ! [rejected] master -> master (non-fast-forward) 的原因,如果你知道没有人拉过你的最新更改,你可以做 git push --force ,这将 alter the git history in your public repo . 否则......你可以执行 git pull ,但我相信这会产生与你没有经过的相同的结果 git commit --amend ,它会创建一个新的提交(即:git pull之后的git历史:A-> B-> C- > d)

    更多细节:How to change your latest commit

  • 5

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

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

    您可以获取远程分支以获取本地副本,并检查(i)远程具有(使用旧分支名称)和(ii)您拥有的(使用新分支名称)之间的差异,并确定要执行的操作 . 由于你一开始并不知道遥控器的差异(因此问题),简单地在某处合并或强制改变是非常残酷的 .

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

    然后,您应该能够决定是否要将干净版本强制转移到遥控器上,或者添加新的更改等等 .

  • 3

    push命令的问题在于您的本地和远程存储库不匹配 . 如果在从git hub创建新存储库时默认初始化自述文件,则会自动创建主分支 . 但是,当你尝试推动它没有任何分支 . 你不能推...所以,最好的做法是创建没有默认自述初始化的repo .

  • 2

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

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

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

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

  • 3

    如果 git pull 打印 Already up-to-date ,那么你可能想检查全局git push.default param(在 ~/.gitconfig 中) . 如果它在 matching 中,则将其设置为 simple . 以下答案解释了原因:

    Git - What is the difference between push.default "matching" and "simple"

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

  • 0

    使用 git pull https://github.com/username/repository 它's because the Github and remote repositories aren' t同步 . 如果你 pull repo然后 Push 一切都会同步,错误就会消失 .

    `

  • 0

    git pull 打印已经 up-to-date

    解:

    您可能在远程(服务器)中创建了一个存储库/项目并在那里添加了一些文件,然后再次在本地创建了一个文件夹并初始化了git git init - 这是 mistake ,您不应该在本地创建 git init ,而是将项目克隆到你当地使用 git clone

    然后拉

相关问题