代码之家  ›  专栏  ›  技术社区  ›  Saif

GIT:如何合并先前从合并提交中删除的更改

  •  2
  • Saif  · 技术社区  · 6 年前

    我浏览了每个文件,删除了那些与功能无关的更改。在一些文件的情况下,我删除了他们全部和一些我只采取部分更改和删除不必要的更改。在浏览了所有的115个文件之后,剩下了大约55个与我在合并提交中提交的特性相关的过滤文件。

    现在,当我查看master的git日志时,日志看起来好像所有106个提交都合并到了master中,并且在顶部显示了名为“merged develop into master”的合并提交。 现在我想将develop合并到master中,以便实际合并我之前从merge commit中删除的其余文件,git说虽然两个分支之间都有更改,但是没有什么要合并的,但是由于我从merge commit中删除了这些更改,我现在无法将这些更改移到master中。 我是否需要从主服务器中删除合并提交,或者是否有任何方法强制完全合并差异?

    2 回复  |  直到 6 年前
        1
  •  1
  •   K. A. Buhr    6 年前

    不幸的是,您的快捷方式误用了“合并”。当您尝试合并两个分支,获取冲突,手动解决它们,然后提交合并时,您告诉Git合并这两个分支的“正确”方法(以及 全部的 选择手动解析提交。如果你“合并”自 develop

    你呢 必须重新设置错误的合并,但下面是如何相对自动地进行合并,而不必太麻烦。你说过你还有一个任务要做 master 自从合并后。如果没有,您可以跳过几个步骤,但是我在下面给出了一个更通用的解决方案,如果您在这两个步骤上都添加了额外的提交,这个解决方案也会起作用 主人 发展

    我假设如下。

    • 当你进行“错误合并”时,你合并了 发展 主人 (即,你在 主人 然后跑了 git merge develop 而不是相反)。
    • 你不太在意历史如何看待这一点,你只想从中得到“迷失”的变化 发展 从“错误合并”(加上此后的附加更改,如果您有任何)成功合并到 .
    • 您尚未发布 主人 发展 任何地方,所以没有其他职责依赖于他们的历史。
    • 你现在有 在一棵干净的树上结账。

    cp -a git clone mirror

    首先,让我们命名错误的合并。在日志中找到它的散列并为它创建一个标记。(你的情况是 master^ ,但一般来说,您可能需要搜索它。)

    git tag bad_merge 8354cbeb
    git log bad_merge  # !! double check that this points to the bad merge !!
    

    现在,我们要检查一个新的 fix_merge 分支机构。我们会在晚上开始 bad_merge

    git checkout -b fix_merge bad_merge
    

    然后,我们将分支回滚到 就在“错误合并”之前,但要保持工作目录的原样(因此它包含要添加第一个功能的手动编辑) 主人 ):

    git reset HEAD^
    

    我们将重新提交这些手动编辑:

    git add -A
    git commit -m 'fix_merge: add first feature to master'
    

    因为错误的合并。)

    git checkout master
    git branch master_backup   # make a copy in case something goes wrong
    git rebase --onto fix_merge bad_merge master
    

    这将移植在 主人 坏的合并会一直到它的当前状态(即,树的后一部分) 高达 ) 我们修好的分行 修复\u合并 . 在重新设置基础之后, 主人 将指向移植的分支。不应该有冲突,因为 修复\u合并

    我们现在有以下情况:

    • 主人 ,而不是从 自从糟糕的合并。它所缺少的是被(严重)合并的历史 发展

    • 这个 branch现在拥有了第一个特性的(复杂的)历史,加上在错误合并之前开发的特性,但是想要“保存以备将来使用”,再加上从那以后做的额外工作(在您的案例中没有这些,但是这个解决方案也适用于这些)。

    如果你仔细挑选第一个特征的话,这或多或少就是你要去的地方 发展 进入之内 主人 :

    git checkout master    # probably already there, but make sure
    git merge develop
    

    发展 主人 ,所以这可能是一个丑陋的合并--然后您可以提交合并:

    git commit
    

    已成功与中的所有更改合并 发展

    此时,您可能需要考虑合并 主人 回到 发展 还是放弃 把它从

        2
  •  0
  •   Sasha Farajallah    6 年前

    git merge develope将添加更改,包括您以前删除的已删除更改 为了避免将来的问题,我认为每个特性都应该放在一个分支上,一旦完成,就会合并到master中