我有一个GIT存储库(A),它已经提交了两年以上的旧版本,然后有不同的存储库(B),其提交类似于一年。
不是发生了什么事情,在设置B的存储库源时,出现了一个错误,它导致了存储库A,在推送之后,存储库A中的存储库B都提交了所有提交。
有没有办法删除这些提交?
我也应该说有及时混合提交,所以我不能轻易重置提交,因为它会重置来自存储库A的所有提交,是吗?
答案 0 :(得分:2)
有几个选择:
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
git checkout -b <new_branch> <commit id>
// Now your branch contains all the commits up to the
// desired one and without the newer ones
git revert
git revert将允许您回滚任何提交,您需要做的是列出A中要删除的所有提交(使用脚本),然后从第二个存储库中还原它们
git revert <commit1> <commit2> ... <commitn>
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_
时将分支重置为该哈希值。