好吧所以我在git add . --all
之后提交了我的文件它显然删除了我刚刚删除的文件而不是保存它们。有没有办法恢复这些文件?我尝试了一切,最终搞砸了我的本地存储库。当我推送到github时,它也没有显示任何变化。
M .DS_Store
M Gemfile
M Gemfile.lock
D app/assets/javascripts/hashtags.js.coffee
D app/assets/stylesheets/hashtags.css.scss
M app/assets/stylesheets/profiles.css.scss
M app/controllers/application_controller.rb
D app/controllers/hashtags_controller.rb
D app/controllers/moneytags_controller.rb
M app/controllers/postings_controller.rb
D app/controllers/usertags_controller.rb
D app/helpers/hashtags_helper.rb
D app/helpers/tags_helper.rb
M app/models/posting.rb
D app/views/hashtags/index.html.erb
D app/views/hashtags/show.html.erb
M app/views/layouts/application.html.haml
D app/views/moneytags/index.html.erb
D app/views/moneytags/show.html.erb
M app/views/postings/_form.html.erb
D app/views/postings/_posting.html.haml
M app/views/postings/index.html.erb
M app/views/postings/index.json.jbuilder
M app/views/postings/show.html.erb
M app/views/postings/show.json.jbuilder
M app/views/profiles/show.html.haml
D app/views/usertags/index.html.erb
D app/views/usertags/show.html.erb
M config/routes.rb
M db/migrate/20140301150615_create_postings.rb
D db/migrate/20140303200423_add_body_to_postings.rb
D db/migrate/20140305184935_create_supertag_tags.rb
D db/migrate/20140305184936_create_supertag_taggings.rb
D db/migrate/20140305214420_create_supertag_hashtags.rb
D db/migrate/20140305214421_create_supertag_hashtaggings.rb
D db/migrate/20140305214422_create_supertag_usertags.rb
D db/migrate/20140305214423_create_supertag_usertaggings.rb
D db/migrate/20140305214424_create_supertag_moneytags.rb
D db/migrate/20140305214425_create_supertag_moneytaggings.rb
M db/schema.rb
D test/controllers/hashtags_controller_test.rb
D test/helpers/hashtags_helper_test.rb
答案 0 :(得分:1)
--all
的{{1}}(或-A
)标记表示“自动添加任何新的或已更改的文件,并自动删除我手动删除的所有文件”。或者,更简单:“设置下一个提交看起来像工作目录现在看起来。”
以上表示当您运行git add
时,您的git add . --all
与app/assets/stylesheets/profiles.css.scss
提交不同,但您没有名为HEAD
的文件。所以你问git请让下一次提交有不同的app/assets/stylesheets/hashtags.css.scss
,但没有profiles.css.scss
。然后你做了一个hashtags.css.scss
所以新的提交看起来像那样。
有没有办法恢复这些文件?
是。他们是旧的承诺。这就是提交的点:每个提交都有一个完整的工作树副本。
当我推送到github时,它也没有显示任何变化。
git commit
所做的就是将新提交发送到接收端,并更新其分支头。通常,这只会添加新的提交(要在推送过程中删除提交,必须使用push
或--force
)。因此,旧版提交中仍然可以使用任何文件的旧版本。
使用-f
或git log
或git log --all
或其他图形查看器查看旧提交。
如果您只想从旧提交中检索一个文件,可以使用gitk --all
查看该文件:
git show
将显示该文件的外观“分支主机上的五个提交”(git show master~5:app/views/hashtags/index.html.erb
给出了“及时移回”的提交数量。(
要在工作树中获取该文件的该版本,并安排旧版本进入“下一次”提交,请使用~5
:
git checkout
(git checkout master~5 -- app/views/hashtags/index.html.erb
vs git show
的不同语法有点烦人,但人们可以习惯它。)
如果要彻底撤消“错误”提交,可以使用git checkout
:
git revert
这个命令说:“将我给你的提交ID与之前的提交进行比较。无论我做了什么改变,现在就做出完全相反的改变。”因此,如果你删除了一个文件,git会用它的旧内容创建它。如果您添加了一些文本,git将删除该文本。如果您从文件中删除了一行,git会将该行添加到该文件中(在原始位置)。如果您添加了文件,git会将其删除。
您可以还原任何旧提交,而不仅仅是最新提交,尽管在某些情况下git可能需要您的帮助。例如,让我们说三个提交前(git revert <bad-commit-ID>
)你向master~3
添加了两行,然后在最后一次提交中你改变了其中一行。如果您现在尝试zorg.txt
,git将要删除这两行,但其中一行现在不同,因此不确定该怎么做。
(恢复最近的提交始终有效,因为有定义 - 没有新的更改干扰退出最近的更改。)
在特殊情况下,您可以使用git revert master~3
丢弃最后一次提交,但是没有回头,如果您已经推送(发布给其他人)错误提交,则必须强制推送结果。与此同时,他们可能会将他们的工作基于糟糕的提交;他们并不期望它会消失,你会为他们做额外的工作来恢复。因此,一般来说,git reset --hard HEAD^
发布的提交更好,而不是丢弃它。 (Revert添加了一个新的提交,所以你根本不会丢失任何东西,你只需要向你的Git Borg Collective添加更多东西。)
(要了解如何为提交命名,请查看gitrevisions
documentation。通常最简单的方法是使用revert
获取原始SHA-1名称 - 例如git log
- 并切割 - 如果您使用的是命令行工具,请用鼠标粘贴它们。但是学习676699a0e0cdfd97521f3524c763222f1c30a094
和master^
等名称会很好。)