如何在Git中重新设置远程分支?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我使用中间的Git存储库来镜像一个远程SVN存储库,人们可以从中克隆和工作。中间存储库有它的主分支每晚从上游的SVN重新建立,我们正在处理特性分支。例如:

remote:
  master

local:
  master
  feature

我可以成功地将我的特性分支推回远程,并得到我期望的结果:

remote:
  master
  feature

local:
  master
  feature

然后重新设置分支以跟踪遥控器:

remote:
  master
  feature

local:
  master
  feature -> origin/feature

一切都很好。我想要做的是从这里将特性分支重新定位到远程上的主分支,但是我想在本地机器上这样做。我想做的是:

git checkout master
git pull
git checkout feature
git rebase master
git push origin feature

使远程功能分支与远程主服务器保持最新状态。然而,这种方法导致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 (e.g. '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但这可能只是演示而已。

我是不是错过了什么,还是完全错了?避免在远程服务器上进行重基并不重要,但它使得修复来自重基的任何合并冲突变得更加困难。

提问于
用户回答回答于

这取决于一个人是否使用了该功能,或者其他人是否正在使用它。

如果只有你,你可以在重基之后用力推:

git push origin feature -f

然而,如果其他人正在做这件事,你应该合并,而不是重新建立在主人的基础上。

git merge master
git push origin feature

这将确保你与你正在合作的人有共同的历史。

在不同的层面上,你不应该做回-合并。所做的是通过其他不属于该特性的提交来污染您的特性分支的历史,从而使以后使用该分支的工作变得更加困难--不管是否重新定位。

用户回答回答于

很高兴你提起这个话题。

这是git中的一个重要的概念,一大批git用户将受益于了解。git重基是一个非常强大的工具,可以让您一起压缩提交、删除提交等等。但是,就像任何强大的工具一样,你需要知道你在做什么,否则你的粉丝们就会受到影响:)

当你在本地工作和处理本地分支时,只要没有将更改推送到中央存储库,就可以随心所欲地做任何事情。这意味着你可以重写你自己的历史,但不能重写其他历史。只要在本地乱搞,就不会对其他存储库产生任何影响。

这就是为什么重要的是要记住,一旦推动了提交,就不应该在以后重新设置它们的基础。这一点之所以重要,是因为其他人可能会加入你的提交,并将他们的工作建立在你对代码库的贡献的基础上,如果你稍后决定将该内容从一个地方移到另一个地方(重新设置它)并推动这些更改,那么其他人将遇到问题,不得不重新设置代码。现在假设有1000名开发人员:)它只会导致大量不必要的重做。

扫码关注云+社区