如何将 Git 存储库重置为其新克隆的状态?

How can I reset a Git repository to its newly-cloned state?

是否有 git 语句与新的 git 克隆结果相同?

所以即使有额外的分支、额外的文件、其他文件、本地标签等等......哪个命令可以完成这个?

删除所有本地工件的最佳选择是制作一个新的 clone

否则,您必须 运行 不同的命令来执行清理的各个组件。

要删除所有未跟踪的文件,请使用 git clean,打开任意数量的标志以清除所有内容:

git clean -fd

现在将所有分支重置为远程版本 (git reset) or delete them if they are local-only (git branch):

git checkout master
git reset --hard origin/master

git branch -d local-branch

标签也是如此。您可以像这样删除所有本地标签:

git tag -d $(git tag -l)

如果您知道自己在做什么,您也可以通过操作 .git 文件夹的内容来手动执行许多此类操作。

如您所见,git clone 是迄今为止更简单的选择。

sometimes some work was done, some things committed some not etc.. then dont't work on a project for weeks, other people keep working.. when you then come back to a project you want to start clean without figuring out where your local code is compared to the remote

如果您只想让您的本地分支保持最新,您可以在不清除存储库的情况下解决这个问题。假设您的存储库如下所示。

          D - F [feature]
         /
A - B - C [origin/master]
         \
          G - H [master]

您可以获得与 git log --graph --decorate --all 非常相似的视图,尽管它是侧向的。

您对 master 和名为 feature 的新分支都进行了一些更改。您已经有了远程工作的干净版本。 origin/master 跟踪远程 master 分支上的远程工作。

这不会自动保持最新。您可以使用 git fetch -p 更新它和所有其他远程跟踪分支(-p 将修剪任何旧的远程分支)。

git fetch -p

          D - F [feature]
         /
A - B - C - I - J - K [origin/master]
         \
          G - H [master]

现在您的 origin/master 是最新的,您可以像查看任何其他分支一样查看它以查看最新工作。

您可以使用 git rebase origin/master 的最新更改使任何其他本地分支机构保持最新状态。这将重播 origin/master 之上的任何本地更改。例如,要更新 feature 分支...

git checkout feature
git rebase origin/master

                      D1 - F1 [feature]
                     /
A - B - C - I - J - K [origin/master]
         \
          G - H [master]

或者,如果您对某个分支不再感兴趣,可以将其删除。

git branch -D feature

A - B - C - I - J - K [origin/master]
         \
          G - H [master]

最后,如果您只想放弃对 master 的更改,请使用 git reset --hard 强制 master 移动到 origin/master

git checkout master
git reset --hard origin/master

                      D1 - F1 [feature]
                     /
A - B - C - I - J - K [origin/master]
                      [master]

现在你是最新的了。


回答有关清除存储库的问题...

Git 存储库通常非常小(否则会导致其他问题)。假设您有良好的网络连接,确保真正干净重置的最简单方法是再次克隆它。

如果那不可能,下一个最佳选择是 。但是通过克隆一个新的存储库来摆脱困境是一个坏习惯。练习园艺您的存储库。

克隆现有克隆并清除其本地分支和标签。这将保证 .git/hooks.git/config 之类的东西被重置。

首先,克隆本地脏存储库。

git clone /path/to/the/dirty/repo /path/to/the/new/new_repo
cd /path/to/the/new/new_repo

然后删除所有本地分支和标签。

Git不会让你删除当前分支,所以检查origin/mastermaster的上游版本。

git checkout origin/master

获取所有本地分支并删除它们。

git for-each-ref --format '%(refname:short)' refs/heads

获取所有本地标签并删除它们。

git for-each-ref --format '%(refname:short)' refs/tags | xargs git tag -d

origin/master 重新创建一个新的本地 master 并检查它。

git checkout -b master origin/master

将您的来源设置为原始存储库。您可以从脏存储库中的 git remote -v 中获取它。

git remote set-url origin <original origin url>

最后做一个 git pull 来获取最新版本的上游存储库及其分支,并更新 master

git pull

如您所见,种植现有克隆更容易。

如果你真的想删除所有本地工作,我也认为克隆是最简单的事情。如果存储库很大 and/or 网络很慢,那么您可以使用这些选项:

git clone --reference existing-clone --dissociate URL new-clone