Git 结帐行为

Git Checkout Behavior

我在通过终端使用 Git 时遇到问题。我已准备好将我的更改添加到 b运行ch 并提交它们。我把它搞砸了,在我把它们找回来之前就丢失了所有的更改。这是我 运行.

的命令
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 从来不知道您的更改。只要你没有git commit,就不会记录任何内容。

不幸的是,git checkout 命令可以调用两种完全不同的行为:

  • git checkout <em>paths</em>:这会破坏任何未提交的工作,不可恢复,1 不问是否可以;
  • git checkout <em>b运行ch</em>: 这会仔细检查给定的 b运行ch,如果这会破坏任何未提交的工作,则拒绝做任何事情(除非您提供 --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 中,特别阴险的情况 - 当您给它一个既是 b运行ch 又是 文件或目录名—git checkout 不再那么邪恶了,但重新训练你的手指仍然是明智的。

I forgot to add the -b in the checkout but I don't think missing the -b should have done anything.

消息 Updated 6 paths from the index 表明它确实如此(并且通过我在脚注中提到的 git add 技巧的恢复不适用于此处)。


1这里“不可恢复”的部分是:

  • 特定于 Git: 如果你有像 macOS 上的 Time Machine 这样的东西在工作,你也许可以通过这种方式恢复你的工作,或者如果你的编辑器做备份,你也许可以得到那些(我不知道 你的 编辑器是否这样做);和
  • 并非 100% 准确。

特别是if你运行git add,Gitdid看看你的未提交的工作和 准备 它被提交。随后的git checkout可能破坏了准备工作,但准备工作可能留下了痕迹,可以恢复部分或全部这些文件。