在Git中删除合并提交

时间:2015-05-31 19:41:45

标签: git

在这里,我有来自我的回购的提交日志。您可以看到“Merge branch ... into ...”提交,并在提交之后,分支被合并。

我需要删除该合并提交,但不要丢弃更改。 默认的变基不会显示那些合并提交。

enter image description here

1 个答案:

答案 0 :(得分:9)

如果你想在不包括合并提交的情况下应用提交的更改(正如Roland Smith所指出的那样通常被认为是不良做法),你可以使用git rebase来完成以下工作流程:

  1. 检查您希望更改的分支(让我们说主人):git checkout master
  2. 在要撤消的合并之前将master重置为提交:git reset --hard <hash of prior commit>。确保您正在处理的分支上没有未提交的更改,否则此命令将删除它们。
  3. 签出包含您想要“合并”到主人的更新的分支而不实际合并它(让我们称之为dev):git checkout dev
  4. dev重新加入主人。这将使dev的HEAD提交成为master指向的最新提交的上游:git rebase master(有关详细信息,请参阅the docs)。
  5. 修复在rebase期间产生的任何合并冲突(它们也会在正常合并中发生)。
  6. 重新分支的分支现在应该在master上的最新提交之后进行所有提交。要将其移植到master,请检查master(git checkout master)并合并新分支git merge dev。这会将更改提取到master而不添加合并提交。
  7. 一旦确定更新的master分支看起来没问题,您就必须更新任何远程存储库上的分支。由于您要撤消之前的历史记录,因此当您推送分支时,您必须使用远程仓库的--force(或-f)标记来接受更改,即:git push origin master --force
  8. 这就是它的全部。执行此操作后,从master分支的dev上的提交现在应该是上面的合并前提交的上游。

    注意:运行rebase将永久更新已更改分支的提交历史记录。为安全起见,我建议采用以下两种方法之一:

    1. Per @ Dacav的建议,在更新任何内容之前跟踪每个分支的提交哈希值。如果事情变成梨形,那么只需运行git reset --hard <original_commit_hash>将分支放回原始提交。
    2. 在指向原始提交的rebase之前制作两个分支的备份副本:

      git checkout -b master_bk git checkout -b dev_bk