我是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 回答
有些人可能会收到此错误,因为Git不知道您要尝试推送哪个分支 .
如果您的错误消息还包括
那么你可能想要按照Jim Kubicek的方便提示,Configure Git to Only Push Current Branch,将默认分支设置为当前 .
这对我有用 - 命令
git pull origin branch_name --rebase
将首先从远程branch_name提取更改,然后在其顶部提取rebase
当前分支 .我有同样的问题,我做的是我第一次用力推它
我提交文件之后我就这样做了,因为你得到了一个错误 . 它确实提交了所有文件并推送了它们 . 然后下次我推送到github . 我按照它的要求做了,然后就没事了 . 希望这也适合你:)
如果您不希望将远程分支合并到本地分支(请参阅与git diff的差异),并且想要强制推送,请使用push command with -f
其中
origin
是remote repo的名称 .正如消息告诉你的那样,
使用
git pull
将最新更改从远程存储库提取到本地存储库 . 在这种情况下,提取更改将需要合并,因为您已对本地存储库进行了更改 .我将提供一个示例和图片来解释 . 让我们假设您从origin / branch的最后一次拉动是在Commit B.您已完成并提交了一些工作(Commit C) . 与此同时,其他人已完成工作并将其推送到原点/分支(提交D) . 这两个分支之间需要合并 .
因为你是想要推送的人,Git会强制你执行合并 . 为此,您必须首先从origin / branch中提取更改 .
完成合并后,您现在可以通过推送更改将原点/分支快进到Commit E.
Git要求您自己处理合并,因为合并可能会导致冲突 .
你在推送之前更新了代码吗?
在推送任何东西之前使用
git pull origin master
.我假设您使用
origin
作为遥控器的名称 .您需要在推送之前提取,以便在推送内容之前使本地存储库保持最新状态(以防其他人已经在
github.com
上更新了代码) . 这有助于在本地解决冲突 .这通常发生在
git commit
并在git pulling
之前尝试git push
更改该分支x
,其他人已经进行了更改 .The normal flow would be as below,
STEP 1 :
git stash
您在该分支上的本地未提交更改 .STEP 2 :
git pull origin branch_name -v
到pull and merge
到该分支上的本地提交的更改(给这个合并一些消息,并修复冲突,如果有的话 . )STEP 3 :
git stash pop
stash
ed更改(如果您需要或者先推送已提交的更改(STEP4),您可以对弹出的文件进行提交,然后再对文件进行新的提交 . )STEP 4 :
git push origin branch_name -v
合并后的更改 .将
branch_name
替换为master
(对于master
分支) .有时我们忘了拉动并在当地环境中做了很多工作 .
如果有人想要不拉,
工作中 . 在与其他人合作时不建议这样做,但是当您的工作是简单的事情或个人玩具项目时,它将是一个快速的解决方案 .
如果没有其他人在使用分支,我的猜测是你做了以下事情:
第4步是你的问题的原因,我...
除上述答案外,以下内容对我有用: -
Scenario -
我成功地将 my_branch 推送到原点 .
我做了一些更改 .
当我再次尝试推送时,(在添加,当然提交之后),我得到了上面提到的错误 .
Solution -
首先是简单的解决方案
试试这个命令
git push -f origin master
.此命令将强制执行存储库所需的所有更改 .
推荐解决方案
从文件夹中删除
.git
目录 .然后执行以下命令:
要么
如果
-u
不适合您,请仅使用git push -f origin master
.这将解决推送文件时发生的几乎任何类型的错误 .
我提到过这个我的教程,How To Use GitHub: A tutorial for beginners .
当您在GitHub上创建新存储库时,GitHub可能会要求您创建自述文件 . 如果您直接在GitHub上创建自述文件,那么您需要先在“推送”请求成功之前发出“拉”请求 . 这些命令将“拉”远程存储库,将其与当前文件合并,然后将所有文件“推送”回GitHub:
git push -f origin branchname
仅当您确定不需要远程分支代码时才使用上述命令,否则先进行合并然后再按下代码
当我尝试推送当前分支
foobar
时,我收到了上述错误消息:事实证明我有两个本地分支跟踪同一个远程分支:
通过使用以下方法,我可以推送当前的分支:
...并使用
git branch -d
进行清理如果你不小心解决问题,你就不想做任何冒险和永久性的git
force
命令(即使在阅读了他们所做的事情后,我也经常对这样做的意义感到惊讶) .Solution :您可以简单地将文件夹的内容拖到另一个文件夹中,将项目拉到现在空的文件夹中,将拉出的内容拖到垃圾箱中,然后将正确的项目拖回文件夹 . 您应该能够正确推动并获得所需的结果 . 它实际上花了我不到10秒的时间 .
对于那些不会引用任何后果的人告诉我这是不恰当的,或者人们告诉我使用导致我未来烦恼的命令,我说:“这种方法花了我不到10秒 . ”如果我遇到一个执行时间不到10秒且具有完全相同效果的git命令,我将采用它 . 在那之前,我正在使用这种方法 .
此方法的一个缺点是,如果在分支中实际合并而未记录合并,则提交历史记录将显示为线性 . 在处理组时,这可能不是最好的方法 . 在那些案件中分支机构工作!
刚刚遇到同样的问题,但在我的情况下,我在遥控器上键入了错误的分支 . 所以,这似乎是这个问题的另一个来源......仔细检查你是否正在推动正确的分支 .
我有一个类似的问题,事实证明我保持我的分支更新的工作流程是错误的 . 我正在做以下事情:
In my local 'master'
then back in my local branch
这适用于以前的git流程,但不适用于github .
git rebase
是这里引起同步问题的问题(而且我在没有完全理解的情况下不得不接受这个问题)并且不幸地让我处于git push -f
可能是最简单的选择的位置 . 不好 .我的新流程是使用
git merge
直接更新分支,如下所示:In my local branch
没有快进,因为我将在当地分支机构进行更改 .
你可能会说,我不是git专家,但我可靠地告知,这个工作流程可能会避免我遇到的具体问题 .
在我的情况下,我已经签出了"mybranch"并完成了
git pull
,所以我无法工作 . 最终,我意识到我正在推动错误的分支 . 我正在输入git push origin master
而不是git push origin mybranch
.因此,如果您已经完成了
git pull
并仍然收到此消息,请确保您正在推送正确的分支 .我遇到了同样的问题,事实证明我在一个不同的(本地)分支上,而不是我认为的那样,并且正确的本地分支落后于远程提交 .
我的解决方案:签出正确的分支,从其他本地分支中挑选提交,git pull和git push
您的分支名称是否与远程分支名称相同?
如果不是,您应该签出一个与远程分支同名的新分支,然后尝试再次推送它 .
假设您要推送的远程分支是[testing],并且您的本地分支被命名为[test] .
如果您不在测试分支中,请先切换到它 .
然后打开一个新分支并命名为test .
现在,是时候推动它了:
我已经在我的GIT存储库中解决了这个问题 . 在这种情况下,无需
rebase
或force
提交 . 使用以下步骤解决此问题 -希望它会有所帮助 .
另一个解决方案是如果可以的话,通过再次提交来推进遥控器的头部 . 将此高级头部拉入本地子树后,您将能够再次从中推出 .
在将最新的更改推送到我用于gitweb的裸Git存储库时,我遇到了类似的错误 . 在我的情况下,我没有在裸存储库中进行任何更改,所以我只是删除了我的裸存储库并再次克隆:
如果你确定 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
另一个选项:将您的分支本地重命名为新的分支 .
然后,您将能够将其推送到远程存储库,例如,如果这是您保留副本(备份)并确保不会丢失的方式 .
您可以获取远程分支以获取本地副本,并检查(i)远程具有(使用旧分支名称)和(ii)您拥有的(使用新分支名称)之间的差异,并确定要执行的操作 . 由于你一开始并不知道遥控器的差异(因此问题),简单地在某处合并或强制改变是非常残酷的 .
查看差异,选择您想要处理的分支,从其他分支中选择您想要的更改,或者在您拥有的分支上恢复您不想要的更改等 .
然后,您应该能够决定是否要将干净版本强制转移到遥控器上,或者添加新的更改等等 .
push命令的问题在于您的本地和远程存储库不匹配 . 如果在从git hub创建新存储库时默认初始化自述文件,则会自动创建主分支 . 但是,当你尝试推动它没有任何分支 . 你不能推...所以,最好的做法是创建没有默认自述初始化的repo .
这个问题的另一个原因(显然不那么常见)......
当我推动时,我的服务器落后了大约12个小时
我在服务器上配置了NTP我的时钟 .
我执行了一个新的git push,导致了这篇文章中讨论的错误 .
如果
git pull
打印Already up-to-date
,那么你可能想检查全局gitpush.default
param(在~/.gitconfig
中) . 如果它在matching
中,则将其设置为simple
. 以下答案解释了原因:Git - What is the difference between push.default "matching" and "simple"
此外,值得检查您的本地分支是否已过期使用
git remote show origin
并在需要时进行拉取使用
git pull https://github.com/username/repository
它's because the Github and remote repositories aren' t同步 . 如果你pull
repo然后Push
一切都会同步,错误就会消失 .`
git pull
打印已经up-to-date
解:
您可能在远程(服务器)中创建了一个存储库/项目并在那里添加了一些文件,然后再次在本地创建了一个文件夹并初始化了git
git init
- 这是 mistake ,您不应该在本地创建git init
,而是将项目克隆到你当地使用git clone
然后拉