git签出-B不重置或替代?

git签出-B不重置或替代?,git,git-branch,git-checkout,Git,Git Branch,Git Checkout,我想使用一个命令来执行以下操作: 如果不存在新分支,请创建新分支 签出分支(如果存在),但未对其进行任何修改 当前使用的git checkout-B branchname违反了第二个要求,因为如果存在分支,它会将分支重置为起始点的HEAD。您知道签出/workarounds/其他可以满足这两个要求的命令的标志吗?没有一个Git命令可以做到这一点 我建议使用的命令序列是: git checkout <name> 当您没有名为feat/ure的分支时。在这种情况下,Git将枚举所有远程

我想使用一个命令来执行以下操作:

  • 如果不存在新分支,请创建新分支
  • 签出分支(如果存在),但未对其进行任何修改

  • 当前使用的
    git checkout-B branchname
    违反了第二个要求,因为如果存在分支,它会将分支重置为起始点的
    HEAD
    。您知道
    签出
    /workarounds/其他可以满足这两个要求的命令的标志吗?

    没有一个Git命令可以做到这一点

    我建议使用的命令序列是:

    git checkout <name>
    
    当您没有名为
    feat/ure
    的分支时。在这种情况下,Git将枚举所有远程跟踪名称,例如
    源站/master
    上游站/master
    ,等等。如果在剥离远程部分后正好有一个匹配
    feat/ure
    ,Git会假定您打算编写:

    git checkout --track origin/feat/ure
    
    (或者不管名字是什么,遥控器还在里面)。因此,这将创建
    feat/ure
    ,指向与
    origin/feat/ure
    相同的提交,并将
    origin/feat/ure
    作为新分支
    feat/ure
    的上游设置

    如果没有
    feat/ure
    存在,或者没有或太多(两个或更多)远程跟踪
    feat/ure
    样式名称,例如
    origin/feat/ure
    upstream/feat/ure
    都存在,那么
    git签出将失败,现在您必须使用
    -b
    和/或
    -track
    中的一个或多个

    另一种选择 如果您不喜欢这些备选方案,可以测试分支名称是否存在。为此,要求
    git rev parse
    翻译名称,并在名称前面插入
    refs/heads/

    git rev-parse --quiet --verify refs/heads/feat/ure
    
    如果此操作成功,它将打印出
    refs/heads/feat/ure
    解析的哈希ID,并以零状态退出。打印的散列ID是
    feat/ure
    分支的尖端,因此存在。如果失败,它将不打印任何内容(
    --quiet--verify
    )并以非零状态退出,因此
    feat/ure
    不存在。您现在可以安全地请求创建
    feat/ure
    ——也就是说,在您查看退出状态并确定
    feat/ure
    不存在(但现在确实存在)时,没有其他人偷偷进入您的存储库并创建
    feat/ure

    在shell脚本中,这将变成:

    name=feat/ure
    git rev-parse --quiet --verify refs/heads/$name >/dev/null && exists=true || exists=false
    if $exists; then git checkout $name; else git checkout -b $name ...additional arguments; fi
    

    当然,您可以将此脚本转换为shell别名或实际的shell脚本,可以随意调用它。为taste添加足够的参数解析和错误处理。

    您可能可以使用作为Git别名执行的shell管道(或者更好的是shell函数)进行排序。似乎是唯一的选项
    git checkout branchname
    ,如果失败,
    git checkout-b branchname
    ,正如torek在回答中所建议的那样。的确如此<代码>git签出branchname--2>/dev/null | | git签出-b branchname
    git checkout --track origin/feat/ure
    
    git rev-parse --quiet --verify refs/heads/feat/ure
    
    name=feat/ure
    git rev-parse --quiet --verify refs/heads/$name >/dev/null && exists=true || exists=false
    if $exists; then git checkout $name; else git checkout -b $name ...additional arguments; fi