我有两个分支:开发和 bug_fixes ,我偶然在 bug_fixes 中合并开发分支强大>两到三周前,并且从那时起一直致力于 bug_fixes ,并且我已经推动了 bug_fixes 中的更改。
现在,我需要取消合并开发分支。我想要一个纯 bug_fixes 分支,没有提交开发分支。通过谷歌搜索,我提出了以下场景:
1)恢复在 bug_fixes 分支中合并开发分支的提交,但它部分完成了这项工作。来自开发分支的提交仍然可以在 bug_fixes 分支中看到,这是不需要的。
2)重新启动,并删除执行合并的提交,但它仍然存在第1点中描述的相同问题。 bug_fixes 分支仍然包含来自开发的提交分支。
有没有办法可以删除合并提交,所有那些来自 bug_fixes 分支的开发分支的提交也会被删除?或者,这是不可能的?
答案 0 :(得分:5)
如果您知道哪些提交来自开发分支(除了合并提交之外),您可以从错误修复的最后一次良好提交中执行git rebase -i
(interactive rebase):
b--b--(B)--M--d--b--d--b--b (bugfix)
/
d--d--d (devel)
git checkout bugfix
git rebase -i (B)
# drop M, d, and d
b--b--(B)--b'--b'--b' (bugfix)
d--d--d (devel)
更复杂的替代方案是git filter-branch
,但希望交互式rebase就足够了。
git rebase -p -i (b)
-p
允许保留合并提交。
答案 1 :(得分:4)
我会尝试以下方法:
首先,列出两个分支中的提交:
git checkout development
git log --oneline > log-devel.txt
git checkout bug_fixing
git log --oneline > log-bugfixing.txt
其次,在执行合并之前,在每个分支中标识最后一次提交的id。我们将这些提交命名为devel-0
和bugfixing-0
然后,将您的分支机构置于意外合并之前的状态:
git checkout development
git reset --hard <devel-0-hash>
git checkout bug_fixing
git reset --hard <bugfixin-0-hash>
此时你有两个干净但过时的git分支。现在,您应该从log-devel.txt
和log-bugfixing.txt
获取当前分支中未包含的所有提交,并将它们添加到相应的分支。要向您的分支abc0123
添加ID为development
的提交,您可以使用cherry pick:
git checkout development
git cherry-pick `abc0123`
考虑到提交最好以与添加到bug修复分支相同的顺序添加到干净分支中,以便最大限度地减少出现的冲突数量。
答案 2 :(得分:1)
您需要在合并之前了解 bug_fixes 的最新提交消息,如果您知道sha hash,那就更好了。
现在首先需要使用命令
找到sha哈希$ git reflog
输出类似于
1fb5738 HEAD @ {10}:commit ...
4d47df6 HEAD @ {11}:commit ...
5f32c4b HEAD @ {12}:合并......
428f91d HEAD @ {13}:结帐......
5f32c4b HEAD @ {14}:结帐......
第一部分是sha哈希。在这种情况下,合并前的状态具有哈希值428f91d
现在,在 bug_fixes 分支中,我们重置为此哈希值
git reset --hard 428f91d
现在它已撤消
答案 3 :(得分:0)
让我用下面的例子来描述场景
错误修复分支:修订版10
Merged Dev Branch:Revision 11
合并后的多项更改:修订版12 - 修订版15
-
现在需要完成两个步骤(没有git native命令的简单方法)
返回修订版10
克隆名为“latest”的文件夹的最新代码
将修订版10克隆到名为“rev10”的文件夹
从最新文件夹
中删除所有内容(.git文件夹除外)将所有内容(.git文件夹除外)从rev10文件夹复制到最新文件夹
检查最新的文件夹内容
现在,Bug修复分支的内容将等于修订版10,而无需任何开发人员分支更改
可选 - 将修订版12 - 修订版15合并到bug_fix分支
由于我们已经恢复到旧的版本,最新提交到bugfix分支也没了 此修订需要逐个手动合并回bug修复分支