从历史记录中删除git提交

时间:2015-02-04 09:02:41

标签: git

假设我在git中有以下提交

A---B---C---D---E---F

还假设提交BD为空(不包含文件,即空快照)。

所以,我想摆脱BD;我正在做以下事情:

git filter-branch --prune-empty

我最终得到以下结论:

A---B---C---D---E---F
 \
  \--C'---E'---F'

然而,这不是我想要的,我想最终得到

A---C'---E'---F'

我该怎么做?

注意:我也试过了:

git rebase -i HEAD~6

但仍然无效。


重要更新

事实证明我做得对。来自 mu无的aswer激发了我更多关于为什么它为他工作而不是为我工作的调查。我的原始分支从未被删除。经过进一步调查后,我发现C广告F中的标签导致分支停留。因此,在运行filter-branch命令之前,我删除了两个标记并且它有效。

2 个答案:

答案 0 :(得分:1)

你实际上已经以正确的提交结束了,现在只做git checkout F'

如果您将这些更改推送到远程存储库,则需要使用git push -f origin branch_F':branch_F强制更新该分支。

示例示例:

  1. 创建新的仓库

    $ git init 
    $ touch a && git add a && git commit -m "added a"
    $ git commit --allow-empty -m "empty 1"
    $ touch b && git add b && git commit -m "added b"
    $ git commit --allow-empty -m "empty 2"
    $ touch c && git add c && git commit -m "added c"
    
  2. 检查提交历史记录

    $ git log --oneline
    27196e9 (HEAD, master) added c
    24e10de empty 2
    a2d3931 added b
    88be904 empty 1
    564d4e4 added a
    
  3. 运行filter-branch

    $ git filter-branch --prune-empty
    Rewrite 27196e9bc27e93ff54ebd10a5c8435e7fe496c78 (5/5)
    Ref 'refs/heads/master' was rewritten
    
  4. 再次检查日志提交

    $ git log --oneline
    221f0d0 (HEAD, master) added c
    ab6bf5f added b
    564d4e4 added a
    
  5. <强> 修改

    正如OP在他的comment中提到的那样,这种情况正在发生,因为中间提交中存在标签。删除标签使这项工作成功。

答案 1 :(得分:0)

有几种方法可以在git中完成它,但首先你必须确保没有人已经拉过分支。如果有人确实拉了你不能而且不应该更改树的历史记录。

如果某人已将其拉出,您只需重新添加“旧”内容并覆盖当前数据。

如果没有人在这里拉过你的一些选择:

  1. 键入 git reflog 并在更改前检查上次提交的最佳提交,您将获得一个分离的头,因此创建一个新分支,删除远程分支并再次推送它。

  2. 使用 git revert

  3. git format-patch** <number of commit to choose> 然后按照项目符号#1中的说明签出分支并应用所需的提交(删除您要跳过的提交)
  4. 还有更多选择,但这些选项最简单。