撤消 Git 中的合并,以便不存在来自其他分支的提交
Undoing the merge in Git so that no commits from the other branch exist
我有两个分支:development和bug_fixes,不小心合并了development 两到三周前在 bug_fixes 分支,从那以后一直致力于 bug_fixes ,我已经推送了 bug_fixes.
中的更改
现在,我需要取消合并 development 分支。我想要一个没有提交形式的纯 bug_fixes 分支 development 分支。通过谷歌搜索,我想到了以下场景:
1) 还原合并 development 分支到 bug_fixes 分支的提交,但它部分完成了工作。 development 分支的提交仍然可以在 bug_fixes 分支中看到,这不是必需的。
2) 变基,并删除进行合并的提交,但它仍然存在第 1 点中描述的相同问题。bug_fixes 分支仍然包含提交来自 发展 分支。
有没有一种方法可以删除合并提交,以及 bug_fixes 分支形式 development[=38= 中的所有提交] 分支,也会被删除?或者,这不可能?
如果您知道哪些提交来自开发分支(除了合并提交),您可以从最后一次良好的错误修复提交中执行 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
,但希望交互式变基就足够了。
在 OP's 中,完整的命令是:
git rebase -p -i (b)
-p
允许保留合并提交。
我会尝试以下方法:
首先,列出两个分支中的提交列表:
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
中取出所有未包含在当前分支中的提交,并将它们添加到相应的分支中。要将 ID 为 abc0123
的提交添加到您的分支 development
,您可以使用 cherry pick:
git checkout development
git cherry-pick `abc0123`
考虑到提交最好按照它们添加到 bug 修复分支的相同顺序添加到干净分支,以最大程度地减少出现的冲突数量。
在 merge 之前,您需要知道 bug_fixes 的最新提交消息,如果您知道 sha 哈希,那么 evne更好。
现在您首先需要使用命令
找到 sha 哈希
$ git reflog
输出类似于
1fb5738 HEAD@{10}: commit...
4d47df6 HEAD@{11}: commit...
5f32c4b HEAD@{12}: merge...
428f91d HEAD@{13}: checkout...
5f32c4b HEAD@{14}: checkout...
第一部分是 sha 哈希。在这种情况下,合并前的状态具有哈希值 428f91d
所以现在,在 bug_fixes 分支中我们重置为这个哈希值
git reset --hard 428f91d
现在取消了
让我用下面的例子来描述这个场景
错误修复分支:修订版 10
合并开发分支:修订版 11
合并后的多项更改:修订版 12 - 修订版 15
-
现在需要完成 2 个步骤(没有 git 本机命令的简单方法)
返回修订版 10
将最新代码克隆到名为 "latest"
的文件夹中
将修订版 10 克隆到名为 "rev10"
的文件夹中
删除最新文件夹中的所有内容(.git 文件夹除外)
将 rev10 文件夹中的所有内容(.git 文件夹除外)复制到最新文件夹
正在检查最新的文件夹内容
现在,Bug 修复分支的内容将与修订版 10 相同,而无需任何开发人员分支更改
可选 - 将修订版 12 - 修订版 15 合并到 bug_fix 分支
因为我们已经恢复到旧版本,最新提交到 bugfix 分支的也不见了
此修订需要手动一一合并回bug fix branch
我有两个分支:development和bug_fixes,不小心合并了development 两到三周前在 bug_fixes 分支,从那以后一直致力于 bug_fixes ,我已经推送了 bug_fixes.
中的更改现在,我需要取消合并 development 分支。我想要一个没有提交形式的纯 bug_fixes 分支 development 分支。通过谷歌搜索,我想到了以下场景:
1) 还原合并 development 分支到 bug_fixes 分支的提交,但它部分完成了工作。 development 分支的提交仍然可以在 bug_fixes 分支中看到,这不是必需的。
2) 变基,并删除进行合并的提交,但它仍然存在第 1 点中描述的相同问题。bug_fixes 分支仍然包含提交来自 发展 分支。
有没有一种方法可以删除合并提交,以及 bug_fixes 分支形式 development[=38= 中的所有提交] 分支,也会被删除?或者,这不可能?
如果您知道哪些提交来自开发分支(除了合并提交),您可以从最后一次良好的错误修复提交中执行 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
,但希望交互式变基就足够了。
在 OP's
git rebase -p -i (b)
-p
允许保留合并提交。
我会尝试以下方法:
首先,列出两个分支中的提交列表:
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
中取出所有未包含在当前分支中的提交,并将它们添加到相应的分支中。要将 ID 为 abc0123
的提交添加到您的分支 development
,您可以使用 cherry pick:
git checkout development
git cherry-pick `abc0123`
考虑到提交最好按照它们添加到 bug 修复分支的相同顺序添加到干净分支,以最大程度地减少出现的冲突数量。
在 merge 之前,您需要知道 bug_fixes 的最新提交消息,如果您知道 sha 哈希,那么 evne更好。
现在您首先需要使用命令
找到 sha 哈希$ git reflog
输出类似于
1fb5738 HEAD@{10}: commit...
4d47df6 HEAD@{11}: commit...
5f32c4b HEAD@{12}: merge...
428f91d HEAD@{13}: checkout...
5f32c4b HEAD@{14}: checkout...
第一部分是 sha 哈希。在这种情况下,合并前的状态具有哈希值 428f91d
所以现在,在 bug_fixes 分支中我们重置为这个哈希值
git reset --hard 428f91d
现在取消了
让我用下面的例子来描述这个场景
错误修复分支:修订版 10
合并开发分支:修订版 11
合并后的多项更改:修订版 12 - 修订版 15
-
现在需要完成 2 个步骤(没有 git 本机命令的简单方法)
返回修订版 10
将最新代码克隆到名为 "latest"
的文件夹中将修订版 10 克隆到名为 "rev10"
的文件夹中删除最新文件夹中的所有内容(.git 文件夹除外)
将 rev10 文件夹中的所有内容(.git 文件夹除外)复制到最新文件夹
正在检查最新的文件夹内容
现在,Bug 修复分支的内容将与修订版 10 相同,而无需任何开发人员分支更改
可选 - 将修订版 12 - 修订版 15 合并到 bug_fix 分支
因为我们已经恢复到旧版本,最新提交到 bugfix 分支的也不见了 此修订需要手动一一合并回bug fix branch