虽然 pygit2 可能会带来额外的麻烦,但请从以下事实开始:当您克隆存储库时,您首先会获得所有其他 Git 的提交,而不是它的任何分支。 然后,就在命令行git clone
命令向您返回提示之前,它会根据您提供的参数为您创建一个分支。-b
如果您没有提供-b
参数,它(您自己的 Git)会询问另一个Git他们推荐的分支名称,并根据该名称创建一个分支。
结果是,如果他们在他们的Git 中有分支branch1
、branch2
、branch3
、main
和xyzzy
,并且您指定-b main
或不指定任何内容并且他们推荐他们的main
,那么您的 Git 现在在您的存储库中只有一个分支 - 您的存储库的克隆 -这就是名为. 您的 Git 将其创建为您的; 这不是他们的。他们的分支名称是他们的。main
main
main
如果您想要将分支命名为fred
, barney
, betty
, 而wilma
不是它们的名称,您可以这样做。为了防止您git clone
创建任何分支,您可以在命令中添加-n
选项git clone
:现在您获得了他们的所有提交,并且根本没有分支,现在您可以选择一个与他们的任何名称都不匹配的名称。
但是:他们的分支名称会发生什么变化?答案是:你的 Git 使用它们的分支名称,例如branch1
andbranch2
等等main
,并将它们更改为远程跟踪名称。您的 Git 在此处使用的远程跟踪名称是origin/branch1
、origin/branch2
、origin/main
等。
这些远程跟踪名称与它们的分支名称相匹配,并带有明显的替换。但它们不是分支名称。它们是远程跟踪名称。有什么不同?你看到的就是那个超然的 HEAD 。使用远程跟踪名称意味着我不打算进行任何新的提交。使用分支名称意味着我确实打算进行新的提交。如果您打算进行新的提交,您应该使用分支名称,而不是远程跟踪名称。
一般来说,这可能意味着您必须要求您的 Git在您自己的本地存储库中创建一个新的分支名称。你是怎样做的?好吧,在复杂的设置中这一切都变得有点复杂,但我们从这个开始:检查分支名称X的请求,对于任何X ,如果没有名为X的分支,则无法继续......所以如果你的 Git 有还没有X ,你的 Git 首先检查你是否有,如果有,你的 Git 会从你的. origin/X
origin/X
Git 将此称为“DWIM 模式”,意思是“按我的意思行事(不是我所说的)”。该git checkout
命令有一个新标志--no-guess
, 来禁用这种猜测你的意思。使用:
git checkout --no-guess branch1
origin/branch1
在抱怨没有branch1
退房之前不会看你是否有一个。默认是先检查:没有branch1
? 检查origin/branch1
,如果是,使用创建 ,同样的方式从你的创建你的,你从他们的 Git 获得的。branch1
origin/branch1
git clone
main
origin/main
main
这有点迂回,但大多数时候它对大多数用户来说效果很好。只要他们不跑git checkout origin/branch1
,就是这样。