После тщательного исследования выясняется, что завершение git checkout
в ZSH выполняется не oh-my-zsh , а функцией _git
, предоставляемой средствами оболочки.
Как указано в комментариях, я не смог воспроизвести проблему, с которой вы столкнулись. Кажется, все работает как ожидалось. Тем не менее ...
Проверьте следующий файл:
/usr/share/zsh/<5.x>/functions/_git
Моя локальная zsh версия 5.2 . Вокруг строки 450 вы можете увидеть:
case $state in
(branch-or-tree-ish-or-file)
# TODO: Something about *:: brings us here when we complete at "-". I
# guess that this makes sense in a way, as we might want to treat it as
# an argument, but I can't find anything in the documentation about this
# behavior.
[[ $line[CURRENT] = -* ]] && return
if (( CURRENT == 1 )) && [[ -z $opt_args[(I)--] ]]; then
# TODO: Allow A...B
local branch_arg='' \
remote_branch_noprefix_arg='remote branches::__git_remote_branch_names_noprefix' \
tree_ish_arg='tree-ishs::__git_tree_ishs' \
file_arg='modified-files::__git_modified_files'
if [[ -n ${opt_args[(I)-b|-B|--orphan|--detach]} ]]; then
remote_branch_noprefix_arg=
file_arg=
elif [[ -n $opt_args[(I)--track] ]]; then
branch_arg='remote-branches::__git_remote_branch_names'
remote_branch_noprefix_arg=
tree_ish_arg=
file_arg=
elif [[ -n ${opt_args[(I)--ours|--theirs|-m|--conflict|--patch]} ]]; then
remote_branch_noprefix_arg=
fi
_alternative \
$branch_arg \
$remote_branch_noprefix_arg \
$tree_ish_arg \
$file_arg && ret=0
Удаление одного из массивов, переданных в _alternative
, меняет то, что вам предлагается при заполнении имени ветви после git checkout
. В частности, удаление $remote_branch_noprefix_arg
возвращает имена удаленных веток с префиксом origin
или их соответствующие имена удаленных репозиториев.
Поэтому хорошей идеей может быть обновление вашей оболочки или переход на более раннюю версию.
Некоторые детали еще:
- Я видел, что вы редактировали исходное сообщение, и у
git push
есть веские причины работать немного иначе, чем git checkout
;
- Локальная ветвь гомолога удаленной может не существовать принудительно:
feature
отличается от origin/feature
, даже если первая, если она существует, обычно настроена на отслеживание последней;
- По умолчанию, если локальная ветвь еще не существует и когда не переданы никакие явные опции, проверка
feature
создаст локальную ветку eponym, сконфигурированную для отслеживания удаленной, затем переключитесь на нее, одновременно проверяя origin/feature
переведет вас в автономный режим, позволяя просматривать эту удаленную ветку, но непосредственно фиксировать поверх нее.