覆盖和推送Git分支

覆盖和推送Git分支,git,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 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)

因此,现在我必须删除远程分支并重新推送我的更改。这不是实现这一点的最佳方式,因此我想知道,“覆盖分支并将更改推送到远程分支的最佳方式是什么?”

您可以确保最终合并使用合并驱动程序覆盖目标分支:
例如,请参见“”


这个想法是有一个。

您的第一个操作非常奇怪。你复制了一些特征。你把它重新设定为对主人的攻击。然后返回到该特性,并将其与自身的重定基等价物合并。这不是做事的方式

不要把事情复杂化。如果您想让功能分支从其他地方开始(比如最新的主功能),只需重新设置其基础

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

当其他人一直在进行合并时,合并会更好


希望这能有所帮助。

问题的原因是,
git rebase
生成了一系列新的提交,这些提交不是从
somefeature
分支派生的,然后当您尝试将它们合并回
somefeature
时,在rebase过程中完成的冲突解决方案不适用。如果您只是合并而不是重新基础,那么这将起作用,因为合并提交将从
somefeature
分支下降


就推送到远程分支而言,您可以使用
--force
使推送到成功,但这会给其他拥有该分支副本的人带来问题。

您可以使用
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

呃,我的印象是,复制某个功能,然后将其与主功能合并,这将是合并两个分支的简单方法,而不会与任何一个原始功能混淆。我认为只做一个标准的重基比较好。谢谢。你可以合并它。你想两者都做。这就是问题所在。这取决于您是否要合并到master或重新设置到master。一个生成线性历史,另一个保留分支的点。你的选择。除了“移动某人的奶酪”之外,如果您采取重新基础路线,您还可能需要解决更多的冲突。但是,一般来说,Nemo157的解决方案更好——对于在非本地回购中发布的功能分支,只需从一开始就使用合并而不是重新基础。git就是这样设计的。我不知道“我们的”合并策略。这似乎是我一直在寻找的解决方案。非常感谢。请注意,您永远不应该更改已发布的提交,因为与您一起工作的其他人将遇到与您相同的问题,他们已经在其存储库中复制了不兼容的提交。只要是本地的,重新定基就可以了,但重新定基提交和重新发布它们是邪恶的——因此Git出现了“拒绝”错误(它很聪明,并注意到您可能做错了什么)。啊,我使用merge是为了一步一步解决冲突,而不考虑提交不会是somefeature分支的后代。接受这个作为我问题的真实答案。非常感谢!