Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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 Rebase - Fatal编程技术网

重写git历史记录,重写添加和删除提交

重写git历史记录,重写添加和删除提交,git,git-rebase,Git,Git Rebase,我在当地的一家分公司做了一些开发工作,提交历史非常糟糕,所以我会回去重新调整,整理一下,让它处于合理状态,然后再推进 假设我提交了A、B、C、D、E。在提交B中,我添加了一些有用的代码,我想保留这些代码,但我也添加了一些调试代码。后来我删除了D中的调试代码。要完全从历史记录中删除它,最好的方法是什么(代码没有任何用处,所以如果可能的话,我不希望它出现在历史记录中) 我曾尝试在A处重定基址,在没有代码的情况下在B处重写提交,但在每个重定基址步骤中,C和D都需要手动干预。 是否最好将B、D拆分为B-

我在当地的一家分公司做了一些开发工作,提交历史非常糟糕,所以我会回去重新调整,整理一下,让它处于合理状态,然后再推进

假设我提交了A、B、C、D、E。在提交B中,我添加了一些有用的代码,我想保留这些代码,但我也添加了一些调试代码。后来我删除了D中的调试代码。要完全从历史记录中删除它,最好的方法是什么(代码没有任何用处,所以如果可能的话,我不希望它出现在历史记录中)

我曾尝试在A处重定基址,在没有代码的情况下在B处重写提交,但在每个重定基址步骤中,C和D都需要手动干预。 是否最好将B、D拆分为B-keep和B-remove以及D-keep和D-remove,然后删除这两个提交?当代码被添加后又被删除时,是否有其他方法来清理


我想以类似于A,B(有用),C,D(有用),E的历史结束,然后将其压缩为A,B,E。例如,在这个阶段,我只想从历史中删除调试代码。

应用于Q更新:

您可以使用此工具循环提交并删除不需要的提交。

阅读有关如何使用它的示例部分

它比git filter branch快得多,但效果相同


其他一些选择:

请阅读此处有关每个选项的详细信息:

git-rebase-i
编辑要清理的每个提交,并从中删除代码。如果您没有太多的提交,如果您有-使用
过滤器分支
或'bfg repo cleaner'

git签出
这将使你回到你想要的承诺


git复位头——硬
“移动”你的头回到想要的位置

#这将破坏任何本地修改。
#如果你有未完成的工作要做,就不要做。
git重置—硬0d1d7fc32
#或者,如果有工作要做:
暂存
git重置—硬0d1d7fc32
吉特隐藏流行音乐
#这将保存修改,然后在重置后重新应用该修补程序。
#如果您修改了以前的内容,则可能会出现合并冲突
#自您重置到的提交后已更改。
  • 注:()
    您还可以使用git-rebase--no-autostash

git签出
git签出-b
git checkout HEAD~X//X是无法返回的提交数
这将签出指向所需提交的新分支

通常的修复程序正在使用,并结合:

您可以优化查找条件,以仅查找具有特定扩展名的文件(
--name'*.java'

这将从历史记录中删除调试代码,而无需手动干预中间提交。

当然,这将为所有相关的提交重写SHA1,迫使您执行一个
git push--force
,因此,如果您不是唯一一个执行该repo的人,请务必将即将进行的分支重置告知其他合作者。

如果提交
D
只是从提交B中删除调试代码,则您可以使用
rebase-i
对提交和挤压进行重新排序,例如,当您开始重定基址时,您将在此处看到:

pick c9a8ee8 B
pick f533903 C
pick c66cc92 D
pick 647ab90 E
现在您需要在提交
B
之后移动提交
D
,您只需要编辑文本内容:

pick c9a8ee8 B
pick c66cc92 D
pick f533903 C
pick 647ab90 E
最后,您需要将提交
D
pick
更改为
squash
,如下所示:

pick c9a8ee8 B
squash c66cc92 D
pick f533903 C
pick 647ab90 E

在完成重定基址后,提交
D
将成为提交
B

的一部分。我在问题的末尾添加了一点内容,但我不明白上面的内容如何让我达到我想要的位置。这假设“调试代码”可以通过模式轻松检测到。如果调试代码很复杂/跨越多行,那就不那么容易了。在这种情况下(复杂代码或少数模式),最好使用挤压。
# find out the desired file and execute sed on it to find out
# where is the debug code inside the file
git filter-branch --tree-filter "find . -type f -exec sed -i -e 's/pattern with debug/d' {} \;" -- A~..
pick c9a8ee8 B
pick f533903 C
pick c66cc92 D
pick 647ab90 E
pick c9a8ee8 B
pick c66cc92 D
pick f533903 C
pick 647ab90 E
pick c9a8ee8 B
squash c66cc92 D
pick f533903 C
pick 647ab90 E