当您混合使用两种不同的回购协议时,如何从最后一次推送git中删除所有提交?

当您混合使用两种不同的回购协议时,如何从最后一次推送git中删除所有提交?,git,Git,我有一个GIT存储库(A),它的提交时间超过两年,然后有另一个存储库(B),它的提交时间大约为一年 不是发生了什么,当设置B的存储库来源时,出现了一个错误,导致存储库a,在推送之后,存储库a中有来自存储库B的所有提交 有没有办法删除这些提交 我还应该说,时间上存在混合提交,因此我无法轻松重置为提交,因为它将重置存储库A中的所有提交,对吗?有几个选项: Git重置为给定的提交 签出最后所需的 过滤器分支 使用此选项可从历史记录中完全删除提交 git filter-branch --commit

我有一个GIT存储库(A),它的提交时间超过两年,然后有另一个存储库(B),它的提交时间大约为一年

不是发生了什么,当设置B的存储库来源时,出现了一个错误,导致存储库a,在推送之后,存储库a中有来自存储库B的所有提交

有没有办法删除这些提交

我还应该说,时间上存在混合提交,因此我无法轻松重置为提交,因为它将重置存储库A中的所有提交,对吗?

有几个选项:

  • Git重置为给定的提交
  • 签出最后所需的
  • 过滤器分支
    使用此选项可从历史记录中完全删除提交

    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