首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Git中重置远程分支的基础

在Git中重置远程分支的基础
EN

Stack Overflow用户
提问于 2011-06-01 18:43:01
回答 5查看 176.4K关注 0票数 156

我正在使用一个中间的Git存储库来镜像一个远程SVN存储库,人们可以从其中进行克隆和工作。中间存储库的主分支每晚从上游SVN重新定位,我们正在处理功能分支。例如:

代码语言:javascript
复制
remote:
  master

local:
  master
  feature

我可以成功地将我的功能分支推送回遥控器,并最终得到我期望的结果:

代码语言:javascript
复制
remote:
  master
  feature

local:
  master
  feature

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

代码语言:javascript
复制
remote:
  master
  feature

local:
  master
  feature -> origin/feature

一切都很好。我想从这里做的是将feature分支重新设置为远程主机上的主分支,但我希望在本地计算机上执行此操作。我希望能够做到:

代码语言:javascript
复制
git checkout master
git pull
git checkout feature
git rebase master
git push origin feature

使远程功能分支与远程主节点保持同步。然而,这种方法会导致Git抱怨:

代码语言:javascript
复制
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,但这可能只是一个表示问题。

我是不是错过了什么,或者以完全错误的方式来做这件事?避免在远程服务器上执行rebase并不重要,但这会使修复来自rebase的任何合并冲突变得更加困难。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-02 00:49:52

归根结底,这个功能是由一个人使用的,还是其他人正在使用它的。

如果只有你一个人,你可以在rebase之后强制推送:

代码语言:javascript
复制
git push origin feature -f

但是,如果其他人正在处理它,您应该合并,而不是从master重新建立基础。

代码语言:javascript
复制
git merge master
git push origin feature

这将确保您与与您合作的人有共同的历史。

在不同的层面上,你不应该做反向合并。你所做的是用其他不属于该功能的提交来污染你的功能分支的历史记录,使得后续的工作变得更加困难-不管是不是重新建立基础。

这是我的一篇题为branch per feature的文章。

希望这能有所帮助。

票数 213
EN

Stack Overflow用户

发布于 2011-06-02 03:24:01

很高兴你提出了这个话题。

这是git中一个重要的东西/概念,许多git用户将从了解中受益。git rebase是一个非常强大的工具,可以让你一起挤压提交,删除提交等。但和任何强大的工具一样,你基本上需要知道你在做什么,否则可能会出现真正的错误。

当您在本地工作并处理本地分支时,只要您没有将更改推送到中央存储库,就可以做任何您想做的事情。这意味着你可以重写自己的历史,但不能重写其他人的历史。通过只摆弄你本地的东西,任何东西都不会对其他库产生任何影响。

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

票数 36
EN

Stack Overflow用户

发布于 2011-06-01 20:19:38

因为您在新的master之上重新建立了feature的基础,所以您的本地feature不再是origin/feature的快进。所以,我认为,在这种情况下,完全可以通过执行git push origin +feature来覆盖快进检查。您也可以在配置中指定这一点

代码语言:javascript
复制
git config remote.origin.push +refs/heads/feature:refs/heads/feature

如果其他人在origin/feature上工作,他们会受到这种强制更新的干扰。您可以通过将新的master合并到feature中而不是重新设置基址来避免这种情况。结果确实是快进的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6199889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档