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