当你混合两个不同的repos时,如何删除git中最后一次推送的所有提交?

时间:2015-12-21 22:59:02

标签: git

我有一个GIT存储库(A),它已经提交了两年以上的旧版本,然后有不同的存储库(B),其提交类似于一年。

不是发生了什么事情,在设置B的存储库源时,出现了一个错误,它导致了存储库A,在推送之后,存储库A中的存储库B都提交了所有提交。

有没有办法删除这些提交?

我也应该说有及时混合提交,所以我不能轻易重置提交,因为它会重置来自存储库A的所有提交,是吗?

4 个答案:

答案 0 :(得分:2)

有几个选择:

  1. Git重置为给定提交

    # This will destroy any local modifications.
    # Don't do it if you have uncommitted work you want to keep.
    git reset --hard 0d1d7fc32
    
  2. 结帐最后一次

    git checkout -b <new_branch> <commit id>
    
    // Now your branch contains all the commits up to the 
    // desired one and without the newer ones
    
  3. git revert

    git revert将允许您回滚任何提交,您需要做的是列出A中要删除的所有提交(使用脚本),然后从第二个存储库中还原它们

    git revert <commit1> <commit2> ... <commitn>
    
  4. filter-branch

    使用此选项可完全删除历史记录中的提交。

    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 
    

答案 1 :(得分:2)

由于所有您想要的提交都完好无损并且socket.disconnect(true)刚被移动,因此不需要实际删除任何提交;所有你需要做的就是把主人放回到推动之前的位置:

master

任何需要保留的提交(即因为它们已经是好主人历史的一部分)将被保留,并且任何不属于该提交的提交都将保留在历史将由GitHub最终收集垃圾。

答案 2 :(得分:0)

您可以尝试使用git rebase -i <commit>。其中<commit>将是您从存储库(A)启动提交的提交的父级。然后选择要更改的提交,将其标记为pick。如果您要删除提交,请将其标记为delete。每个选中的提交都将被签出,您可以通过git commit --amend编辑提交。

答案 3 :(得分:0)

当您从不相关的存储库推送分支时,它们的提交不会混合。您要么获得新分支,要么完全替换现有分支:

1)如果你在A中没有同名的分支,那么你只需创建一个新的分支,它不包含任何A提交:

-(B1)-(B2)-..-(BM) <--- branchB

可以简单地删除这些分支。

2)如果A和B的分支具有相同的名称,那么它的完全被替换:

-(A1)-(A2)-(A3)-(A4)-..-(AN) <--- branch (rewritten)

-(B1)-(B2)-..-(BM) <--- branch

这很难修复 - 你应该找到包含A文件的分支的最后一点。它不久前,可以使用git reflog命令。您还可以使用该命令从案例2中挑选案例1。

(混合提交的唯一方法是在错误推送之后通过B提交从A提交文件:

-(B1)-(B2)-..-(BM)-(A)!!!

但是这样的改变就是从B中删除所有文件并添加A中的所有文件,你会在提交时注意到它,所以我认为这样的事情没有发生)

因此,为了解决问题,您可以扫描当前在A中的所有分支,并检查它是否包含A或B文件(使用git ls-files _branch_)。然后为每个B分支运行git reflog _branch_。如果它只包含1行_hash_ _branch_@{0}: push - 它只是B分支,可以删除。如果它更长,则为每一行调用git ls-files _hash_,以查找仍具有A文件的最后一次提交。当您发现它运行git branch -f _branch_ _hash_时将分支重置为该哈希值。

PS:阅读http://git-scm.com/book/en/v2

的前3章将是件好事