Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git从历史记录中删除合并提交_Git_Git Merge_Git Rebase - Fatal编程技术网

git从历史记录中删除合并提交

git从历史记录中删除合并提交,git,git-merge,git-rebase,Git,Git Merge,Git Rebase,我的Git历史记录如下所示: 我想把这件紫色的衣服挤成一件。我不想在我的提交日志中再看到它们 我试着做了一个git-rebase-i1,但是即使1在蓝色分支上(参见图片),我仍然可以看到紫色分支上的每个提交 如何才能完全删除紫色分支(从提交日志中)?Dogit rebase-I这将允许您删除合并提交,并且日志将是您想要的一行。您还可以删除任何不再需要的提交。你的再基地不起作用的原因是你没有回到足够远的地方 警告: 你这样做是在改写历史。对推送到远程回购的更改执行此操作将导致问题。我建议只对本地

我的Git历史记录如下所示:

我想把这件紫色的衣服挤成一件。我不想在我的提交日志中再看到它们

我试着做了一个
git-rebase-i1
,但是即使
1
在蓝色分支上(参见图片),我仍然可以看到紫色分支上的每个提交

如何才能完全删除紫色分支(从提交日志中)?

Do
git rebase-I
这将允许您删除合并提交,并且日志将是您想要的一行。您还可以删除任何不再需要的提交。你的再基地不起作用的原因是你没有回到足够远的地方

警告:
你这样做是在改写历史。对推送到远程回购的更改执行此操作将导致问题。我建议只对本地提交执行此操作。

有两种方法可以根据需要解决此问题:

解决方案1:删除紫色提交,保留历史记录(以防要回滚)

和删除(删除行)对应的紫色提交


如果合并后没有进行提交,那么这就不那么棘手了。从原始状态的回购开始,额外的提交会增加在恢复/重定基础期间发生冲突的可能性

删除合并提交并将分支压缩为主线中的单个提交

使用以下命令(将5和1替换为相应提交的SHA):

保留合并提交,但将分支提交压缩为一个:

使用以下命令(将5、1和C替换为相应提交的SHA):

删除合并提交并将其替换为分支中的单个提交

只需执行以下操作(将5替换为相应提交的SHA):

最后,要完全删除分支

使用此命令(将C和D替换为相应提交的SHA):

仅删除合并提交 如果您所要做的只是删除合并提交(2),这样就好像从未发生过一样,那么命令如下

git-rebase--on


现在紫色分支根本不在蓝色的提交日志中,您又有了两个独立的分支。然后,您可以独立地挤压紫色并执行任何其他操作,而无需中途执行合并提交。

要完全控制操作并保留任何要保留的合并提交,现代方法是使用


git rebase-i-r

你的回购协议是否被其他人推到了任何地方?这两个分支都是纯粹的本地分支。即使我在分支分支分叉之前选择了sha,我也能看到紫色分支的所有承诺-是的,然后,在生成的编辑器中删除它们,它们将被删除。删除提交会导致丢失对合并的所有修改。但是我做了一个软重置,我已经能够得到我想要的东西(订单与最初的预期不符)。这个答案在细节上不完整,你从哪个分支发起重基?相当确定你不想“删除”提交remove'不是rebase中的选项,但delete是。如果删除提交,将丢失它引入的更改。您想压缩提交。这听起来不对。撇开一个事实不谈,首先很难说出原始海报想要对紫色提交做什么,如果您恢复合并,这很好,它将对该提交的更改进行反向修补,并将其添加为另一个提交,取消紫色提交。这就像
1-1=0
。但是,如果您随后对紫色提交进行了重定基址,则会留下恢复的补丁,除非您也对其进行了重定基址。如果您不这样做,这就像将
-1
应用于您的历史记录,而不是
0
,因此您将留下您不想要的更改。@Cupcake,提供了两个不同的答案。我修改了答案,以减少混淆:帕法克这不是OP所要求的。他想保留更改,但要消除日志中的噪音。为此,他需要压缩提交,删除将删除更改。是的,看起来原始问题已被重新措辞。这个答案不适用于OPs问题。在
git rebase 5 master
的情况下,为什么它不是“A B C 1 2 3 4 5 D…”命令?该命令接受
master
5
没有共同点的提交,并将它们放在
5
之上。
C
上的提交不是
5
沿袭的一部分,它是第一个移动到
5
上的提交。如果您想以“abc1 2 3 4 5 D…”结束,您可以这样做:
git rebase c5;git rebase 5 master
在所有答案中,我发现这是最直接、最容易做到的。谢谢。这是问题的第一步,我同意最简单的方法就是按照要求做。第二步是
git合并--squash
git revert -m 1 <SHA of merge>
git rebase -i <SHA before branching out>
git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master
git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master
git rebase 5 master
git rebase --onto C D~ master