GIT:如何合并更改,这些更改先前已从合并提交中删除

时间:2018-08-30 14:31:37

标签: git git-merge git-commit git-cherry-pick git-merge-conflict

我有两个分支,开发和掌握。我想从开发到掌握方面挑选一些关于一项特定功能的提交。但是,从开发人员到熟练掌握者的承诺提交数量约为106,这意味着我必须仔细检查所有提交内容,以过滤出相关的内容。为了避免经历每次提交的更改,然后从樱桃中挑选单个或一系列更改,我认为应该使用捷径:D。我将开发合并为master,合并提交中大约有115个文件更改。

我浏览了每个文件,并删除了与该功能无关的那些更改。对于某些文件,我将其全部删除,对于某些文件,我仅进行了部分更改,并删除了不必要的更改。在浏览完所有115个文件之后,大约剩下55个过滤文件,这些文件与我随后在合并提交中提交的功能有关。

现在,当我查看master的git日志时,日志看起来好像所有106个提交都已合并到master中,在顶部显示了我的合并提交,名为“ mergeddevelop into master”。 现在我想将开发人员合并到master中,以便实际上合并我先前从合并提交中删除的其余文件,git表示虽然两个分支之间都有变化,但是没有任何内容可以合并,但是由于我从合并提交,我现在无法将这些更改移入master。 我是否需要从主服务器上删除合并提交,或者有什么方法可以强制完全合并差异? 为了避免将来出现任何问题,这里应该采用什么正确的方法?

2 个答案:

答案 0 :(得分:1)

不幸的是,您的快捷方式滥用了“合并”。当您尝试合并两个分支,遇到冲突,手动解决它们然后提交合并时,您会告诉Git,将这两个分支(以及 all 这两个分支)是选择手动解决提交的方式。如果您从develop“重新合并”,那么Git不会否决您的手动冲突解决方法,因为您已经告诉Git正确的合并是什么,并且也不会试图与您相矛盾(嗯,除非它真的很困惑)。 Git不能说出解决两次合并所必需的更改与要“稍后保存”的更改之间的区别。

必须重置错误的合并,但是这是您可以相对自动且无须大惊小怪的方式。您提到自合并以来,您还对master进行了一次提交。如果根本不存在,您可以跳过一些步骤,但是我在下面提供了更通用的解决方案,如果您同时在master和{{1}上添加了其他提交,则也可以使用该解决方案}。

我假设以下内容。

  • 进行“错误合并”时,您将develop合并到develop中(即您在master上并运行master,而不是相反) 。
  • 您现在不必太在意历史记录,您只想从“错误合并”之前获取git merge develop的“丢失”更改(以及此后的其他更改, (如果有的话)成功合并到develop中。
  • 您尚未在任何地方发布mastermaster,因此没有其他存储库依赖于它们的历史记录。
  • 您目前develop已在干净的树中签出。

与任何混乱的Git操作一样,在此处对存储库进行完整备份(mastercp -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 状态,但保持工作目录不变(因此它包含您手动添加的第一个功能) master):

master

,我们将重新提交这些手动修改:

git reset HEAD^

现在,我们将进行一些复杂的变基。 (如果由于合并错误而在git add -A git commit -m 'fix_merge: add first feature to master' 上没有任何提交,那么这是不必要的步骤。)

master

这会将在git checkout master git branch master_backup # make a copy in case something goes wrong git rebase --onto fix_merge bad_merge master 分支上所做的更改从错误合并后的 移植到其当前状态(即,master之后直至{{ 1}}) ONTO 我们已修复的分支机构bad_merge。重新设置基准后,master将指向已移植的分支。应该没有冲突,因为fix_mergemaster中的树完全匹配;只是重写提交历史记录,因为一个人有一个合并而一个人没有。

我们现在有以下情况:

  • bad_merge的历史,而不是与fix_merge合并,现在只需一次提交即可完成您为添加第一个功能而进行的手动编辑,以及您所做的其他工作由于合并错误,我们已经在master上进行过操作。它缺少的是从develop开始(严重)合并的历史。

  • master分支现在具有该第一个功能的(复杂)历史记录,以及您在不良合并之前开发的但想要“保存以备后用”的功能,以及您已完成的其他工作从那时起(您没有这种情况,但是该解决方案也适用于这些情况)。

如果您从develop中选择了第一个功能,则或多或少会出现这种情况,除了全部都是在单个提交而不是多个提交中被全部选择的。现在,如果您将develop合并到develop中:

develop

并解决所有冲突-可能有很多冲突,因为Git试图将master分支中第一个功能的所有单个提交与git checkout master # probably already there, but make sure git merge develop 中的大型整体提交进行匹配,所以这可能是一个丑陋的合并-然后您可以提交合并:

develop

您应该最终将mastergit commit 中来自错误提交之前和之后的所有更改成功合并。

在这一点上,您可能要考虑将master合并回develop或完全放弃master并从develop重新分支。

答案 1 :(得分:0)

我认为您在这里需要做的是添加一个小的更改以开发分支(让它成为一个额外的空间),然后切换到master git mergedevelop将添加更改,包括您先前删除的已删除更改 然后git push  我认为,为了避免将来出现问题,每个功能都应位于分支上,一旦完成将合并到母版中