如何将Git仓库重置为刚克隆时的状态?

16

有没有一条git命令可以产生与全新的git clone相同的结果?

即使存在额外的分支、文件、其他文件、本地标签等,哪个命令也能完成这个任务?


4
有一个名为 "git clone" 的命令... - Mad Physicist
1
你好,欢迎来到StackOverflow。你想这样做的原因是什么?我问这个问题是因为如果你的代码库出现了问题,通常有更好的方法来解决它,而不是把一切都清空。 - Schwern
好的,删除目录,查找正确的URL...然后git clone就可以工作了,但是不删除和重新克隆会更方便。 - byenary
@schwern:有时候会完成一些工作,提交一些东西等等...然后几周不做项目,其他人继续工作...当你回到项目时,你想要从头开始,而不是弄清楚你的本地代码与远程代码的差异。 - byenary
2
@byenary,更新你的仓库有更好的方法。git pull是主要机制。 - Schwern
@Schwerm,我知道,但这仍然会让我有很多不必要的分支、标签和其他东西,可能会让人感到困惑。 - byenary
4个回答

12

想要彻底清除所有本地的残留文件,最好的选择是进行全新的克隆

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

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

git clean -fd

现在将您的所有分支重置为远程版本 (git reset),或者如果它们仅存在于本地,请将其删除 (git branch):

git checkout master
git reset --hard origin/master

git branch -d local-branch

标签也是一样的。你可以像这样删除所有本地标签:

git tag -d $(git tag -l)

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

显然,git clone 是更容易的选项。


好的,是的,我担心这种情况,但也许有一些秘密的单个git命令方式 :-) 好的,所以rm -Rfv和git clone就是方法 :-) - byenary
这个答案做了一些假设...你想要追踪的上游是 origin(虽然通常是正确的),而默认分支或你关心的分支是 master(不太常见)。 - erik258
2
@Dan 这些是例子,而不是假设。假设是 OP 会理解并使用这段代码,而不是字面意义上的理解。我假设他们(以及未来的读者)足够仔细地阅读,以理解 origin<name-of-my-upstream> 的示例,而 master<name-of-my-branch> 的样本替代品。虽然我很感激你明确说明了这一点。 - Mad Physicist

5

如果您真的想要删除所有本地工作,我认为克隆最简单。如果存储库很大和/或网络速度很慢,则可以使用以下选项:

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

2
有时候会有一些工作已经完成,一些事情已经提交了,一些没有等等。然后你在几周内不再继续做这个项目,其他人继续工作。当你回到这个项目的时候,你想要重新开始,而不是去找出你本地代码相对于远程代码的位置。
如果你只想将你的本地分支更新到最新状态,你可以在不清空仓库的情况下解决这个问题。假设你的仓库看起来像这样。
          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/master,即master的上游版本。

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

重新创建一个新的本地 master 分支,从 origin/master 拉取最新代码并检出。
git checkout -b master origin/master

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

git remote set-url origin <original origin url>

最后执行git pull命令来获取最新版本的上游存储库、其分支,并更新master分支。

git pull

正如你所看到的,园艺现有的克隆更加容易。


1
只需使用 clean 命令(docs),如果您想要重置更改,可能需要在此之前使用 git reset --hard 命令。
git clean -dfx
  • -d 同时删除未跟踪的目录。
  • -f 强制删除所有文件和目录,无需确认。
  • -x 删除所有未跟踪的文件,包括被忽略的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接