Чтобы просто переместить HEAD (как и просили - это не обновляет индекс или рабочее дерево), используйте:
git reset --soft $(git child)
Вам потребуется использовать конфигурацию, указанную ниже.
Объяснение
Основываясь на ответе @ Майкла , я взломал псевдоним child
в своем .gitconfig
.
Он работает как положено в случае по умолчанию, а также универсален.
# Get the child commit of the current commit.
# Use $1 instead of 'HEAD' if given. Use $2 instead of curent branch if given.
child = "!bash -c 'git log --format=%H --reverse --ancestry-path ${1:-HEAD}..${2:\"$(git rev-parse --abbrev-ref HEAD)\"} | head -1' -"
По умолчанию он задает дочерний элемент HEAD (если не указан другой аргумент commit-ish), следуя шагу предка до кончика текущей ветви (если в качестве второго аргумента не указан другой commit-ish).
Используйте %h
вместо %H
, если вам нужна короткая форма хеша.
С отсоединенной головой ветвь отсутствует, но получить первого ребенка все еще можно с помощью этого псевдонима:
# For the current (or specified) commit-ish, get the all children, print the first child
children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $1' -"
Измените $1
на $*
, чтобы напечатать все дочерние элементы