在git中,只有在分支不存在的情况下,我们如何在创建分支时签出它?

在git中,只有在分支不存在的情况下,我们如何在创建分支时签出它?,git,Git,因此,git checkout-B不适合这个账单,因为它会强制当前磁头,即使磁头已经存在并指向其他地方 我想要一种不同的行为。如果分支存在-签出,如果不存在-在当前标头处创建,然后签出 我当前的解决方案(在Powershell中)是: 有较短的路吗 编辑1 我一直在思考我定义问题的方式,这些评论帮助我认识到我需要消除一些歧义。因此: 在git fetch--force--tags--prune origin 如果存在远程跟踪分支,则应签出此分支 应忽略没有相应远程端口的本地分支 如果本地和远程跟

因此,
git checkout-B
不适合这个账单,因为它会强制当前磁头,即使磁头已经存在并指向其他地方

我想要一种不同的行为。如果分支存在-签出,如果不存在-在当前标头处创建,然后签出

我当前的解决方案(在Powershell中)是:

有较短的路吗

编辑1

我一直在思考我定义问题的方式,这些评论帮助我认识到我需要消除一些歧义。因此:

  • git fetch--force--tags--prune origin
  • 如果存在远程跟踪分支,则应签出此分支
  • 应忽略没有相应远程端口的本地分支
  • 如果本地和远程跟踪分支都存在,则必须在远程跟踪处签出本地分支-必须重新对齐

  • 现在我可以看出我的方法是错误的,因为它不符合这些要点。感谢所有在这些方面指出的评论。

    为了避免使用
    git签出
    (或新的
    git开关
    ),请使用DWIM模式从
    $remote/$b
    创建分支
    $b
    (对于任何可能发生这种情况的$b和$remote),使用
    --NoGuess
    标志。这个标志在Git2.21中是新的。(
    git-switch
    本身在git 2.23中是新的,所以如果你有
    git-switch
    ,你就有了
    ——没有猜测

    您仍然需要至少两个命令才能获得所需的内容,但不再需要明确验证
    refs/heads/$b
    是否首先存在

    如果您的Git早于2.21,请执行显式验证:

    git rev-parse --quiet --verify refs/heads/$branchname
    
    如果失败(退出代码1),
    $branchname
    不是现有的分支名称。如果成功(退出代码0),
    $branchname
    是现有的分支名称。从那里开始

    请注意,您的PowerShell片段表明您需要与文本中描述的行为不同的行为。您不关心是否存在某个本地分支,而是关心是否存在某个特定的远程跟踪名称。也可以使用
    git rev parse
    方法;只需将
    refs/heads/$b
    替换为
    refs/remotes/$o/$b
    ,其中
    $o
    $b
    设置适当


    重新编辑:

    在git fetch--force--tags--prune origin之后检查存储库

    嗯。请注意,这将使用现有的
    remote.origin.fetch
    refspecs(这可能很好)

    如果存在远程跟踪分支,则应签出此分支

    这是针对某个固定的分支名称,还是一组分支名称?(不确定如何在PowerShell中编写循环;对于name1 name2 name3中的分支,它将是
    ;在sh/bash中是do…;done
    )或者,是否要枚举所有远程跟踪名称和/或所有本地分支名称?(
    git for each ref
    是通用的git名称枚举工具。)

    应忽略没有相应远程端口的本地分支

    如果您正在枚举
    refs/remotes/origin/
    (所有
    origin/*
    远程跟踪名称)中的所有名称,则会发生“免费”情况;如果要枚举一组固定名称,或者枚举本地分支名称,当然需要进行某种测试

    请注意,在Git存储库中(尽管在CI系统存储库中更为罕见),具有(本地)分支名称和一些上游集合是一种传统。要查找某些本地分支的上游,请将
    git rev parse
    {upstream}
    {u}
    后缀一起使用:
    git rev parse dev{u}
    将测试
    dev
    是否有上游集,如果没有,则会出错。如果它确实有一个上游集合,revparse将继续像往常一样处理它,根据标志将上游名称转换为哈希ID或符号名称

    这种(拥有一个单一上游)的一般想法在三角工作流中不起作用,在三角工作流中,我们喜欢从存储库R获取新提交,但将新提交提交到不同的存储库S。如果它不适合你自己的任务,不要使用它

    如果本地和远程跟踪分支都存在,则必须在远程跟踪处签出本地分支-必须重新对齐

    这就是
    -B
    操作

    因此,假设一组固定的名称,它的sh/bash变体将是:

    fatal(){
    …在此处插入代码以打印错误消息并中止。。。
    }
    对于$list\u中的名称,请选择\u名称;做
    #确定origin/$name是否存在。如果
    #不,跳过这个名字。当我们在做的时候,保存
    #哈希ID,因为我们马上就需要它。
    hash=$(git rev parse--quiet--verify refs/remotes/origin/$name)|继续
    #远程跟踪名称已存在。作为一个本地人呢
    #分行名称?如果不是,则对$hash执行分离签出,但是
    #如果是这样,请强制将本地名称重置为$hash。
    如果git rev parse--quiet--verify refs/heads/$name>/dev/null;然后
    #强制重置:
    git开关-B$name$hash||
    致命“无法将$name本地重置为$hash”
    其他的
    #分离式头部检查:
    git开关--分离$hash||
    致命“无法将头分离到$hash”
    fi
    ... 对签出的文件执行一些操作。。。
    完成
    
    整个过程似乎有点可疑:如果我们需要对由特定名称决定的特定提交执行某些操作,我们可以对每个这样的名称执行分离头签出,只要我们不需要进行新的提交。而且,如果我们确实需要进行新的提交,我们可能永远不会想要任何分离的头签出,除非我们要尝试构建(
    git rev-parse --quiet --verify refs/heads/$branchname