我有两个分支,开发和掌握。我想从开发到掌握方面挑选一些关于一项特定功能的提交。但是,从开发人员到熟练掌握者的承诺提交数量约为106,这意味着我必须仔细检查所有提交内容,以过滤出相关的内容。为了避免经历每次提交的更改,然后从樱桃中挑选单个或一系列更改,我认为应该使用捷径:D。我将开发合并为master,合并提交中大约有115个文件更改。
我浏览了每个文件,并删除了与该功能无关的那些更改。对于某些文件,我将其全部删除,对于某些文件,我仅进行了部分更改,并删除了不必要的更改。在浏览完所有115个文件之后,大约剩下55个过滤文件,这些文件与我随后在合并提交中提交的功能有关。
现在,当我查看master的git日志时,日志看起来好像所有106个提交都已合并到master中,在顶部显示了我的合并提交,名为“ mergeddevelop into master”。 现在我想将开发人员合并到master中,以便实际上合并我先前从合并提交中删除的其余文件,git表示虽然两个分支之间都有变化,但是没有任何内容可以合并,但是由于我从合并提交,我现在无法将这些更改移入master。 我是否需要从主服务器上删除合并提交,或者有什么方法可以强制完全合并差异? 为了避免将来出现任何问题,这里应该采用什么正确的方法?
答案 0 :(得分:1)
不幸的是,您的快捷方式滥用了“合并”。当您尝试合并两个分支,遇到冲突,手动解决它们然后提交合并时,您会告诉Git,将这两个分支(以及 all 这两个分支)是您选择手动解决提交的方式。如果您从develop
“重新合并”,那么Git不会否决您的手动冲突解决方法,因为您已经告诉Git正确的合并是什么,并且也不会试图与您相矛盾(嗯,除非它真的很困惑)。 Git不能说出解决两次合并所必需的更改与要“稍后保存”的更改之间的区别。
您将必须重置错误的合并,但是这是您可以相对自动且无须大惊小怪的方式。您提到自合并以来,您还对master
进行了一次提交。如果根本不存在,您可以跳过一些步骤,但是我在下面提供了更通用的解决方案,如果您同时在master
和{{1}上添加了其他提交,则也可以使用该解决方案}。
我假设以下内容。
develop
合并到develop
中(即您在master
上并运行master
,而不是相反) 。git merge develop
的“丢失”更改(以及此后的其他更改, (如果有的话)成功合并到develop
中。master
或master
,因此没有其他存储库依赖于它们的历史记录。develop
已在干净的树中签出。与任何混乱的Git操作一样,在此处对存储库进行完整备份(master
或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
状态,但保持工作目录不变(因此它包含您手动添加的第一个功能) 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_merge
和master
中的树完全匹配;只是重写提交历史记录,因为一个人有一个合并而一个人没有。
我们现在有以下情况:
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
您应该最终将master
与git commit
中来自错误提交之前和之后的所有更改成功合并。
在这一点上,您可能要考虑将master
合并回develop
或完全放弃master
并从develop
重新分支。
答案 1 :(得分:0)
我认为您在这里需要做的是添加一个小的更改以开发分支(让它成为一个额外的空间),然后切换到master git mergedevelop将添加更改,包括您先前删除的已删除更改 然后git push 我认为,为了避免将来出现问题,每个功能都应位于分支上,一旦完成将合并到母版中