【问题标题】:How to cherry-pick and merge only a subpath from a feature branch to master如何只挑选并合并从功能分支到主分支的子路径
【发布时间】:2022-01-02 10:54:23
【问题描述】:

我有一个有趣的问题(至少对我来说是这样)

我有一个master 分支和一个feature 分支,不久前它已与master 分道扬镳。另一个团队不断更新master 分支,而我的团队只在feature 分支上工作。

master 分支包含一些我的团队不感兴趣的更改。我们只关心他们的app 文件夹,仅此而已。即使在app 文件夹中,我们也不对所有内容感兴趣,只对我们认为需要的更改感兴趣。我们不会将我们的 feature 分支合并到他们的 master 中,因为我们正在实施技术堆栈更改,我们只需要他们的 JavaScript 代码。

同时,我们还在feature 分支的app 文件夹中进行更改。所以在app 文件夹中,他们有一些我们没有的更改,我们有一些他们没有的更改。我们希望保留所有更改,但只选择其中的一些更改。

如何将他们的master 分支的app 文件夹合并到我们的feature 分支的app 文件夹中?我已经研究了几个小时,尝试了一些 VS Code 扩展来预览两个文件夹之间的差异。我正在寻找的是一个界面,我可以在其中接受拒绝来自master分支的`app文件夹的所有内容。虽然这是我的偏好,但我愿意接受任何可以解决此问题的建议。

这听起来像是一团糟,但在过去的几个月里,我的团队失去了一些成员,并且分支机构之间的差异每周都变得越来越大。现在我们想一劳永逸地解决这个问题。

感谢您的帮助。

【问题讨论】:

    标签: git merge cherry-pick


    【解决方案1】:

    我正在寻找一个界面,我可以在其中接受或拒绝来自 master 分支的 app 文件夹的所有内容

    git checkout -p master app 很粗糙,但在这里服务的机会很大。

    如果这还不足以让你决定你想要什么,那么下一步就是选择性合并

    git diff --merge-base @ master -- app | git apply -3
    

    它将使用 Git 的自动合并机制,并留下任何重叠或邻接的更改供您照常进行整理,或者您可以将差异保存到文件并在应用之前对其进行编辑以适应它,如果您小心的话。

    【讨论】:

      【解决方案2】:

      有两种方法可以做到这一点。更简单的将保留更改,但丢弃他们所做的任何提交。更复杂的会保留提交。

      推荐

      下面讨论的两种方法都有可能导致合并冲突和其他令人头疼的问题,尤其是当人们继续对 master 分支进行更改时。此外,如果您对功能分支中的 app/ 文件夹进行了更改,直接使用 git apply 可能会导致您的更改被覆盖。

      我强烈建议通过git merge 将主分支合并到功能分支中,不压缩。鉴于您提到的分歧,可能存在合并冲突,但这没关系。合并冲突随心所欲:它们让您选择接受哪些更改,拒绝哪些更改。

      话虽如此,这里有两种类似于只挑选一个文件夹的方法。

      选项 1:放弃提交,保留更改

      这种方法非常简单,它结合了git diffgit apply

      git switch feature
      git diff feature..master -- app | git apply --index
      

      这将:

      • 切换到功能分支(您将在此处应用更改)
      • 获取对主分支所做的所有更改,这些更改不在功能分支上。
      • 仅过滤app 目录中的更改
      • 通过git apply应用更改
      • 通过将更改添加到索引来暂存更改(这就是 --index 选项的作用)

      这种方法的唯一缺点是它不会保留历史记录或提交消息。

      从那里,您可以自己提交更改:

      git commit -m "Apply changes made to master branch"
      

      选项 2:获取提交和更改

      这个有点复杂,依赖git format-patch

      git switch feature
      git format-patch --stdout feature..master -- app | git am
      

      这将:

      • 切换到功能分支(您将在其中应用更改)
      • 获取对主分支所做的所有更改,这些更改不在功能分支上
      • 仅按app 目录中所做的更改进行过滤
      • 将它们格式化为一系列补丁(包含提交消息、作者等)
      • 使用 git am 应用所有这些补丁

      请注意,根据更改的内容,这可能会导致您必须手动解决的故障。 (它会提醒你)

      【讨论】:

        猜你喜欢
        • 2023-01-30
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 2017-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        相关资源
        最近更新 更多