Git - 重复提交问题

10

我在我的代码库中意外地创建了由“未知”生成的提交,决定尝试从这里运行一个命令:

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "unknown" ];
        then
                GIT_COMMITTER_NAME="..";
                GIT_AUTHOR_NAME="..";
                GIT_COMMITTER_EMAIL="...";
                GIT_AUTHOR_EMAIL="...";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

起初我认为一切都很好,直到我在gitk中注意到,在运行这个命令之前的每个提交都被复制了,而不是像我最初想的那样只是编辑了。 是否有可能清理这个呢?
编辑:好的,gitk显示旧提交(其中混合了“未知”提交者)和新提交(重写的提交),在一定的中间点上分开。想象一堆提交,然后复制(并带有编辑),并堆叠在原始提交之上。如果可能的话,我想做的是删除原始提交。

1
让我们看看我是否理解了:您是否有一个提交树,看起来像 ...--a--b--c--(*)--a'--b'--c'--d--e,其中 (*) 是您运行错误命令的提交,[abc]' 是您想要删除的错误重复提交,而 [de] 是您想要保留的提交? - John Feminella
1
嗯,由于分支的原因,情况会更加复杂,但基本上就像你说的那样,不过我想保留 ',因为它们有固定的作者字段。 - unrelativity
1
好的,所以你想刪除[abc],但保留'[abc]'? - John Feminella
1
是的,我想删除我的原始提交。 - unrelativity
2个回答

7
答案就在.git/refs/original目录下的文件中,而我找到的命令不应该以HEAD结尾,而是应该以--tag-name-filter cat -- --all结尾。感谢#git频道的_Vi和wereHamster提供的帮助。

1
如果您知道最后一个好的提交,可以使用以下代码来保险起见:
git reset <last_good_commit>   # Warp back to a good state.
git push -f master             # Push the changes up (you need -f to force it to
                               #  obliterate old commits).

如果你想更谨慎一些(例如,在之后混合了好的和坏的提交),可以使用git rebase -i来挑选那些应该保留下来的好的提交。

我对命令行不是很熟悉,也不确定 cherry picking 或者 rebasing 是什么... 另外,我已经添加了一个关于我想做的事情的澄清。 - unrelativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接