我在通过终端使用 Git 时遇到问题。我已准备好将更改添加到分支并提交它们。我把它搞砸了,在我能把它们找回来之前就丢失了所有的改变。这是我运行的命令。
git checkout name
Update 6 paths from the index (This is where I lost all my changes.)
git checkout -b name
git status (This is when I found all my changes were gone.)
我忘记在结账时添加 -b,但我认为缺少 -b 应该不会做任何事情。然后我就尝试了
git reflog
1234e (HEAD -> name, origin/master, origin/HEAD, master) HEAD@{0}: checkout: moving from master to name
1234e (HEAD -> name, origin/master, origin/HEAD, master) HEAD@{1}: checkout: moving from master to name
1234e (HEAD -> name, origin/master, origin/HEAD, master) HEAD@{2}: checkout: moving from master to name
1234e (HEAD -> name, origin/master, origin/HEAD, master) HEAD@{3}: checkout: moving from master to name
然后我尝试通过 1234e 结帐,但仍然没有成功取回我的更改,甚至进一步返回到较早的更改,看看那个更改是否运气好。 到目前为止,互联网上已经没有解决这个问题了。我希望我仍然有我的改变,我真的不想再做一遍这项工作,因为这需要几个小时的工作。有人有办法恢复我的更改吗?
谢谢!
不幸的是,
git checkout
命令可以调用两种完全不同的行为:
git checkout paths
:这会不可挽回地破坏任何未提交的工作,1而不询问是否可以;git checkout branch
:这会仔细检查给定的分支,如果这会破坏任何未提交的工作,则拒绝执行任何操作(除非您提供 --force
标志或类似标志)。这不适合初学者。 哎呀,它甚至对经验丰富的 Git 用户都不友好。 Git 的人们终于解决了这个问题,在这个问题存在十多年之后,在 Git 2.23 中:他们将 git checkout
命令分成了两个不同的命令。
git switch
- 实现更安全的行为。 除非您使用像
--force
这样的特定选项,否则它永远不会破坏未提交的工作。 另一个,git restore
,实现了“不安全”行为:它会毫无疑问地覆盖未提交的文件,因为它假设您已经通过首先运行git restore
声明您知道自己在做什么。如果您有 Git 2.23 或更高版本,那么重新训练手指输入 git switch
而不是
git checkout
可能是明智之举。 (我自己仍在这个过程中。)在 Git 2.23 中,特别阴险的情况——当你给它一个既是分支 又是文件或目录名的名称时发生的情况——
git checkout
不再那么邪恶了,但重新训练你的手指仍然是明智的。
我忘记在结账时添加 -b,但我认为缺少 -b 应该不会做任何事情。消息
Updated 6 paths from the index
表明它确实如此(并且通过我在脚注中提到的
git add
技巧进行恢复不适用于此处)。
这里“不可恢复”的部分是:
特定于你运行了git add
,Git
did会查看你未提交的工作并准备将其提交。 随后的
git checkout
可能破坏了准备工作,但准备工作可能留下了允许恢复部分或全部这些文件的痕迹。
git commit
,就不会记录任何内容。