我目前正在开展一个项目,并在两个不同的位置使用机器来完成它。我已经为我正在处理的功能创建了一个分支,当我完成一些工作时,我将我的提交修改为该分支并将其推送到服务器,以便我可以从我在其他机器上停下的地方拿起。
当我尝试发送修改后的提交时,它会拒绝我的推送。我认为这是因为我推动了一个旨在破坏功能分支的当前HEAD的提交。我通常只使用--force。
有更好的方法吗?
mike@sleepycat:~/projects/myproject$ git pull origin topx
From heroku.com:myproject
* branch topx -> FETCH_HEAD
Already up-to-date.
mike@sleepycat:~/projects/myproject$ git add app/models/reward.rb
mike@sleepycat:~/projects/myproject$ git commit --amend
[topx 82a9880] Added topX reward
9 files changed, 106 insertions(+), 21 deletions(-)
rewrite app/views/ceo/_reward_criteria.html.erb (96%)
create mode 100644 public/javascripts/jquery.multiselect.min.js
create mode 100644 public/site/javascripts/jquery.multiselect.min.js
create mode 100644 public/stylesheets/jquery.multiselect.css
mike@sleepycat:~/projects/myproject$ git push origin topx
To git@heroku.com:myproject.git
! [rejected] topx -> topx (non-fast-forward)
error: failed to push some refs to 'git@heroku.com:myproject.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
答案 0 :(得分:19)
在这种情况下,如果没有--force,则无法覆盖远程分支。您有两个选择:
git push --force
--amend
。如果你已完成的某些工作需要单独的提交(足够稳定,编译,传递更多测试等等),请创建新的提交。如果没有,请创建临时分支(如果您的分支是my-feature-unstable
,则为my-feature
)并在那里提交。当它再次变得稳定时,您可以执行git reset --soft my-feature
,checkout my-feature
和commit
来从几个未完成的提交中创建分支中的单个提交。之后,可以删除临时分支。答案 1 :(得分:2)
有一个更好的方法,选项 --force-with-lease
git push --force-with-lease
如果没有人在你之后推送,或者你没有在另一台机器上推送,它只会强制更新;。如果你被拒绝了,你会在再次推送之前获取/rebase,所以以更安全的方式工作。
来自文档
<块引用>--force-with-lease 单独,不指定细节,将 通过要求保护所有将要更新的远程引用 它们的当前值与 我们为他们提供远程跟踪分支。