【问题标题】:Git Rebase already merged branchGit Rebase 已合并分支
【发布时间】:2021-03-28 02:07:45
【问题描述】:

我从名为my-feature 的主develop 分支创建了功能分支,还有另一个开发人员another-feature 创建了另一个功能分支。

我们都在不同的文件中进行更改

另一位开发者已创建 PR,但尚未合并到 develop。但是,我需要他对我的分支进行更改,所以我对我的 my-feature 分支做了git merge another-feature 并创建了拉取请求。

但是,现在主要问题是,我可以看到 another-feature 分支到我的拉取请求 my-feature 的变化。那么,我该如何重新设置呢?我不想显示来自另一个分支的更改。

我查看了另一个帖子,但其中一些对我来说不太理解。

任何帮助将不胜感激。

编辑:

git log 显示如下。 (目标分支为develop

commit: f0fdfddsdsde
Author: Me (As my last commit before creating PR)
Date: blah blah

commit message....


commit: a4dsdsdssdds
Author: Another developer (whose changes I merged)
Date: blah blah

commit message....

rest of another commits ....

git log ––all ––decorate ––oneline ––graph

f0acaed (HEAD -> feature/my-feature, origin/my-feature) commit message..
a4f4dab (origin/another-feature, feature/another-feature) commit message..
* db30503 (origin/HEAD, origin/develop, develop) merge pull request from another branch

blah blah blah

【问题讨论】:

  • 你可以分享一个简化的提交树吗?
  • 你的 PR 目标分支是开发分支吗?如果是,除非another-feature 合并到develop,否则似乎没有办法看不到更改
  • @ketan 欢呼。您可以改用git log –all –decorate –oneline –graph 吗?其输出可能更有用。
  • @ketan 晶圆厂。所以看起来你只处理三个提交。是这样吗?
  • 作为有用的背景知识,值得记住的是 git 从不 将提交视为“属于”任何特定分支。因此,当您要求比较“my-feature”和“develop”时,它只是查看从“my-feature”顶端而不是从“顶端”可访问的 commits开发”。无论您如何合并或变基,来自“另一个功能”的提交都将显示在该比较中,直到它们被合并到开发中。

标签: git merge git-merge rebase git-rebase


【解决方案1】:

除非another-feature 被合并,否则更改将在您的 PR 上可见。
如果您只是不想在审查时看到 PR 中的这些更改,只需在审查期间更改基本分支(如果您使用的版本控制系统允许)。

另一个解决方案(我更喜欢)是重新设置您的分支 使用 another-feature 而不是合并它们。
在这种情况下,当另一个功能被合并时,您将不会那么头疼,而且在审查时,您将能够只审查您推送的提交(大多数系统允许您在审查时选择提交集)。

更新:(针对上述第二种方法)
要跳转到my-feature 的原始状态,您需要使用reflog
以下是如何做到这一点。

  1. 通过键入确保没有挂起的更改 git status
  2. 类型 git reflog 你会看到这样的: 在那里你可以看到头部引用的历史。只需找到合并之前的提交(在图片中它是带有HEAD@{1} 和提交哈希e919ec6 的那个)。
  3. 现在只需使用以下命令签出该提交: git checkout HASH_HERE(例如git checkout e919ec6
  4. 现在只需从该提交创建一个分支(为方便起见) checkout -b my-feature.ORIGINAL

现在my-feature.ORIGINAL 包含您在合并之前的分支状态,并且您在该分支上。
要进行变基而不是合并,请按照下列步骤操作:

  1. 备份您的分支(再次为方便起见) git branch my-feature.BKP
  2. 使用另一个功能重新定位分支 git rebase another-feature
  3. 重命名旧的坏分支(为方便起见) git rename my-feature my-feature.BAD
  4. 将当前分支名称从 my-feature.ORIGINAL 更改为 my-feature(以匹配远程分支名称) git rename my-feature.ORIGINAL my-feature
  5. 现在您可以强制将分支推送到远程分支,PR 将被更新。

【讨论】:

  • 因为,我已经合并并创建了 PR。我怎样才能做到这一点?另一个解决方案(我更喜欢)是使用另一个功能重新定位您的分支,而不是合并它们。
  • 如果您有 my-feature 的原始分支的备份,然后签出到该分支并使用此命令 git rebase another-feature 而不是 git merge。附言如果您没有备份,请告诉我,我将提供有关如何找到备份的更多详细信息。
  • 备份你的意思是我创建了新的 PR 并删除了关闭的旧 PR?同时我编辑了我的问题以显示git log
  • 我的意思是原始分支my-feature(带有类似git branch my-feature.BKP)的副本,然后将其与其他功能合并。但是从这个问题我猜你还没有备份它:)
  • @ketan,我已经更新了答案,请检查。