Git:推送修改后的提交记录

11

我正在从事一个项目,并使用两个不同位置的机器来完成它。我为正在开发的功能创建了一个分支,当我完成一些工作后,将修改过的提交合并到该分支上,并将其推送到服务器上,以便在其他机器上继续进行。

当我尝试发送我的改动提交时,它会拒绝我的推送。我猜测这是因为我正在推送一个旨在覆盖功能分支当前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.
2个回答

19
在这种情况下,没有办法不使用 --force 覆盖远程分支。你有2个选项:
  • 继续使用 git push --force
  • 不要使用 --amend。如果你完成的一些工作值得一个单独的提交(稳定、编译、通过更多测试等),则创建新的提交。如果不是,请创建一个临时分支(例如,如果你的分支是my-feature,则为my-feature-unstable),并在那里提交。当它再次变得稳定时,可以执行 git reset --soft my-featurecheckout my-featurecommit,从几个未完成的提交中创建一个单一的提交。之后,可以删除临时分支。

7
我会对“不要使用修订”选项进行限定:不要在已发布的作品上使用它。在未发布的作品(本地/个人分支)上,您应该绝对使用它。(如果您有多个个人存储库,这意味着有时需要使用push --force来传输您的工作。那没问题。) - Cascabel
非常感谢!现在我可以保持我的代码安全,提交日志也很干净。 - Rafael Merlin

3

还有一种更好的方式,选项是--force-with-lease。

 git push --force-with-lease

只有在你之后没有其他人推送,或者你没有在另一台机器上推送时,它才会强制更新;如果你被拒绝了,然后要再次推送前需要先fetch/rebase,这样更加安全。

来自文档的说明:

--force-with-lease单独使用,不指定具体细节,将保护所有将要更新的远程引用,要求它们的当前值与我们为它们提供的remote-tracking分支相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接