【问题标题】:git merge branch - dont want commits before the remote branch basegit merge branch - 不希望在远程分支基础之前提交
【发布时间】:2016-08-21 08:02:25
【问题描述】:

我在 git 中遇到分支和合并问题。 我们有以下分支机构(它们是我们的产品,并且在客户处安装和支持时并行维护)

2015Edition1
2015Edition2
2016Edition1
2016Edition2
master

我们可以将这些分支视为发布分支。 问题如下。 2015Edition1 已分支,并且已将修复提交到分支 fix1

2015Edition1
        fix1\-- bugfix

修复合并回2015Edition1 并发布。

2015Edition1--------------merge
        fix1\-- bugfix --/

然而,分支2015Edition22016Edition12016Edition2差异很大,这是由于二进制帮助文件、大量依赖于产品的图像等,以及源代码的更改从未合并回主代码。

有什么方法可以合并fix1 分支,只获取fix1 中的提交

我想要的结果如下:

2015Edition1--------------merge--
        fix1\-- bugfix --/
                         \
                ----------merge--
2016Edition2fix/
   2016Edition2 --

我知道我可以挑选提交到其他分支。但这是一个非常简化的例子。而且我认为我失去了在提交存在的分支中跟踪的能力。

任何cmets和建议

【问题讨论】:

  • 简短回答:不。您可以与--no-commit 进行合并,清除所有合并结果,用樱桃挑选的效果替换它们(使用git cherry-pick -n),然后提交;但这是一个糟糕的策略,最终会导致眼泪。
  • 是的,这就是为什么我想避免这种情况。我认为也许 git merge-base 2015Edition1 2016Edition2Edition 可以指出分支开始不同的地方。但我不知道源代码在这一点上是否存在。 (因此很难修复 :) 中的错误

标签: git merge branch diff cherry-pick


【解决方案1】:

好的,我通过重新排列错误修复解决了这个问题。我从一开始就做错了。 对我有用的解决方案是在分支之间找到合并基础提交,在合并基础中创建一个分支。然后将错误修复提交到该分支中。(我想我可以在新分支上进行变基),然后将新分支合并到其他包含错误修复的分支中:

$git merge-base 2015Edition1 2016Edition2 (earliest vs latest release)
5a5def
$git checkout -b bugfix-branch 5a5def
$git cherry-pick -x bug-fix-commit
$git checkout 2016Edition1
$git merge bug-fix-branch
$git checkout 2015Edition2
$git merge bug-fix-branch
.... and so on.

这似乎是解决问题的方法。我的错误是我没有从正确的提交分支。 有这方面的cmet吗?这是以“正确”方式解决问题的方法吗?

【讨论】:

    【解决方案2】:

    您可以使用以下脚本在合并到主分支之前压缩您的功能分支提交。

    # brief: This script should be run from within your git repo. You need to have your feature branch
    # checked out. This will squash all the commits on your feature branch (assuming you 
    # branched from master). Then you can just use the github PR UI to merge the PR in. You need to have 
    # feature branch checked out when you run this script (git checkout feature branch).
    
    # usage: git-helper-squash-all-commits <final commit messsage ex: "reorganizing directory structure"
    # example: git-helper-squash-all-commits "reorganizing directory structure"
    
    #!/bin/sh
    set -ex 
    FINAL_COMMIT_MESSAGE=$1
    BRANCH_YOU_BRANCHED_FROM=master
    CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`
    COMMIT_HASH=`git merge-base HEAD $BRANCH_YOU_BRANCHED_FROM`
    git reset --soft $COMMIT_HASH
    git commit -am "$FINAL_COMMIT_MESSAGE"
    git push origin $CURRENT_BRANCH --force
    

    【讨论】:

      【解决方案3】:

      我认为这里的问题是您试图维护多个长期运行的分支,而这不是 Git 设计的工作方式。

      假设你有三个分支,release1release2release3

      * 3d3 (release3)
      * 28d
      * e38
      * b51
      | * 27a (release2)
      | * df1
      | | * 948 (release1)
      | | * ce3
      | |/
      |/|
      | |
      |/
      * 166 (master)
      * 6f0
      * 1e8
      

      如果您向release1 添加一个新的提交,并且您想将它带入release2,您最终会同时带上ce3948

      这很快就会变得一团糟,您最终会忘记合并了什么。由于代码差异很大,也许您应该考虑将分支移动到它们自己的单独存储库中,并将代码的公共区域提取到可分发的库/包中(可能也应该进入它自己的存储库)。

      【讨论】:

        【解决方案4】:

        您可以按照以下步骤操作:

        • git status
        • git add(如果您可以修改或添加任何文件)
        • git commit -m "&lt;message&gt;"
        • git push origin &lt;your branch&gt;
        • git checkout &lt;main branch&gt;
        • git pull origin &lt;main branch&gt;
        • git merge &lt;your branch&gt;
        • git push origin &lt;main branch&gt;

        这是在 Git 中提交和合并的正确方法。请不要使用 git add .,你可以改用git add &lt;file path&gt;

        【讨论】:

        • 我相信 OP 正在寻找有关如何维护长期运行的分支的提示,而不仅仅是如何使用分支。
        • 我只解释了用正确的git步骤提交代码。
        猜你喜欢
        • 2018-11-01
        • 1970-01-01
        • 2020-05-07
        • 1970-01-01
        • 2015-02-22
        • 2015-11-06
        • 1970-01-01
        • 2020-05-22
        相关资源
        最近更新 更多