Git推被拒绝“非快进”

时间:2013-12-09 09:26:55

标签: git push rebase

我对git相当新,但目前正在使用它来管理团队环境中的代码。我有一些基础问题,我用

修复了它们
git checkout --ours filename.txt
git add filename.txt
git rebase --continue

现在我想推送我的更改,然后运行以下命令

$ git push origin feature/my_feature_branch

给了我以下错误:

To ssh://git@coderepo.com:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://git@coderepo.com:7999/repo/myproject.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.

我该怎么做才能摆脱错误?

P.S。 :我尽量避免使用--force选项。

13 个答案:

答案 0 :(得分:56)

看来,有人在您的上一个git fetchgit push之间推送了新的提交。在这种情况下,您需要重复您的步骤并再次重新my_feature_branch

git fetch
git rebase feature/my_feature_branch
git push origin feature/my_feature_branch

git fetch之后我建议用gitk --all检查情况。

答案 1 :(得分:20)

可能你没有在rebase之前获取远程更改,或者有人推送了新的更改(当你进行变基和尝试推送时)。请尝试以下步骤:

#fetching remote 'feature/my_feature_branch' branch to the 'tmp' local branch 
git fetch origin feature/my_feature_branch:tmp

#rebasing on local 'tmp' branch
git rebase tmp

#pushing local changes to the remote
git push origin HEAD:feature/my_feature_branch

#removing temporary created 'tmp' branch
git branch -D tmp

答案 2 :(得分:9)

我有这个问题! 我试过了:git fetch + git merge,但没解决! 我试过了:git pull,也没解决

然后我尝试了这个并解决了我的问题(类似于工程师的回答):

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp

答案 3 :(得分:4)

我参加聚会很晚,但是我在github help page中找到了一些有用的指示,我想在这里分享。

有时候,Git不能在不丢失提交的情况下对远程存储库进行更改。发生这种情况时,您的推送将被拒绝。

如果其他人已将您推送到同一分支,Git将无法推送您的更改:

$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

您可以通过以下方式解决此问题:将在远程分支上所做的更改与您在本地所做的更改合并:

$ git fetch origin
# Fetches updates made to an online repository
$ git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

或者,您可以简单地使用git pull一次执行两个命令:

$ git pull origin YOUR_BRANCH_NAME
# Grabs online updates and merges them with your local work

答案 4 :(得分:4)

尝试此命令

addMessageToConversation()

$ git push -f -u origin <name of branch>

答案 5 :(得分:2)

我有类似的问题,我解决了它: git pull origin

答案 6 :(得分:1)

在共享本地存储库

上写锁定

我遇到了这个问题,以上建议都没有帮助我。我能够正确地获取所有内容。但推动总是失败。它是位于Windows目录下的本地存储库,有多个客户端通过VMWare共享文件夹驱动程序使用它。似乎其中一个系统锁定了Git存储库进行写入。停止相关的VMWare系统后,导致锁定一切立即修复。几乎不可能弄清楚,哪个系统会导致错误,所以我不得不一个接一个地阻止它们直到成功。

答案 7 :(得分:1)

嗯,我在这里使用了这个建议,它把我的本地代码直接合并到主人身上。 ....所以拿出一粒盐。我的同事说以下有助于解决这个问题,需要重新分配我的分支。

 git branch --set-upstream-to=origin/feature/my-current-branch feature/my-current-branch

答案 8 :(得分:1)

对于完全相同的错误,我并不是唯一的开发人员。

所以我同时提交和推送我的更改,在 <div id="working-with-us"> 对话框弹出的底部看到:

Checked option for: Push changes immediately to origin

...但我犯了一个大错误,忘记按 Commit 按钮查看是否有最新的,但我没有。

提交成功执行,但不是推送,而是给出了同样提到的错误; ...即使其他开发人员没有更改与我相同的文件,我也无法提取最新的文件,因为出现了相同的错误。

GUI 解决方案

大多数时候我更喜欢使用 Sourcetree 的 GUI(图形用户界面)。这个解决方案可能并不理想,但是这让我重新开始工作,而不必担心我可能会丢失我的更改或损害其他开发者的最新更新。

第 1 步

右键单击您之前的提交以撤消本地提交的更改,然后像这样选择 Fetch

Sourcetree window with right-clicked commit and selecting: Reset current branch to this commit

第 2 步

一旦所有加载微调器消失并且 Sourcetree 完成加载前一个提交,在窗口的左上角,点击 Reset current branch to this commit 按钮...

Sourcetree window with with the Pull button highlighted

...然后会弹出一个对话框,点击右下角的Pull按钮:

Sourcetree window dialog popup with the OK button highlighted

第 3 步

拉取最新版本后,如果没有出现任何错误,请跳至第 4 步(下面的下一步)。否则,如果您此时发现任何合并冲突,就像我对 OK 文件所做的那样:

Sourcetree window showing the error hint: Updates were rejected because the tip of your current branch is behind

...然后单击顶部的 Web.config 按钮,将出现一个对话框弹出窗口,您需要编写一个 Descriptive-name-of-your-changes,然后单击 {{ 1}} 按钮:

Sourcetree window with Stash button highlighted and dialog popup showing input to name your stash with OK button highlighted

...一旦 Sourcetree 完成保存更改的文件,请在 STEP 2 中重复操作(上面的上一步),然后您的本地文件将具有最新更改。现在可以通过打开在 Sourcetree 左列底部看到的 Stash 重新应用您的更改,使用箭头展开您的隐藏,然后右键单击以选择 OK,然后选择 {{ 1}} 弹出对话框中的按钮:

Sourcetree window with the Stashes section expanded and changes right-clicked with Apply Stash highlighted

Sourcetree dialog popup ask your to confirm if you would like to apply stash you your local copy

如果您现在有任何合并冲突,请转到您首选的文本编辑器,例如 Visual Studio Code,并在受影响的文件中选择 STASHES 链接,然后保存:

enter image description here

然后返回 Sourcetree,点击顶部的 Apply Stash 'Descriptive-name-of-your-changes' 按钮:

enter image description here

然后右键单击冲突的文件,并在 OK 下选择 Accept Incoming Change 选项:

enter image description here

第 4 步

终于!!!我们现在可以提交我们的文件,也可以在点击 Commit 按钮之前勾选 Resolve Conflicts 选项:

enter image description here

附言在写这篇文章的时候,另一个开发者在我提交之前提交了一个提交,所以不得不重复很多步骤。

答案 9 :(得分:0)

在Eclipse中执行以下操作:

GIT存储库>遥控器>源>右键单击并说“获取”

GIT存储库>远程跟踪>选择您的分支并说合并

转到项目,右键单击文件,然后说“从上游获取”。

答案 10 :(得分:0)

  1. 将代码移至新分支-git branch -b tmp_branchyouwantmergedin
  2. 更改为要合并到的分支-git checkout mycoolbranch
  3. 重置要合并到的分支-git branch reset --hard HEAD
  4. 将tmp分支合并到所需的分支-git分支合并tmp_branchyouwantmergedin
  5. 推向起源

答案 11 :(得分:0)

这是解决此问题的另一种方法

>git pull
>git commit -m "any meaning full message"
>git push

答案 12 :(得分:-1)

  1. 撤消本地提交。这只会撤消提交并将更改保留在工作副本中
git reset --soft HEAD~1
  1. 拉动最新更改
git pull
  1. 现在您可以在最新代码的基础上提交更改