首页 > 解决方案 > 我不想检查一个特定的分支,即使是偶然

问题描述

我有一个有两个根提交的存储库,旧分支几乎没有使用,但是如果我不小心出于习惯检查它,那么它要么永远运行以检查如果我破坏它然后它会留下一个需要重置的状态之前它是可用的。

如何告诉 git 不要签出分支 A?它在本地不存在,它是从 origin/A 自动创建的。那么,如何在结帐 -b 上停止自动创建?配置

[branch "A"]
  remote = fubar

没有帮助。

标签: git

解决方案


当你运行时:

git checkout foo

并且分支foo不存在但分支origin/foo 确实存在,Git 检查提交的origin/foo指向,然后foo使用origin/fooset 作为上游创建foo,指向相同的提交。这称为DWIM 模式,表示按我的意思行事: Git 假定您输入:

git checkout --track origin/foo

不知何故不小心遗漏了这--track origin/部分。

Git 无法完全禁用此 DWIM 模式。但是总共有三种情况,DWIM 要么触发,要么无法触发。这些是:

  • 分支foo已经存在,指向一些提交。由于您的分支名称是yours,您只需创建一个名为 的分支foo,这样它就foo存在了。选择它应该指向的一些提交,并创建它:

    branch foo a123456
    

    (当然,假设这a123456是一个有效的提交)。现在git checkout foo将切换到 commita123456和 branch foo

  • 分支foo不存在,但也不存在origin/foo。没有origin/foo远程跟踪名称可作为git checkout --track origin/foo. 现在git checkout foo只会失败。

    您的远程跟踪名称是yours,因此您可以简单地 delete origin/foo,但有一个问题。删除很简单:

    git branch -r -d origin/foo
    

    现在它消失了!不幸的是,git fetch只要 Git atorigin有一个名为 的分支,运行就会把它带回来,foo因为你已经告诉了你的 Git——可能是无意的;这是默认设置——每次运行到 remote时,您的 Git 都应该盲目地更新或重新创建所有origin/*名称以匹配的分支名称。这意味着要使删除生效,您必须说服 Git删除分支。origingit fetchoriginoriginfoo

    这可能是可能的,甚至可能很容易。这可能是你应该在这里做的。但是origin的Git不是你的Git,我不能告诉你这是否适合对别人的Git做。你必须自己找到或弄清楚。

  • 最后,如果存在两个或多个可能的 s ,则 DWIM 模式将失败。foo也就是说,git checkout foo成为git checkout --track origin/foo,但它这样做只是因为在列出了所有远程跟踪名称后,唯一相似的名称fooorigin/foo

    您可以拥有多个遥控器。事实上,即使对于一个 Git 存储库,您也可以拥有多个远程。所以你可以添加第二个遥控器:

    git remote add origin2 <url>
    

    <url>您使用的相同 URL在哪里origin,然后运行git fetch​​. 现在您将不仅拥有,而且origin/foo不知道DWIM 是哪一个,所以它不会。origin2/foogit checkout foo

    这里的缺点是这也会导致所有其他DWIMgit checkout操作失败。如果这不打扰你,你可以在这里停下来。如果是这样,您可以修复它:您可以设置origin2单分支跟踪器,方法是更改origin2​​ . 您可以在通过编辑创建额外的遥控器后执行此操作.git/config,或者您可以创建origin2时使用以下命令执行此操作:

    git remote add origin2 <url> -t foo
    

    所以这origin2是一个单分支跟踪器。现在您将只有origin2/foo, not origin2/master, not origin2/develop, 并且没有任何其他这样的名称。


推荐阅读