覆盖和推动Git分支

tmo*_*ain 12 git

在将我的更改与上游主服务器合并时,我经常发现自己在执行以下操作:

git checkout somefeature
git checkout -b integration
git rebase master # resolving conflicts along the way
git checkout somefeature
git merge integration # or rebase, doesn't matter in this example
Run Code Online (Sandbox Code Playgroud)

我经常发现将集成分支合并回我的功能分支会导致一些冲突失败.我遇到的第一个问题是,"如果我的集成分支是某些特征的后代并且我已经解决了与上游主人的冲突,为什么会发生这种情况呢?"

如果你想知道我为什么要使用集成分支开始,那就是防止使用半失败的合并来污染我当前的分支.

我目前的解决方法是这样做:

git checkout integration
git branch -f somefeature # overwrite the branch
Run Code Online (Sandbox Code Playgroud)

现在的问题是我无法将我的更改推回到远程分支:

git push origin somefeature
! [rejected]        somefeature -> somefeature (non-fast forward)
Run Code Online (Sandbox Code Playgroud)

所以现在我必须删除远程分支并重新推送我的更改.这不是最好的方法,所以我想知道,"覆盖分支并将更改推送到远程分支的最佳方法是什么?"

Nem*_*157 15

导致该问题的原因是git rebase生成一系列新的提交而不是来自somefeature分支,然后当您尝试将它们合并回somefeature冲突时,在rebase期间完成的解析不适用.如果您只是合并而不是rebase,那么这将起作用,因为合并提交将从somefeature分支下降.

在推送到远程分支方面,您可以使用--force推送成功,这将导致其他任何拥有它的副本的问题.

  • 请注意,您永远不应该更改已发布的提交,因为与您合作的其他人将遇到与您相同的问题,他们已经在其存储库中进行了重复但不兼容的提交.只要它只是本地的,重新定位是好的,但是重新提交并重新发布它们是邪恶的 - 因此Git的"拒绝"*错误(它很聪明并且注意到你可能做错了什么). (3认同)