不能推到GitHub – 一直说需要合并
我是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 (eg 'git pull') hint: before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
我还没有推出任何东西,所以为什么我需要拉东西?
这可能会导致远程存储库丢失提交; 小心使用它。
如果你不希望将远程分支合并到你的本地分支(请参阅与git diff的区别 ),并且想要进行强制推送,请使用带-f的push命令
git push -f origin <branch>
origin
是您远程回购的名称。
通常情况下,该命令拒绝更新远程引用,该引用不是本地引用的祖先,用于覆盖它。 此标志禁用检查。 这可能会导致远程存储库丢失提交; 小心使用它。
正如信息告诉你的,
合并远程更改(例如'git pull')
使用git pull
将最新的更改从远程存储库git pull
到本地存储库。 在这种情况下,更改将需要合并,因为您已经对本地存储库进行了更改。
我会提供一个例子和一张图片来解释。 让我们假设你最后一次从源头/分支拉到了提交B.你已经完成并提交了一些工作(提交C)。 与此同时,别人已经完成了工作并将其推到了起源/分支(提交D)。 这两个分支之间需要合并。
local branch: --- Commit C / / / origin/branch: Commit A ------ Commit B ---- Commit D
因为你是想要推动的人,所以Git强迫你进行合并。 要做到这一点,你必须首先从原产地/分公司获取更改。
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
并尝试在git pulling
那个其他人已经进行更改的分支x
之前git push
更改。
正常stream量如下,
第1 git stash
: git stash
在你的分支上git stash
你本地未提交的更改。
第2 git pull origin branch_name -v
: git pull origin branch_name -v
pull and merge
到该分支的本地提交的更改( 给这个合并一些消息,并修复冲突,如果有的话)。
第3 步 : git stash pop
stash
更改( 然后你可以提交popup的文件,如果你想或推先前已提交的更改(第4步),并稍后新的提交文件。
第4 git push origin branch_name -v
: git push origin branch_name -v
合并的更改。
用master
(用于master
分支)replacebranch_name
。
有时候我们忘了拉,在当地做了很多的工作。
如果有人想拉不拉,
git push --force
工作中。 与其他人一起工作时不推荐这样做,但是当你的工作是简单的事情或个人玩具项目时,这将是一个快速的解决scheme。
你们中的一些人可能会得到这个错误,因为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的提示, configurationGit到只有当前分支来设置默认分支到当前。
git config --global push.default current
我在我的教程中提到过, 如何使用GitHub:初学者教程 。
当你在GitHub上创build一个新的仓库时,GitHub可能会要求你创build一个自述文件。 如果你直接在GitHub上创build一个自述文件,那么在“推送”请求成功之前,你需要先做一个“pull”请求。 这些命令将“拉”远程仓库,将其与当前文件合并,然后将所有文件“推送”回GitHub:
git pull https://github.com/thomas07vt/MyFirstRepo.git master git push https://github.com/thomas07vt/MyFirstRepo.git master
除了上面的答案,下面的工作对我来说: –
情景 –
- 我推my_branch成功来源。
- 我做了几个更改。
- 当我试图再次推(当然做了添加,提交后),我得到了上述错误。
scheme –
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**
git push -f origin branchname
只有当您确定不需要远程分支代码时才使用上述命令,否则先合并,然后再推送代码
刚刚有同样的问题,但在我的情况下,我已经在遥控器上键入错误的分支。 所以,这似乎是这个问题的另一个来源…仔细检查你推动到正确的分支。
我有一个类似的问题,事实certificate,我的工作stream程保持我的分支是最新的错误。 我正在做以下工作:
在我当地的“大师”
git fetch upstream git merge upstream/master --ff-only
然后回到我的本地分支
git rebase master
这在以前的gitstream程中运行良好,但不适用于github。 git rebase
是这里的问题,导致同步问题(我承认这是我不得不接受的东西,如果没有完全理解),不幸的是把我放在一个地方, git push -f
可能成为最简单的select。 不好。
我的新stream程是使用git merge
直接更新分支,如下所示:
在我的本地分支
git fetch upstream git merge upstream/master
没有快速发展,因为我会在当地的分支机构做出改变。
正如你可能会说,我不是混帐专家,但我可靠地被告知,这个工作stream程可能会避免我有的具体问题。
我遇到了同样的问题,事实certificate,我在一个不同的(本地)分支上,比我想象的要好,并且正确的本地分支在远程提交后面。
我的解决scheme:签出正确的分支,从其他本地分支挑选提交,git pull和git push
在将最新的更改推送到我用于gitweb的裸露Git存储库时,发生了类似的错误。 在我的情况下,我没有在裸仓库中进行任何更改,所以我只是删除了我的裸仓库,然后再次克隆:
git clone --bare <source repo path> <target bare repo path>
当我试图推送我当前的分支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
进行清理
我已经在我的GIT存储库中解决了这个问题。 在这种情况下,不需要重新设定或force
提交。 使用以下步骤来解决这个问题 –
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>
希望这会有所帮助。
在我的情况下,我有“mybranch”检查出来,并已完成git pull
,所以我不明白为什么推不工作。 最终,我意识到我在推错一个分支。 我input的是git push origin master
而不是git push origin mybranch
。
所以,如果你已经完成了git pull
并仍然得到这个消息,确保你正在推送正确的分支。
另一个解决scheme是通过提交另一个提交,如果可以的话,推进遥控器的头部。 将这个高级头部拉到当地的子树后,您将可以再次从中推出。
您的分行名称与远程分行名称相同吗?
如果不是,则应该检出与远程分支名称相同的新分支,然后再次尝试推送。
假设您要推送的远程分支是[ testing ],并且您的本地分支被命名为[ test ]。
如果你不在testing分支,首先切换到它。
git checkout test
然后打开一个新的分支,并将其命名为testing 。
git checkout -b testing
现在是时候推出它了:
git push [remote repo] testing
如果您确定没有人对您的git存储库进行更改,并且您正在使用最新版本,那么git pull
在您的心中就没有任何意义了。
那么这可能是发生了什么,你用git commit --amend
它可以让您将分阶段的更改与之前的提交结合起来,而不是将其作为全新的快照进行提交。 它也可以用来简单地编辑上一个提交消息而不改变它的快照。
ATLASSIAN教程:重写历史
然而, 如果你已经把提交提交给GitHub ,那么不build议执行git commit --amend
,这是因为“修改不仅仅改变了最近的提交 – 它完全替代了它。对于Git,它看起来像一个全新的提交“,这意味着其他开发人员在你的GitHub,历史看起来像A-> B-> C,但对你来说,它看起来像A-> B-> D,如果GitHub让你push
,其他人将不得不手动修复他们的历史
这就是你得到错误信息的原因! [rejected] master -> master (non-fast-forward)
如果你知道没有人拉你最新的变化,你可以做git push --force
,这会改变公共回购中的git历史 。 否则…你可以执行git pull
,但我相信这将有相同的结果,因为你没有通过git commit --amend
,它会创build一个新的提交(即:git pull后的git历史:A-> B-> C-> d)
有关更多详细信息: 如何更改您的最新提交
如果你不想拉入你当前的项目(并且可能面临合并冲突,你不需要解决),你不想创build另一个分支(这将是繁琐的pipe理另一个分支),你不想我不想做任何有风险的永久性的git force
命令(甚至在读完它们所做的事情之后,我常常会惊讶于这样做的意义)。
解决scheme :您可以简单地将文件夹的内容拖到另一个文件夹中,将项目拖到现在为空的文件夹中,将拉出的内容拖到垃圾箱,然后将正确的项目拖回到文件夹中。 您应该能够正确推动并获得所需的结果。 从字面上来说,我不到10秒就可以做到这一点。
对于那些没有引用任何后果的人来说,这是不合适的,或者人们告诉我使用一个引起我未来烦恼的命令,我会说:“这个方法从字面上来说不到10秒钟。 如果我遇到一个不到10秒钟执行的git命令,并且具有完全相同的效果,我会采用这个命令。 在那之前,我正在使用这种方法。
这种方法的一个缺点是,如果在没有logging合并的情况下实际合并到分支中,则提交历史logging将显示为线性。 与团队合作时,这可能不是最好的方法。 在这些情况下在分支机构工作!
如果任何机会git pull
打印Already up-to-date
那么你可能想要检查全局git push.default
参数(在~/.gitconfig
)。 将它设置为simple
如果它在matching
。 以下答案解释了原因:
Git – push.default“匹配”和“简单”之间的区别是什么?
此外,值得检查你的本地分支是否过时使用git remote show origin
,如果需要拉动
假设没有其他人正在与分支机构合作,我的猜测是你做了以下事情:
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步是你的问题的原因,恕我直言…
这个问题的另一个原因(显然不是那么常见)…
当我推送时,我的服务器已经晚了12个小时
我在服务器SYNC我的时钟configurationNTP。
我执行了一个新的git push,导致了这篇文章中讨论的错误。
我也得到了同样的错误,并不是100%确定这是否适用于所有人,但对我而言,
git pull [.]
工作。 在我的情况下,[。]确实有所改变。