当我第二次推送功能分支时,我该怎么做才能避免收到以下消息:
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的文件,还是应该添加所有内容(创建一个混乱的提交)?有没有更好的方法来推送而不会收到此错误消息?
答案 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
然而,特别是在分布式团队中不建议这样做,因为它会使用您的本地分支重写远程分支,而不管其他人可能推送到它的任何更改。