获取错误"更新被拒绝,因为您当前分支的提示落后"

时间:2015-07-20 05:25:14

标签: git github bitbucket

我的本​​地系统代码与Bitbucket的远程系统同步,但是出现了一些问题,所以我通过运行git reset --hard HEAD^删除了最后一次提交。之后,我做了一些更改并提交了这些更改。现在,当我尝试在遥控器上推送这些更改时,我收到以下消息:

[vagrant@localhost horizon]$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Password for 'https://user_name@bitbucket.org': 
To https://user_name@bitbucket.org/user_name/repo_name.git
 ! [rejected]        stable/kilo -> stable/kilo (non-fast-forward)
error: failed to push some refs to 'https://user_name@bitbucket.org/user_name/repo_name.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.   

我的问题是,如何推动这种情况?请解释一下。

2 个答案:

答案 0 :(得分:3)

您执行了以下命令:

 git reset --hard HEAD^

结果是历史重写。想象一下本地和远程的以下历史:

本地

A->B->C->D

<强>远程

A->B->C->D

现在

git reset --hard HEAD^

某些哈希值将被重写,例如:

本地

A1->B1->C1->D1

<强>远程

A->B->C->D

所以你的历史与偏远的历史是分开的。对于git来说,这意味着你需要合并。 所以,但你接下来的问题将是:如何从这种情况中拯救? 很高兴你问:

<强> 1。注意:!永远不要重置历史记录并尝试推送,特别是如果你推动--force!

  • 如果您知道自己在做什么,重新设定历史记录就可以了。

一种可能的解决方案是恢复首先重置的提交并推送此恢复的提交。但是为此你需要恢复你用git reset重置的'搞砸提交'。 您可以通过git reflog执行此操作,并从那里提取提交SHA-1并重置为此提交。然后你处于提交前的状态。 在此之后,你做git reset HEAD^并且你是安全的!

答案 1 :(得分:2)

push --force的问题是你会强迫所有其他贡献者将他们自己的本地仓库重置为新的原点/主人。

更好的替代方法是使用git revert @(在克隆之后和任何新提交之前完成),以创建取消当前HEAD的新提交。然后你可以毫无问题地推送它。