有没有一个快捷方式可以获取git分支名称?

29

我倾向于在Git中使用较长的分支名称(例如,step110_create_search_engine_to_replace_google)。

在checkout/commit语句中如何简单地引用它?您可以将其简称为step110。


3
你是否启用了 contrib/complete/git-completion.bash 的 git 自动补全规则?你应该可以输入 git checkout step110<tab> 并让你的 shell 自动完成分支名称。 - simont
嗨,Simont,这似乎是我正在寻找的答案。你能告诉我如何激活git-completion并将其移动到答案中,以便我可以接受它吗?非常感谢。 - AdamNYC
6个回答

35

如果你使用类Unix系统(Linux、Mac OS X等),那么有一个名为contrib/complete/git-completion.bash的bash自动补全配置文件,可以帮助你自动补全git命令(例如,输入git checkout step110<tab>,你的shell会自动完成分支名称)。

要激活它,请执行以下步骤:

  • 如果你已经拥有git源代码,在contrib/complete/目录下有一个名为git-completion.bash的文件。将其放置在某个安全位置(例如~/.git-completion),然后将以下行添加到~/.bashrc文件中:source ~/.git-completion。重新启动shell会话或运行source ~/.git-completion以在当前shell会话中启用它。
  • 如果你没有git源代码,你可以从这里(github.com)获取该脚本。然后按照上述相同的指示操作即可。

如果你正在使用zsh而不是bash,我知道oh-my-zsh有git自动补全插件(我不确定如何在没有oh-my-zsh的情况下启用它们)。

参考文献:


14

以下是我在 OS X 上的安装方式...

首先检查一下你本地是否已经安装了它。看起来 MacPorts 和 Homebrew 都会替你下载它。

$ find / -name "git-completion.bash"
否则,下载它...
$ wget https://raw.github.com/git/git/master/contrib/completion/git-completion.bash -O ~/.git-completion

如果您没有wget,您可以使用Homebrew轻松安装它,或使用cURL

$ vim ~/.profile

...或者你选择的编辑器。

然后添加...

source ~/.git-completion
如果自动完成没有自动工作...
$ source ~/.profile

...然后你就可以使用 Git 自动补全了。


2
我不确定为什么我之前不知道这个,但它真的太好了。Git应该默认支持这个功能。 - jhoff
在OSX上,如果您通过MacPort安装了git,则脚本位于此位置:/opt/local//share/doc/git-core/contrib/completion/git-completion.bash。 - kakyo
看起来brew也会为你把它放在某个地方 :) - alex
@jhoff,Git应该如何开箱即用地完成这个操作?这是一个Bash设置,而且并不是每个人都使用Bash作为shell。 - rethab

4
尝试使用这个别名:
cb = "!checkoutbranch() { local branches=`git branch | grep -i $1 | tr -d '* '`; if [[ `echo \"$branches\" | wc -l | tr -d ' '` != 1 ]]; then echo \"Matched multiple branches:\"; git branch | grep --color -i $1; exit 1; fi; git checkout $branches; }; checkoutbranch"

请检出develop分支:

git cb dev

更好的版本:https://gist.github.com/iwill/88f5835bfc4e58aa1a88

1
非常酷,而且运行得很好!只需将任何分支名称的子字符串传递给它,它就会为您选择。太棒了。这就是我在寻找的 - 选项卡完成对我来说太慢且笨重。 - Koshmaar
好的,我会在几个小时后上班时尝试一下。到目前为止,使用这个别名,我有两个评论:
  1. 我想用 git checkout 替换它(使用典型的别名 g co),不幸的是它不支持提交和文件。你知道,git 允许执行 git co <commit id> 和 git co <filename to revert from index>。
  2. 总的来说,我认为在更多可以传递分支名称的地方拥有这个功能将是很棒的。
- Koshmaar
额,编辑评论的时间限制为5分钟。1. 继续:还有HEAD。因此,在这些特殊情况下,脚本必须将工作传递给典型的检出。手动操作可能不可能,但也许有一些git管道函数,你可以传递字符串,它返回git对象的类型:分支、提交或路径。然后我们就可以拥有这个强大的git co了。 - Koshmaar
抱歉,只有cb - checkout branch,没有xb,我使用co和其他git命令来完成其他功能。 - Míng
好的,说得对。如果我有时间,我会尝试使它更通用。另外需要注意的是:git cb 在刚刚获取的分支名称上不起作用。这是因为 git 不会将它们视为本地分支。在别名中添加 -a 到 git branch 也无济于事,因为在检出时你不会处于分支上,而是单个提交上。我相信有办法以某种方式解决它,但我不知道如何做。 - Koshmaar

2

git symbolic-ref 命令可以帮助你避免按下 TAB 键的麻烦。你可以为分支创建一个别名。

$ # Define short name 's1'
$ git symbolic-ref refs/heads/s1 refs/heads/step110_create_search_engine_to_replace_google
$
$ # You can use short name 's1' afterwards
$ git reset --hard s1
$ git checkout -b s1-experiment s1
$
$ # Remove the short name (don't use branch -d here or the original branch gets deleted!)
$ git symbolic-ref -d refs/heads/s1

为了节省打字时间,可以以同样的方式引用远程分支remote/TAB。(在这种情况下,我建议使用前缀refs/tags/而不是refs/heads/,以防止意外移动远程引用)

$ git symbolic-ref refs/tags/base refs/remotes/github/a-very-long-named-remote-branch
$ git rebase -i base

谢谢分享。我们的分支名称很长,我需要的是“链接”到分支! - prem

1

我只想补充一点,这个文件通常已经随着git一起提供了。你不需要再次下载它,只需要找到它并运行即可。

在我的系统(Centos操作系统)上,以下步骤有效:

$ locate completion.bash
/usr/share/doc/git-1.7.4.1/contrib/completion/git-completion.bash
$ source /usr/share/doc/git-1.7.4.1/contrib/completion/git-completion.bash

显然,正如已经指出的那样,最好将此行添加到您的主目录中的 .bashrc 文件中,这样每次打开新的 shell 时就不需要重复执行它。

在我的情况下,我会将最后一个命令添加到我的 .bashrc 文件中。

source /usr/share/doc/git-1.7.4.1/contrib/completion/git-completion.bash

0

在类Unix系统中,你可以这样做。

git branch | cut -d ' ' -f 2 | tr -d '\n'

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