推送功能分支时无法推送一些引用

时间:2013-07-28 09:09:51

标签: git push rebase

当我第二次推送功能分支时,我该怎么做才能避免收到以下消息:

To https://github.com/xxx/git_test.git
! [rejected]        feature_branch -> feature_branch (non-fast-forward)
error: failed to push some refs to 'https://github.com/xxx/git_test.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.

我的工作是:

git pull origin sprint_branch1
git checkout -b feature_branch

date > a.txt
git add a.txt 
git commit -m 'added date'

git push origin feature_branch

有人对我的功能进行了代码审查,其他人同时对sprint_branch进行了更改:

git checkout sprint_branch1
date > a.txt 
git add a.txt 
git commit -m 'added another date'
git push origin sprint_branch1

我需要改进我的功能,所以

git checkout feature_branch
git fetch origin
git rebase origin/sprint_branch1

我遇到合并冲突并执行:

nano a.txt # removing inserted merge tags
git add a.txt 
git rebase --continue

然后我改进了我的功能

date >> a.txt 
git add a.txt 
git commit -m 'add another date again'

我想推送我的feature_branch进行第二次审核

git push origin feature_branch

但是我收到了顶部提到的错误消息。 Git建议我使用git pull,但其他人建议我使用rebase工作流程。那么我应该怎么做才能推动feature_branch?我应该创建一个名为feature_branch_v2的新分支并推送它吗?在这种情况下,我是否需要手动记住要添加git的文件,还是应该添加所有内容(创建一个混乱的提交)?有没有更好的方法来推送而不会收到此错误消息?

2 个答案:

答案 0 :(得分:7)

这是你出错的地方:

git rebase origin/sprint_branch1

您不应该重新发布已发布的分支。这个命令应该是

git merge origin/sprint_branch1

一般来说,你应该小心git rebase - 它周围似乎有某种宗教信仰,即使它是一个非常危险的工具。

你怎么办?

  • 如果您绝对确定没有其他人会再次触摸功能分支,并且自上次拉动后没有人对其进行任何更改,您可以这样做

    git push -f
    

    这将用HEAD覆盖服务器上的HEAD。

  • 如果您确定自上次拉动以来没有任何变化,但其他人使用您的分支,您可以执行上述操作并告诉每个人您需要运行的分支副本

    git fetch origin
    git checkout feature_branch
    git reset --hard origin/feature_branch
    

    这会消除他们上次推动以来的所有局部变化。

  • 最安全的方法是将您的本地feature_branch重命名为其他人,找到您添加的提交,当前origin/feature_branch的分支和cherry-pick所有更改

运行gitk feature_branch origin/feature_branch以了解正在发生的事情。

答案 1 :(得分:1)

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.

您可能只需要使用rebase工作流在提交后从远程分支中提取rebase,然后推送到远程。

git commit -m 'add another date again'
git pull --rebase

这可能会导致您必须解决的rebase冲突,然后继续rebase。这主要是因为sprint_branch1中的树版本位于feature_branch后面。

您应该确保正确的提交也在进行中。在一般意义上,当您与sprint_branch1合并时,最好做一个

git checkout feature_branch
git merge sprint_branch1

这取代了rebase,因为rebase会重写你的提交,这可能会导致问题。 合并后,如果你只是推它应该工作正常。

编辑1:

如果你需要改变并仍然避免这个错误,你可以使用

git push --force origin feature_branch

然而,特别是在分布式团队中不建议这样做,因为它会使用您的本地分支重写远程分支,而不管其他人可能推送到它的任何更改。