不能推到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 stashgit stash在你的分支上git stash你本地未提交的更改。

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

第3 git stash pop stash更改( 然后你可以提交popup的文件,如果你想或推先前已提交的更改(第4步),并稍后新的提交文件。

第4 git push origin branch_name -vgit 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 

除了上面的答案,下面的工作对我来说: –

情景 –

  1. 我推my_branch成功来源。
  2. 我做了几个更改。
  3. 当我试图再次推(当然做了添加,提交后),我得到了上述错误。

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 [.] 

工作。 在我的情况下,[。]确实有所改变。