【问题标题】:Remove an unwanted merge commit and rebase instead with Git使用 Git 删除不需要的合并提交和变基
【发布时间】:2014-06-24 10:06:06
【问题描述】:

我有一个特性分支开发。我开始使用使用开发而不是合并来重新定位我的功能分支的做法,因为线性提交历史的好处适用于我的项目,该项目具有一些上游和下游存储库。

我处于有人将开发合并到功能分支并进行更多提交然后推送到远程的情况。我希望能够得到我删除合并提交和樱桃选择分支上的后续提交的点。这是因为在分支上工作的其他人将不得不基本上删除他们本地的并删除修改后的。我在一个小团队中工作,这是可以管理的。

最好的方法是选择所有提交栏合并提交的交互式 rebase 吗?

所以git rebase -i commit-sha-before-merge

我知道这很可能会导致构建损坏,因为合并后发生的提交依赖于合并中的代码。我将通过最终使用开发重新调整我的功能分支来解决这个问题。

【问题讨论】:

  • 与大多数 git 一样,不一定有 最佳 方式,但这通常会起作用。就我个人而言,我可能会创建一个新分支并执行一系列git cherry-pick 操作来引入项目,并可能在我去的时候修复它们。交互式变基是一系列自动挑选操作(加上最后的标签移动),所以这实际上几乎是一样的,但让我可以停下来休息更多。 :-)
  • 是的,我肯定要备份分支哈!我认为交互式 rebase 意味着我的工作量减少了,但正如您所说,一系列手动挑选的樱桃可以提供更多控制权。

标签: git git-merge rebase


【解决方案1】:

正如 torek 指出的 in the comments,在 Git 中有不止一种方法可以做到这一点。例如,假设您有一个这样的提交图:

develop *-------*
         \       \
  feature *---*---*---*---*
          X   M^  M   Y^  Y

X 是您的功能分支上的第一次提交,M 是与开发的合并提交,Y 是功能分支上的最后一次提交。

解决方案 1:变基

这依赖于这样一个事实:将一个分支 B 重新定位到另一个分支 A 上相当于将分支 A 合并到 B。在这种情况下,我们将使用两个 rebase,一个用于 rebase 功能分支提交 before 合并提交,另一个用于 rebase 提交 after 合并:

# Create a temporary branch at the commit right before the merge commit M
git checkout -b temp M^

# Rebase onto the develop branch
git rebase develop

# Now rebase the remaining commits after M onto the temp branch
git rebase --onto temp M feature

这将产生以下提交图

        X   M^  Y^  Y
*---*---*---*---*---*
    ^       ^       ^
 develop   temp  feature

所以现在您可以使用git branch --delete temp 删除临时分支。

解决方案 2:樱桃采摘

以下是使用cherry-picks 实现相同结果的方法,例如torek suggested

# Temporarily hard reset feature to the develop branch
git checkout feature
git reset --hard develop

# Cherry-pick all commits between X to M^.
# The start of the cherry-pick range is exclusive, i.e. it doesn't include
# the starting point X^.
git cherry-pick X^..M^

# Cherry-pick all commits between M to Y
git cherry-pick M..Y

文档

【讨论】:

  • 我可以确认在我的功能分支上执行 git reset --hard develop 将使 M..Y 的提交保持不变吗?他们不会迷路吗?
  • 所以只需阅读 git reset --hard - 提交将在我的 reflog 中可用。
  • @user3406268 对,他们将在您的reflog 中。或者只是将他们的提交 shas 复制到某个地方,这样你就会记住它们。
猜你喜欢
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2017-01-24
  • 2021-04-20
相关资源
最近更新 更多