在从Subversion建立迁移的过程中,我已经有了一个本地存储库(没有远程存储库)。
其中有很多标签,并且一切都很好,即我一直在运行git add . -A
,然后运行一次提交,然后运行git tag -a
,等等。
我想做的是取回每个标签中的代码,以便与我在另一个文件夹中的库进行比较,因此我做了我在Subversion中要做的事情,删除了文件/文件夹,切换到我想要的标签( git checkout v1.0.0
等),然后等效于 update 将v1.0.0等带回到工作文件夹中。
完成此操作后,我意识到它认为我现在想使用大量删除操作来更新标签。
所以,长话短说,我该如何找回我的文件,即像使用Subversion'Update'那样还原文件:)
之所以这样做,是因为我想每次都从一个干净的文件夹开始,而不是签出到当前版本已满的文件夹中。
谢谢。
答案 0 :(得分:4)
所以我做了我在Subversion中要做的事情,删除了文件/文件夹,切换到我想要的标签(git checkout v1.0.0,等等),然后进行了等效的更新以恢复v1.0.0,等等。
Git不是Subversion。从Subversion切换到Git是重新了解什么是版本控制的过程。
在Git中不需要进行任何删除和更新。只需git checkout v1.0.0
。在Git中签出旧版本完全正常。 What is Git? in the Pro Git book可能有助于阅读。
完成此操作后,我意识到它认为我现在想使用大量删除操作来更新标签。
假设您没有执行git add
或git rm
,请执行git checkout .
将所有已更改和已删除的文件恢复为已提交的版本。
清除所有更改的更通用的方法是git reset --hard HEAD
。这将同时还原您的工作目录并清除暂存区。
答案 1 :(得分:3)
如有疑问,请运行git status
,因为它会提示您下一步操作。
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: my-important-file
# deleted: another-important-file
#
所有命令合而为一,
git checkout -- my-important-file another-important-file
Git喜欢递归地进入目录。
git checkout -- .
有时候您想让大狗吠叫。
git ls-files -d -z | xargs -0 --no-run-if-empty git checkout --
答案 2 :(得分:2)
首先,除非您使用的是git <2.0.X,否则无需使用git add . -A
,这是自git 2.0.0起的默认行为
为了“找回”您以前的内容,请阅读此答案,并将git reset
与git reflog
一起使用
How to move HEAD back to a previous location? (Detached head) & Undo commits
之所以这样做,是因为我想每次都从一个干净的文件夹开始,而不是签出到当前版本已满的文件夹中。
那么为什么不从必需的标签中签出呢?
git checkout -b <new branch> <tag>
答案 3 :(得分:0)
对于有关还原文件的直接问题,您已经有了很好的答案,但是我想指出问题的根源...
我想做的是取回每个标签中的代码,以便与我在另一个文件夹中的库进行比较,因此我做了我在Subversion中要做的事情,并删除了文件/文件夹,切换到我想要的标签( git checkout v1.0.0等),然后进行等效的更新以将v1.0.0等带回到工作文件夹中。
您当然可以 通过将两个版本都放在计算机上的某个位置,然后手动或使用diff工具进行比较来查看项目的不同版本之间的差异,但是自git
版本库中的版本,您通常不需要这样做。您可以使用git diff
在提交,分支,标签,单个文件或跨时间段之间进行比较。我将显示一些示例,但是文档页面的底部已经足够了(或者只需键入git diff --help
并滚动到底部)。而且,如果要比较的版本存储在Github中,则可以easily compare them,而无需将这些版本下拉到计算机上。