Git 2.23引入了一个新的命令Git开关——在阅读了文档之后,它看起来和Git checkout <branchname>几乎一样,有人能解释一下区别或用例吗?

引入了两个新命令“git switch”和“git restore” 分裂“检出分支以推进其历史”和 “检查出索引的路径和/或一个树状的工作 从单个“git签出”中推进当前历史记录 命令。


当前回答

Git签出有点像瑞士军刀,它有几个不相关的用途。

如果你修改了一个文件,但还没有执行修改,那么git checkout <filename>将撤销修改…一种快速而简单的方法取消对文件的更改。你仍然在同一个分支。

Git checkout <branchname>(如您所注意到的)切换分支。

两个完全不同的目的,如果文件名和分支名称相似,可能会导致混淆。

把它作为两个命令就更清楚了。

其他回答

Git签出有点像瑞士军刀,它有几个不相关的用途。

如果你修改了一个文件,但还没有执行修改,那么git checkout <filename>将撤销修改…一种快速而简单的方法取消对文件的更改。你仍然在同一个分支。

Git checkout <branchname>(如您所注意到的)切换分支。

两个完全不同的目的,如果文件名和分支名称相似,可能会导致混淆。

把它作为两个命令就更清楚了。

以下是git手册 - man git-switch的摘录。

Synopsis git switch [<options>] [--no-guess] <branch> git switch [<options>] --detach [<start-point>] git switch [<options>] (-c|-C) <new-branch> [<start-point>] git switch [<options>] --orphan <new-branch> Description Switch to a specified branch. The working tree and the index are updated to match the branch. All new commits will be added to the tip of this branch. Optionally a new branch could be created with either -c, -C, automatically from a remote branch of same name (see --guess), or detach the working tree from any branch with --detach, along with switching. Switching branches does not require a clean index and working tree (i.e. no differences compared to HEAD). The operation is aborted however if the operation leads to loss of local changes, unless told otherwise with --discard-changes or --merge. THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.

tl;dr:当使用checkout with——force时,你可以在合并过程中切换分支。你不能用switch。

细节:

其他答案已经涵盖了将签出分为切换和恢复的动机,以及存在语法使用差异的事实。(例如,你可以在提交或远程跟踪分支(如origin/main)中直接使用签出,但在switch中,你还必须显式指定——detach选项。)然而,我也发现了至少一个显著的功能差异。

Git开关-f的文档如下:

即使索引或工作树与HEAD不同,也要继续。索引和工作树都被恢复以匹配交换目标。如果指定了——recursive -submodules,子模块内容也会恢复到与切换目标匹配。这用于丢弃局部更改。

类似地,git checkout -f是这样记录的(强调最后一句):

在切换分支时,即使索引或工作树与HEAD不同,即使存在未跟踪的文件,也要继续执行。这用于丢弃本地更改和任何碍事的未跟踪文件或目录。 当从索引中检出路径时,不要在未合并的条目上失败;相反,未合并的条目将被忽略。

最后一句似乎适用于签出的另一种含义,即还原命令的等效。然而,当你试图在合并过程中切换分支时,git checkout -f将会成功,即使你当时有未解决的冲突。如果你正在合并(即使没有冲突),Git开关-f根本不起作用,因为你会得到这样的错误消息:

致命:合并时不能切换分支

注意:这个差异是使用Git 2.37.1版本测试的

好吧,根据你链接到的文档,它的唯一目的是拆分和澄清git签出的两种不同用法:

Git开关现在可以用来改变分支,就像Git checkout <branchname>那样 Git恢复可以用于将文件重置为某些修订,如Git checkout——<path_to_file>所做的那样

人们对使用git checkout的不同方式感到困惑,正如你可以从Stackoverflow上关于git checkout的许多问题中看到的那样。Git开发人员似乎已经考虑到了这一点。

Git switch ~= Git checkout -b[分支]。 git checkout [branch]将给你一个分离的HEAD