【问题标题】:Merge after rebasing feature branch in git在 git 中重新设置功能分支后合并
【发布时间】:2023-03-20 15:07:01
【问题描述】:

我将我的功能分支重新设置在 origin/develop 上,使其与当前的开发状态保持一致。

git checkout feature-X
git rebase origin/develop

但是当我这样做时,我必须立即合并。这会让事情变得一团糟。

我认为 rebase 的整个想法是您可以重写历史记录(假设我们正在处理 origin/develop 的尖端),并且只有在您想要将更改集成到 origin/develop 时才需要合并。

我做错了吗?

更新:如果没有更多 git 魔法,我无法完全重现我所做的事情,但我正在尝试拼凑一个功能强大的功能分支模型,主要是在 this gist

当我在我的功能分支中时,我“git rebase origin/develop”。这完成了,但随后告诉我,我与那些我试图通过推/拉来修复的东西大相径庭。这会创建一个我认为我不想要的合并。

【问题讨论】:

  • 为什么你'必须立即合并'?你可以继续开发功能 X,只是你现在离开发分支更近了。
  • 如果我拉/推 git 强制我合并。
  • 你是什么pulling from/pushing to?顺便说一句,git pull 表示 git fetch + git merge
  • rebase 后是否更新了远程分支?
  • 我以为 git pull;混帐推;是始终保持最新状态的简单方法……所以这就是问题所在。

标签: git merge rebase


【解决方案1】:

假设feature-X 已从develop 分支出来,更好的方法是将更改从远程拉到本地develop 分支并从本地分支重新定位feature-X。这将避免合并提交。您可以稍后将 feature-X 合并到您本地的 develop 中,然后推送它。

如果 feature-X 已被推送到遥控器上,正如@crea1 所回答的那样,你将不得不在每一次从 develop 的 rebase 中运行它

git push -f origin feature-x

原因是变基为变基的提交创建了全新的提交 ID。就 git 而言,它们是新的提交。这就是导致您的 git pull 进行合并提交的原因。只要没有人使用它,强制推送应该没问题。 另外恕我直言,最好在 gitconfig 中将 pull.rebase 设置为 true。

【讨论】:

  • 所以:autosetuprebase 总是会成功,即使我执行 git pull;混帐推;那么如果可以的话,它会变基而不是创建新的合并?
  • 是的。默认情况下git pull = git fetch + git merge。这将使它成为git fetch + git rebase
  • 我刚刚尝试过,如果我不执行 push --force,我将永远无法与我发布的功能分支再次同步。我陷入了 rebase/merge 的无限循环。
  • 在变基后不执行 push --force 会适得其反。您将不断收到重复提交。
  • 这就是我发现的艰难方法。
【解决方案2】:

如果您在 origin/develop 之上 rebase feature-x,您可以在本地 repo 上执行此操作。这意味着feature-x 仍处于远程存储库中变基之前的状态。由于它们不再具有相同的祖先,git 将尝试合并。

要更新远程分支,您可以进行强制推送。

git push origin feature-x --force

但请注意,如果您以外的其他人正在处理 feature-x,并且开始推/拉它可能会变得混乱。

我发现此链接对了解 merging vs rebasing 很有用

【讨论】:

  • 指南中似乎缺少这一点。如果我不这样做而不是这样做 git pull 那么这将导致我不想要的东西,对吗? (没有其他人在开发功能分支,我更愿意公开更改和更新以供其他人试用。)
  • 没错。它将尝试将远程分支与本地分支合并,因为它们不再相同。因此,通过强制推送,您正在更新远程引用。
  • 我确实阅读了该链接。这是我必须保持打开状态才能在 git 中工作的 4-5 个选项卡之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 2012-05-08
  • 1970-01-01
相关资源
最近更新 更多