在Git中重新设置远程分支
我正在使用中间Git存储库镜像远程SVN存储库,人们可以从中克隆和工作。 中间存储库的上游SVN每晚重新分配主分支,我们正在开发function分支。 例如:
remote: master local: master feature
我可以成功将我的function分支推回到远程,并最终达到我的预期:
remote: master feature local: master feature
然后我重新设置分支来跟踪远程:
remote: master feature local: master feature -> origin/feature
一切都很好。 我想从这里做的是重新分配function分支到远程的主分支,但我想从我的本地机器做到这一点。 我希望能够做到:
git checkout master git pull git checkout feature git rebase master git push origin feature
使远程function分支保持与远程主机的最新状态。 但是,这种方法会导致Git抱怨:
To <remote> ! [rejected] feature -> feature (non-fast-forward) error: failed to push some refs to '<remote>' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes (eg 'git pull') before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details.
git pull
做的伎俩,但导致一个合并提交,我想避免。 我担心的消息状态feature -> feature
而不是feature -> origin/feature
但这可能只是一个演示文稿的东西。
我是否错过了一些东西,或者完全用错误的方式来解决这个问题? 避免在远程服务器上进行重新绑定并不重要,但它可以更好地解决来自重新绑定的任何合并冲突。
这是由一个人使用的function,还是其他人正在使用的function。
如果只是你,你可以在rebase之后强制推送:
git push origin feature -f
但是,如果其他人正在处理这个问题,那么你应该合并,而不是重新脱离主人。
git merge master git push origin feature
这将确保您与您正在合作的人有共同的历史。
在另一个层面上,你不应该做反向合并。 你正在做的是用不属于该特性的其他提交来污染你的特性分支的历史logging,使得该分支的后续工作更加困难 – 重新镶嵌或不重新镶嵌。
这是我关于这个主题分支的文章。
希望这可以帮助。
很高兴你提出这个问题。
这是git中的一个重要的事情/概念,git用户会从中受益。 git rebase是一个非常强大的工具,可以让你压缩一起提交,删除提交等。但是与任何强大的工具一样,你基本上需要知道你在做什么或者一些狗屎会打到粉丝:)
当你在本地工作,并与当地分支搞混时,只要你没有将更改推送到中央存储库,你可以做任何你喜欢的事情。 这意味着您可以重写自己的历史,但不能重写其他历史。 通过只与本地的东西搞乱,没有什么会对其他库有任何影响。
这就是为什么重要的是要记住,一旦你提交了提交,以后不应该重新提交。 之所以这么做很重要,是因为其他人可能会提交你的提交,并且基于你对代码库的贡献,如果你以后决定把这个内容从一个地方转移到另一个地方,变化,那么其他人将会遇到问题,必须重新编写代码。 现在想象一下你有1000个开发者:)这只会导致很多不必要的返工。
因为您在新master
上重新设置了feature
,所以您的本地feature
不再是origin/feature
的快速转发。 所以,我认为,在这种情况下,通过执行git push origin +feature
来覆盖快进检查是完全正确的。 你也可以在你的configuration中指定这个
git config remote.origin.push +refs/heads/feature:refs/heads/feature
如果其他人在origin/feature
之上工作,他们会被这个强制更新打扰。 您可以通过将新的master
合并到feature
而不是重新绑定来避免这种情况。 结果确实是一个快速的。
你可以通过使用--force
选项来禁止检查(如果你确实知道你在做什么)。