如何将 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/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
从 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
是否有 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/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
从 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