Git:恢复到之前的提交状态

MrB*_*les 24 git commit reset

我糊涂了.我想回到我之前在"git log"中确定的提交.

但是,当我做"git checkout"时,我没有得到承诺.没有什么变化.它告诉我我处于分离的HEAD模式,但我想要的文件不存在.

我做错了什么?

MRB

Mar*_*c W 20

git reset --hard <commit> 从联机帮助页:

将工作树和索引与正在切换到的树的索引相匹配.对工作树中跟踪文件的任何更改都将丢失.

git checkout用于将工作目录切换到其他分支或提交.这不会移动HEAD那里.

  • @Damien Pollet:不,`git reset`是一个瓷器命令,它将HEAD(通常是当前分支)改为指向给定的提交,并有各种选项(`--soft`,`--hard`,` - mixed`)确定当工作树和索引发生时会发生什么...... (2认同)

Ada*_*ruk 8

不要git reset -hard它是永久性的!

请用

git stash -u 
Run Code Online (Sandbox Code Playgroud)

代替!如果你有一件工作在那里偶然发生,你仍然可以把它拿回来.这永远不会被推到你的遥控器上,除非你选择通过制作一个分支并推动它来实现这一点.

此外,您在正确的轨道上可以git checkout用来完成同样的事情.语法是

git checkout HEAD -- . 
Run Code Online (Sandbox Code Playgroud)

但它有同样的问题git reset --hard.坚持藏匿,你将来会挽救失去的头发.

更长的答案

以上解决方案可以恢复所有更改.但是,你问过如何摆脱一些变化.为了完整起见,我会加上这个.

要做到这一点,你可以

git add file1 file2 file3
git stash save --patch
Run Code Online (Sandbox Code Playgroud)

现在,系统将提示您确切要求消失的内容......直到达到任何级别的粒度.因此,如果您选择这样做,您可以安全地"拒绝"对单个文件进行少量更改.

  • 如果我希望它是永久性的怎么办?我有时会开始做出我永远不想再看到的变化. (5认同)
  • “不要 git reset -hard 它是永久的!” 不,不是,那么 `git reflog` 怎么样? (2认同)
  • 是的,请注意这个答案是不正确的......`git reset --hard`仅永久更改未提交的代码 (2认同)