【问题标题】:Compare branches while ignoring any changes before a commit比较分支,同时忽略提交前的任何更改
【发布时间】:2018-04-20 11:34:16
【问题描述】:

我正在使用 Android Studio 并使用多个分支。

其中两个分支在相同的核心代码上开发不同的东西(有点像聊天应用程序,具有共同的核心功能,但 UI、活动、片段完全不同)。

其中一个分支实现了必须应用于其他分支的修复,但是,因为每个分支都有多个不打算合并的提交,当比较分支或合并更改时,它会破坏目标分支,因为所有与修复无关的文件将被更改。

我如何告诉 Android Studio 在某个提交之前忽略所有提交或“同步”两个分支到某个提交,以便在合并更改时它只会使用从该点开始的提交而不是后面的所有内容?

编辑:这不是 git - skipping specific commits when merging 的重复,这个问题询问如何使用 Android Studio 来完成,而不是终端命令。

【问题讨论】:

标签: android git android-studio


【解决方案1】:

从其他答案的 cmets 来看,您似乎只想使用 IDE 命令来执行此操作。这很可能意味着没有解决方案。 IDE 集成通常提供最常见的操作;你想要做的不是一个普通的操作,因为(正如蒂姆在他的回答中所暗示的那样)摆脱这种情况的最好方法就是不要参与其中。

不同解决方案之间的主要区别在于您希望最终提交图的外观。假设你从

O -- o -- X -- X -- B1 -- B2 -- B3 <--(branch1)
      \
       X -- X -- A <--(branch2)

其他人建议的cherry-pick 解决方案对于这种情况来说还不错。虽然可能没有 IDE 支持,但它相对简单。它留给你

O -- o -- X -- X -- B1 -- B2 -- B3 <--(branch1)
      \
       X -- X -- A -- B1' -- B2' -- B3' <--(branch2)

现在这些分支之间的merge 可能会在重复的补丁上绊倒,但您指出这些不是您无论如何都将完全合并的分支。 (这引发了一个不同的问题,关于“共享存储库的分支”是否是存储这两个东西的最明智的方式,因为它们不是同一事物的替代版本。我假设你这样做是为了促进共享共同点代码,但是有专门为解决该问题而设计的工具,如果您使用它们,很明显如何将错误修复共享到公共代码。错误我离题了,现在我们可以回到处理您今天遇到的情况。 ..)

另一种让您知道这些是“两个地方的相同更改”的替代方法是将错误修复从branch1 重新定位,然后将其合并到branch1branch2。这涉及重写 branch1 历史记录,因此如果您已经共享 branch1(即已将 Bn 提交推送到共享存储库),这对您来说可能不是一个好选择。但是如果你这样做,它看起来像

git checkout branch1
git branch common
git reset --hard HEAD~3
git rebase --onto `git merge-base branch1 branch2` branch1 common
git checkout branch1
git merge common
git checkout branch2
git merge common

请注意,我假设错误修复提交位于分支的末尾;如果不是,这个过程会有点困难(重置和后续的变基将被交互式变基取代)。即使它们是,reset 命令的确切参数取决于正在移动的提交数量。这会给你

       X -------- x ------- M1 <--(branch1)
      /                    /
O -- o -- B1' -- B2' -- B3' <--(common)
      \                    \
       X ----- X ---- A ---- M2 <--(branch2)

优点是您现在拥有common 分支,这是对共享代码进行进一步更改的地方(然后再次合并到branch1branch2)。

但同样,如果错误修复提交已经被推送到branch1 上的远程,那么 branch1 现在必须“强制推送”,这为共享偏僻的;因此,如果您不确定它是否适合您的情况,请参阅 git rebase 文档以获取有关该情况的信息。

还有其他选项,但这些选项涵盖了您可能希望提交图如何结束的最明智的选项。

【讨论】:

  • 这看起来比晚餐+1更好。
  • 看起来很完美,但由于 Swati 给出的答案是樱桃采摘,因此选择你的而不是她的是不公平的,但我非常感谢详细的解释。
【解决方案2】:

您可以使用git cherry pick 应用来自另一个分支的更改

请参考以下链接使用 git cherry pick:

https://git-scm.com/docs/git-cherry-pick

如果您想获得提交,请使用git log

【讨论】:

  • 如何在不借助终端命令的情况下使用 Android Studio 做到这一点?
  • 您能详细说明一下吗?
  • Android Studio 有自己的工具来管理分支、比较、拉取、合并等,并且由于我们不必使用终端与 Git 交互,因此使用 Git 不需要命令以及它在 Android Studio 中的所有操作。
  • 我已经检查了 Android Studio 版本控制。 android studio 中没有 git cherry pick 命令。您可以比较和合并分支,还可以查看提交文件。我建议你可以使用 android studio 终端。
  • @Shadow Git 中的提交可以被认为是一个差异。在您的情况下,您感兴趣的提交/差异是您为修复错误所做的。然后,您可以挑选或应用此差异与其他分支。这与合并不同,合并是将两个分支合并在一起。
【解决方案3】:

我认为最好的答案是提出一个工作流程,使这个问题不会/不会发生。假设它确实发生了,一种选择是在给定分支中修复错误,然后将修复提交到其他功能分支。假设功能分支永远不会像您描述的那样与每个分支合并,那么唯一的问题可能是当功能分支合并回master 时。然后,同一个错误修复会来自多个来源,这可能会也可能不会引起混淆。

【讨论】:

  • 工作流程已经建立,无法更改,否则如果我一开始可以避免它,我就不会问这个问题..
  • 我做了,但你的问题让我觉得我可能误解了你在说什么。我有吗?
  • 我的意思是,将错误修复移植到所有分支的一种快速而肮脏的方法是在一个功能分支上进行修复提交,然后选择该提交到其他功能分支。
  • 哦,完全不是我理解的,谢谢你澄清。
【解决方案4】:

请参考此屏幕截图。也许你会得到你的答案

【讨论】:

  • 这如何回答我的“比较分支同时忽略特定提交之前的任何更改”的问题?
猜你喜欢
  • 2010-11-21
  • 2012-08-15
  • 1970-01-01
  • 2021-01-29
  • 2013-04-07
  • 2010-10-24
  • 2022-07-21
  • 1970-01-01
  • 2022-08-03
相关资源
最近更新 更多