git restore --staged some-file 和 git checkout -- some-file 有什么不同?

3
我正在探索使用git撤销操作的可能选项。我看到了这个post,发现有三个选项git resetgit checkoutgit restore
我认为我有点理解git reset的作用(不完全,但我认为这是一个单独的问题),但是我不明白运行git checkout -- some_filegit restore --staged some_file之间有什么区别。
这两个命令在如何更改工作目录中的文件方面是否有差异?

1
这个回答是否解决了您的问题?`git restore` 命令是什么,与 `git reset` 有什么区别? - matt
这是一个非常有用的链接,我将会更深入地了解它,但它并没有真正解释git checkout与那些命令的区别。 - djvaroli
1
@djvaroli:它确实(解释了区别),特别是如果你阅读我的答案。虽然有点长,但我认为它值得一读。 - torek
1个回答

5

总结Torek的答案:

Torek坚持认为git restore --source <aCommit> --worktree -- somefile是新功能(无法使用checkout): 在不触及索引的情况下还原工作树中的文件。


Darren Ng评论中补充道:

现在我可以使用single git restore --staged --worktree -- FILE一步完成放弃暂存更改,而不是之前的两步操作git restore --staged FILE+git checkout FILE

没错,但是Git 2.41(2023年第二季度)明确表示,在同时使用--staged --worktree选项时,并非所有选项都受支持。

虽然 "git restore"(man)支持像--ours这样的选项,但这些选项只在冲突合并期间有意义,而且这些选项仅在更新工作树文件时有意义。
当同时使用 "--staged" 和 "--worktree" 时,这些选项被标记为不兼容。

请查看 ee8a888 提交记录(2023年2月26日),作者为 Andy Koppe (akoppe)
(由 Junio C Hamano -- gitster --67076b8 提交记录 中合并,日期为2023年3月19日)

restore:使用合并选项的 --staged --worktree 故障

签署者:Andy Koppe

“restore”命令在结合“--staged”选项时已经拒绝了“--merge”、“--conflict”、“--ours”和“--theirs”选项,但是在添加“--worktree”选项时接受它们。不幸的是,这似乎没有任何有用的作用。当给出“--staged”和“--worktree”时,“--ours”和“--theirs”选项似乎被忽略了,而使用“--merge”或“--conflict”选项时,该命令的效果与如果不存在“--staged”选项相同。因此,也要拒绝那些带有“--staged --worktree”的选项,并使用opts->accept_ref来区分restore和checkout。添加对“--staged”和“--staged --worktree”的测试。

1
之前不知道 --worktree 这个选项。现在只需要一步操作 git restore --staged --worktree FILE 就可以放弃暂存区的修改,而不用像之前那样分两步操作 git restore --staged FILEgit checkout FILE。这个选项真是太棒了! - Darren Ng
2
@DarrenNg 没错。git checkout 命令现在应该不再需要使用了。简短版本:git restore -SW -- aFile - VonC
1
万岁短版! - Darren Ng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接