快捷方式 git 分支切换

3

我有一个包含多个分支的代码库,例如b1-long-nameb2-long-nameb3-too-long-name

我希望能够快速地在这些分支之间切换,并且在切换分支之前运行其他git命令。

我尝试使用bash脚本来解决这个问题,这是我的自定义脚本gitSwitch.sh

#!/bin/sh

set -e

git reset #<-- additional command
git checkout -f b2-long-name

但问题在于我需要为每个分支创建一个脚本,这并不是我真正想要的,我想知道如何为脚本传递参数,以便它将使用正确的分支名称?

gitSwitch b1 -> 将切换到 b1-long-name 分支
gitSwitch b2 -> 将切换到 b2-long-name 分支
以此类推

有什么最佳方法来解决这个问题吗?


2
只需将checkout命令更改为:git checkout -f“$1-long-name” - anubhava
1
你有没有考虑使用更短的分支名称?在你的代码库中,你称呼什么就是什么,任何本地分支都可以跟踪任何上游分支。 - jthill
@anubhava 是的,但是在这种情况下我必须要输入完整的分支名称。 - Sergino
很遗憾,在那种特殊情况下,他们应该选择多头。 - Sergino
3个回答

3

有什么最佳解决方法吗?

首先,安装一个git完成脚本,这样你就可以输入 git checkout b1<tab>而不是完整的长名称。您还可以为经常使用的命令创建一些较短的别名。


1
完成脚本可能是这里的最佳选择。然而,我从未对它们感到满意,因为它们做出了我不同意的假设。幸运的是,新的 git restore 可能会有所帮助,因为 git restore 的补全器不会在我指的是“文件名”时假定“分支” :-) - torek
感谢您的回答,我还想编写一个额外的命令脚本,在每次git checkout之前执行,该命令实际上要比git reset长得多。 - Sergino

1
你可以使用 git branch --list pattern 并将其存储到一个数组中。
在你的情况下:
readarray -d '' branches < <(git branch --list "*$1*")
len=${#branches[@]}

如果数组只包含一个元素,那么你传递给脚本的内容足够具体,可以仅定位到一个分支并切换到该分支。
如果只有以 b1 开头的一个分支,你可以将 b1 用作参数。
显然,使用 git checkout -f "$1-long-name" 是行不通的,因为后缀 "long-name" 在不同的分支之间是变化的。

好的,我明白了,那么你是如何调用那个脚本的? - Sergino
1
例如:@sreginogemoh gitSwitch b1,你可以将任何分支名称的一部分作为参数传递,足够具体以仅选择一个分支(如果找到多个分支,则脚本应该失败并报错)。 - VonC

0
您可以创建一个Git别名,该别名将执行其他命令。
# .git/config
[alias]
    sw = !git reset && git checkout $1 && :

为了避免输入长名称,您可以使用Tab键自动完成
git sw b1<tab>

如果选项卡自动完成无法正常工作,您可能需要先进行配置。请参阅以下内容:

如何配置git bash命令行自动完成?


“&& :”是用于抑制错误的吗?首先,为什么要抑制错误?其次,应该是“|| :”。 - phd
@phd 如果没有 && :,它就无法工作。没有它,参数(分支名称)会被解释为路径规范。 - sergej
@phd:错误不会被压制。例如,如果您提供了一个不存在的分支名称,您将看到一个错误消息。 - sergej
似乎在这种情况下,我必须编写完整的分支名称。 - Sergino
尝试输入 b1,然后按 <tab><tab> 键。 - sergej
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接