在尝试更新新创建的远程分支时,我被“拒绝”

时间:2011-09-06 07:22:41

标签: git

这已经发生在我身上好几次,我不明白为什么,所以我想我会问......这基本上就是我做的事情:

get fetch --all
git push origin my_new_branch

Counting objects: 68, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (43/43), done.
Writing objects: 100% (43/43), 6.68 KiB, done.
Total 43 (delta 34), reused 0 (delta 0)
To git@github.com:FooBar/foobar.git
* [new branch]      my_new_branch -> my_new_branch

然后我意识到..哎呀,我忘了确保我的新分支与主人同在......

git checkout master
git pull --rebase
git checkout my_new_branch
git rebase master
git push origin my_new_branch

To git@github.com:FooBar/foobar.git
 ! [rejected]        my_new_branch -> my_new_branch (non-fast-forward)
error: failed to push some refs to 'git@github.com:FooBar/foobar.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.

为什么会这样?更重要的是,我怎么能让它不发生(除了做-f和强制它......)?

2 个答案:

答案 0 :(得分:3)

您应该使用-f强制它。这就是它的用途。

默认情况下,Git拒绝推送不是前一个值后代的ref的新值。这是一项安全措施。如果其他人将他们的工作建立在旧的参考上并且你倒回它,那么你将给他们带来很多麻烦(好吧,没有人无法处理,但他们需要知道关于它)。

如果您需要快速解决错误,请继续,重新定位并强制推送。如果它是你自己的分支,你只是为了向某人展示它,但没有人应该把它们的工作建立在它之上并且每个人都知道它们不应该,只需继续,重新加入并强制推动。如果要以任何其他方式更新分支,请合并,不要重新绑定。

答案 1 :(得分:0)

当你重新分支一个分支时,构成它的一些提交会丢失,并且在你正在重新定位的分支之上重新进行新的提交。这意味着rebase不会保留分支的所有历史记录。当您推送分支时,您推送的分支的头部必须包含要替换的分支的所有历史记录,以便您不会丢失来自远程分支的任何提交。

发布分支时,应避免重新定位。简单地将“master”合并到“my_new_branch”将使分支更新w.r.t master并避免你必须倒回远程分支。

要实现这一目标,您可以reset将您的“my_new_branch”改为:

# (assuming no uncommitted changes that need preserving)
git reset --hard origin/my_new_branch

然后合并并推送:

git merge master
# resolve conflicts if needed.
git push origin my_new_branch