“与”的区别是什么;git checkout";vs.“;“git还原”;用于还原未提交的文件更改?

“与”的区别是什么;git checkout";vs.“;“git还原”;用于还原未提交的文件更改?,git,Git,假设我有一个git repo,其中有一个名为readme.txt的修改文件,我想撤销我所做的修改,并将其设置回最近提交的状态。似乎有两个命令可以执行此操作: git checkout -- readme.txt 及 这两个命令之间有什么区别吗?我注意到,git status提供了建议“(使用“git restore…”放弃工作目录中的更改)”。这是撤销未提交修改的规范方法吗?这两种方法都同样有效和受欢迎吗?: 或者您可以同时恢复索引和工作树(这与使用git checkout相同) 这是做同样事

假设我有一个git repo,其中有一个名为readme.txt的修改文件,我想撤销我所做的修改,并将其设置回最近提交的状态。似乎有两个命令可以执行此操作:

git checkout -- readme.txt

这两个命令之间有什么区别吗?我注意到,
git status
提供了建议“
(使用“git restore…”放弃工作目录中的更改)
”。这是撤销未提交修改的规范方法吗?这两种方法都同样有效和受欢迎吗?

或者您可以同时恢复索引和工作树(这与使用git checkout相同)

这是做同样事情的便捷方式。(Git 2.23中的第一个版本)

关于Git 2.23的亮点:

Git2.23将一对新的实验性命令添加到现有的命令套件中:
Git-switch
Git-restore
这两个命令旨在最终为众所周知的
git签出
提供更好的接口。新命令打算将每个命令明确分开,整齐地划分
git签出
的许多职责,如下所示

是Git2.23中(去年夏天)引入的一个新命令。它们的目的是简化和分离那些做太多事情的用例

git checkout
可用于切换分支(以及在切换到分支之前创建新分支)。此功能已提取到git switch中

git checkout
还可用于将文件还原到指定提交时的状态。此功能已提取到
git restore

它们仍然可以通过git checkout来执行,但是新的命令更容易使用,也不容易混淆

总之,

git restore readme.txt
是一种新的方式来完成您过去的工作:

git checkout -- readme.txt

我喜欢这两个答案,在我写我的和的时候,但我会这样说:

  • git checkout
    将太多命令合并到一个前端。其中有些命令是“安全的”,因为如果您有未提交的工作,它们不会销毁它,而有些命令是“不安全的”,因为如果您有未提交的工作,并告诉它们销毁我的未提交工作,它们会这样做

  • git开关
    实现“安全”子集

  • git restore
    实现“不安全”子集

到目前为止,没有特别的理由支持旧的单个命令或新的一对命令。但我们还要增加一项:

  • git checkout name
    可能执行不安全的或安全的,这取决于您可能根本没有想到的事情
现在,最新的Git版本修复了最后一点。假设您有一个远程跟踪
origin/dev
名称,并且希望相应地创建分支
dev
。通常,您可以运行:

git checkout dev
但是,假设您当前(可能是
master
)的签出有一个名为
dev
的目录,并且在该目录中,您已经完成了大量工作,但尚未提交。您刚才还记得:我应该提交我刚才在
dev
分支上所做的所有工作,而不是
master
分支

现在,根本不存在
dev
分支,但存在
dev/
文件。老Git的功能如下:

sh-3.2$ git --version
git version 2.20.1
sh-3.2$ git branch -r
  origin/dev
(也就是说,
origin/dev
存在;branch
dev
不存在,我在
master
上)

添加该行需要数周的艰苦工作!:-)

哦。为什么它没有告诉我创建一个名为
dev
的分支来跟踪
origin/dev

sh-3.2$ git status
On branch master
nothing to commit, working tree clean
啊!我辛苦的工作全完了

这里的问题是
git checkout
运行了不安全的命令。我可能希望它能用安全的那个。。。但事实并非如此

一个更现代的Git(2.24.0)会告诉我,
Git checkout dev
是不明确的,这是好的:它不仅仅会破坏我的文件。(我还没有测试Git2.23本身,它首先被拆分为两个命令。)

无论如何,使用新命令,您至少在键入命令时知道,您将获得安全模式还是不安全模式。如果你已经养成了习惯,并且一直在使用git checkout,或者你担心这些新命令仍然是实验性的,那么你仍然可以使用旧的命令,在这种模棱两可的情况下,它不再只是消除工作

sh-3.2$ git status --short
 M dev/file
sh-3.2$ git diff
diff --git a/dev/file b/dev/file
index e69de29..c238a0b 100644
--- a/dev/file
+++ b/dev/file
@@ -0,0 +1 @@
+look at all this work I did
sh-3.2$ git checkout dev
sh-3.2$ git status
On branch master
nothing to commit, working tree clean