2011-01-19 72 views
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 

我通常会发现,并购整合分支回我的特性分支做失败到一些冲突。我的第一个问题是,“如果我的整合分支是某些特征的后代,并且我已经解决了与上游主方的冲突,为什么会发生这种情况?”

如果您想知道为什么我要使用集成分支开始,那是为了防止我的当前分支出现半失败合并。

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

git checkout integration 
git branch -f somefeature # overwrite the branch 

现在的问题是,我不能把我变回远程分支:

git push origin somefeature 
! [rejected]  somefeature -> somefeature (non-fast forward) 

所以现在我不得不删除远程分支并重新推送我的更改。这不是实现此目的的最佳方式,所以我想知道:“覆盖分支并将更改推送到远程分支的最佳方法是什么?”

回答

15

的问题引起的。如果你只是合并而不是rebase,那么这将工作,因为合并提交下降从somefeature分支。

就推送到远程分支而言,您只需使用--force即可使推送成功,但这会为其他任何拥有其副本的人造成问题。

+3

请注意,尽管您不应该更改已发布的提交,但与您一起工作的其他人也会遇到同样的问题,因为他们已经在其存储库中复制了不兼容的提交。只要它是本地的,重新启动就没问题,但重新提交并重新发布它们是邪恶的 - 因此Git会拒绝* *错误(这很聪明,并且指出您可能做错了事情)。 – poke 2011-01-19 21:48:54

0

你的第一点操作很奇怪。你制作一些特色的副本。你重新对抗主人。然后你回到那个特征,并将其与自身的重新设置的等价物合并。这不是做事情的方式。

不要过于复杂的事情。如果你想让功能分支在其他地方启动(比如最新的主控),只需要重新绑定它。

然后用--force(或-f)推它。告诉任何使用该功能分支的人,他们必须获取更改并调整他们本地尚未推送的任何内容。

在其他人一直在努力的情况下,合并更好。

希望这会有所帮助。因为git rebase产生了一系列新的未从somefeature分支下降,那么当你尝试,并将它们合并到somefeature解决冲突的底垫期间完成不适提交的

+1

嗯,是的印象,使somefeature的副本,然后合并,对主人将合并两个分支无需摆弄无论是原件的简单方法下。我想最好是做一个标准的rebase。谢谢。 – tmountain 2011-01-19 21:44:17

+0

您可以改为合并它。你试图做到这一点。这是问题。如果你想合并掌握或重新掌握,这取决于你。一个产生线性历史,另一个保留你分支的点。你的选择。如果您除了“移动某人的奶酪”之外还有潜在的转售路线,您将有可能解决更多冲突。 – 2011-01-19 21:48:48

4

您可以使用git merge -s recursive -Xtheirs,这将自动解决集成分支的冲突。但是,这仍然会进行合并,并且可能无法适用于移动文件等。

但是,由于您的分支被推送,您有理由希望保持其历史。为了获得您想要的理想行为,您可以在集成分支中使用“我们的”策略。

git checkout somefeature 
git checkout -b integration 
git rebase master # resolving conflicts along the way 
git merge -s ours somefeature # mark integration as superseding the somefeature branch 
git checkout somefeature 
git merge integration # this is now a fast-forward, no conflicts