当您混合使用两种不同的回购协议时,如何从最后一次推送git中删除所有提交?
我有一个GIT存储库(A),它的提交时间超过两年,然后有另一个存储库(B),它的提交时间大约为一年 不是发生了什么,当设置B的存储库来源时,出现了一个错误,导致存储库a,在推送之后,存储库a中有来自存储库B的所有提交 有没有办法删除这些提交 我还应该说,时间上存在混合提交,因此我无法轻松重置为提交,因为它将重置存储库A中的所有提交,对吗?有几个选项:当您混合使用两种不同的回购协议时,如何从最后一次推送git中删除所有提交?,git,Git,我有一个GIT存储库(A),它的提交时间超过两年,然后有另一个存储库(B),它的提交时间大约为一年 不是发生了什么,当设置B的存储库来源时,出现了一个错误,导致存储库a,在推送之后,存储库a中有来自存储库B的所有提交 有没有办法删除这些提交 我还应该说,时间上存在混合提交,因此我无法轻松重置为提交,因为它将重置存储库A中的所有提交,对吗?有几个选项: Git重置为给定的提交 签出最后所需的 过滤器分支 使用此选项可从历史记录中完全删除提交 git filter-branch --commit
过滤器分支
使用此选项可从历史记录中完全删除提交
git filter-branch --commit-filter '
if [ `git rev-list --all --grep "<log-pattern>" | grep -c "$GIT_COMMIT"` -gt 0 ]
then
skip_commit "$@";
else
git commit-tree "$@";
fi'
HEAD
git过滤器分支--提交过滤器'
if[`git rev list--all--grep”“| grep-c“$git_COMMIT”`-gt 0]
然后
跳过提交“$@”;
其他的
git提交树“$@”;
fi'
头
您可以尝试使用
git-rebase-i
。其中
将是从存储库(A)开始提交的提交的父级。然后选择要更改的提交,将其标记为“拾取”。如果要删除提交,请将其标记为delete
。每个选中的提交都将被签出,您可以通过执行git commit--amend来编辑提交。当您从无关的存储库中推送分支时,它们的提交不会混合。您要么获得一个新分支,要么完全替换现有分支:
1) 如果在中没有同名的分支,则只需创建一个不包含任何A提交的新分支:
-(B1)-(B2)-..-(BM) <--- branchB
但这样的更改将删除B中的所有文件,并添加A中的所有文件,您会在提交时注意到这一点,所以我假设没有发生这种情况。)
因此,要解决问题,您需要扫描当前位于A中的所有分支,并检查它是否包含A或B文件(使用git ls files\u branch\u
)。然后为每个B分支运行git reflog\u分支。如果它只包含一行\u hash\uu branch\u@{0}:push
,则它是只包含B的分支,可以删除。如果较长,则为每一行调用git ls files\u hash\uu
,以查找最后一次提交时仍有A文件。当您发现它时,运行git branch-f\u branch\u\u hash\u
将分支重置为该散列
PS:最好阅读的前3章,因为您所需的所有提交都完好无损,并且刚刚移动了
master
,所以不需要实际删除任何提交;您只需将master放回推之前的位置:
git checkout master
git reset --hard <commit SHA-1 of where you want master to be>
git push --force-with-lease <your remote> master
git签出主机
git重置——硬
git push--使用租约主控器强制
任何需要保留的提交(即,因为它们已经是“好”主人的历史记录的一部分)都将被保留,任何不属于历史记录的提交最终将由GitHub进行垃圾收集。我认为重置不会有帮助,因为如果我在12月1日对他们两人都进行了提交,并且我想在11月1日进入阶段,它会删除提交到存储库A(12月1日),对吗?在我回答后看到了您的更新。根据您的限制,我会更新我的答案,使其更加正确。好的,但是“还原”会将这些文件保留在历史记录中,对吗?它只会创建一个新的提交,并使用还原的操作。如果我想从历史记录中完全删除此错误,该怎么办?为了完全删除提交,您需要使用
过滤器分支
,这有点复杂,但它会起作用。请您解释一下最后一个选项的作用,好吗?我不太懂第二句话,你是说这应该是我推送到存储库A的存储库B的第一次提交吗?要将它们全部移除?A和B的承诺是否共享任何共同祖先?不,它们是完全分离的。正如您在这张图上看到的,黑色的不应该在那里。假设您希望master指向,并且应该删除(或至少使其无法访问)和master当前位置之间的路径中的所有提交,这是否正确,这是正确的。不需要实际删除任何提交;你所需要做的就是git checkout master;git复位——硬fb7e4a4;git push--使用租约主控卡强制执行
。任何需要保留的提交都将被保留,任何不属于历史记录的提交最终都将被GitHub垃圾收集。嗨,谢谢你的回答。这两个repo确实有相同的分支名称(master),但它没有被替换,我可以看到A和B的所有提交,如果我查看git树,我甚至可以看到这两个分支没有混合。请看这里()黑色的分支线来自B分支,它不应该在那里。
git filter-branch --commit-filter '
if [ `git rev-list --all --grep "<log-pattern>" | grep -c "$GIT_COMMIT"` -gt 0 ]
then
skip_commit "$@";
else
git commit-tree "$@";
fi'
HEAD
-(B1)-(B2)-..-(BM) <--- branchB
-(A1)-(A2)-(A3)-(A4)-..-(AN) <--- branch (rewritten)
-(B1)-(B2)-..-(BM) <--- branch
-(B1)-(B2)-..-(BM)-(A)!!!
git checkout master
git reset --hard <commit SHA-1 of where you want master to be>
git push --force-with-lease <your remote> master