我喜欢在我写这篇文章时看到的两个答案——axiac的答案和kapsiR的答案,但我会这样表述:
到目前为止,没有特别的理由支持旧的单一命令或新的两个命令。但我们再添加一项:
git checkout 名称
可能会执行不安全的或安全的之一,这取决于你可能甚至没有考虑过的某些东西!
现在,在最新的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
存在;分支
dev
不存在,而我在这里是在主分支
master
上)
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
哎呀,为什么它没有告诉我如何创建一个名为 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
是有歧义的,这很好:它不会简单地覆盖我的文件。(我还没有测试过首次拆分成两个命令的Git 2.23。)
无论如何,使用新的命令,你至少知道,在输入命令时,你将获得安全模式还是不安全的模式。如果你已经养成习惯并继续使用git checkout
,或者你担心这些新命令仍处于实验阶段的提示,你仍然可以使用旧命令——在有歧义的情况下,它不再简单地清除工作内容。