160

我正在使用中间 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,但这可能只是一个演示文稿。

我是否遗漏了什么,或者以完全错误的方式解决这个问题?避免在远程服务器上执行 rebase 并不重要,但它使修复 rebase 中的任何合并冲突变得更加困难。

4

5 回答 5

219

这取决于该功能是由一个人使用还是其他人正在使用它。

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

git push origin feature -f

但是,如果其他人正在处理它,您应该合并而不是从 master 中变基。

git merge master
git push origin feature

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

在不同的层面上,您不应该进行反向合并。您正在做的是用不属于该功能的其他提交污染您的功能分支的历史记录,从而使该分支的后续工作更加困难 - 是否重新设置基准。

这是我关于每个功能分支的主题的文章。

希望这可以帮助。

于 2011-06-01T16:49:51.997 回答
38

很高兴你提出这个话题。

这是 git 中的一个重要事物/概念,许多 git 用户将从中受益。git rebase 是一个非常强大的工具,使您能够将提交压缩在一起,删除提交等。但是与任何强大的工具一样,您基本上需要知道自己在做什么,否则可能会出错。

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

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

于 2011-06-01T19:24:00.867 回答
6

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

git config remote.origin.push +refs/heads/feature:refs/heads/feature

如果其他人在上面工作origin/feature,他们会被这种强制更新打扰。您可以通过合并新的而不是变基来避免这种master情况feature。结果确实会快进。

于 2011-06-01T12:19:38.383 回答
0

我不熟悉使用 GitBash,我在这里为那些使用 Windows 的开发人员添加了一个使用 TortoiseGit(新手 GUI)的答案:

使用 TortoiseGit 强制使用本地分支重新建立远程分支

就像上面提到的许多人一样,如果仅使用您的“私人”回购分支来执行此操作,这意味着没有人会因为使用您的本地副本重新构建远程“开发”或“功能”分支而向您扔椅子。其他已经提交并推动了他们一周价值(或更多)工作的开发人员将从分支的历史记录(日志)中删除。

将无法恢复它们 - 当然,您的共同开发人员仍将对其进行更改,因为他们的 PULL 很可能会引发错误,因为他们将远远领先于分支当前历史或最新提交与他们的。好在 Git 是一个分布式版本控制系统。

因此,请小心使用此功能来恢复远程分支。特此警告您。;)

于 2021-11-18T01:26:11.203 回答
-1

您可以通过--force使用git push.

于 2011-06-01T10:55:35.963 回答