Git 签出行为

问题描述 投票:0回答:3

我在通过终端使用 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 git-checkout
3个回答
3
投票

不幸的是,

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
技巧进行恢复不适用于此处)。


1

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

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

你运行了git add,Git

did
会查看你未提交的工作并准备将其提交。 随后的git checkout可能破坏了准备工作,但准备工作
可能
留下了允许恢复部分或全部这些文件的痕迹。


1
投票
git commit

,就不会记录任何内容。

    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.