如何重置整个Git存储库,而不仅仅是“主”分支,以匹配远程?

问题描述:

标题说的是什么。如何重置整个Git存储库,而不仅仅是“主”分支,以匹配远程?

我想重置每一个地方分支,以配合我的远程存储库,包括删除一些分支机构和只存在于本地的标签,而不必删除一切,从头克隆。我能找到的所有信息都是关于如何重置特定分支的说明,但不是整个存储库。

更妙的是,如果它可以从TortoiseGit外壳扩展来完成。但是我对命令行也很好。

+0

这可能是一个重复的http://stackoverflow.com/questions/13064613/how-to-prune-local-tracking-branches-that-do-not-exist-on-remote-anymore – Juuuuuu

+0

距离初始状态你想要吗?你想保留幸存分支的reflog吗?合并选项?最残忍的答案是克隆而不进行重新调整,'''git clone --reference = .git'git config remote.origin.url' ../newclone; cp -al .git/objects ../newclone/.git; rm ../ newclone/.git/objects/info/alternates''',但这并不能保存reflogs或merge/pull选项或任何东西,这是一个完全原始的克隆。 – jthill

+0

@jthill我真的想要一个精确的远程克隆,所以你的解决方案似乎是有效的。现在我去[PetSerAl的答案](http://stackoverflow.com/a/41147559/3258851),但如果你知道你的建议将是可取的,为什么,我可能会改变我的选择答案! –

您可以通过下面的命令做到这一点:

git checkout --orphan @ 
git fetch <Remote> refs/*:refs/* --refmap= --prune --force 

其中<Remote>是远程仓库要使用。您只需fetch所有远程裁判(refs/*:refs/*)与--prune--force标志拆除和强制更新本地引用。

+0

正确的想法,但这将反映远程,包括其远程跟踪,不完全是OP想要的。 – jthill

+0

@jthill OP问:*如何重置**整个** Git存储库*。如果你想重置别的东西,比如只有分支和标签,那么你需要改变refspecs到任何你想要的。例如:'refs/heads/*:refs/heads/* refs/tags/*:refs/tags/*'。 – PetSerAl

下面一行将所有本地分行有一个配置的上游分支上游分支的状态

git checkout @{0} && git for-each-ref refs/heads --format '%(refname:strip=2)' | xargs -ri sh -c 'git rev-parse {}@{u} >/dev/null 2>&1 && git branch -f {} $(git rev-parse {}@{u})' 

您将结束与一个分离HEAD重置由于第一个命令,因为您无法重置当前签出的分支,因此在完成此操作后签出您想要在工作目录中的分支。