Была книга, которая рекомендовалась..., заголовок был чем-то как Конкретная Математика. Это рекомендовалось в нескольких вопросах.
Вероятно, не самое быстрое из возможных решений, но оно делает то, что мне нужно:
#!/bin/bash REV=$1 if [[ -z "$REV" ]]; then echo "Usage: git-get-child []" exit fi HASH=$(git rev-parse $REV) NUM=$2 if [[ -z "$NUM" ]]; then NUM=1 fi git rev-list --all --parents | grep " $HASH" | sed -n "${NUM}s/\([^ ]*\) .*$/\\1/p"
git rev-list - -all --parents
делает именно то, что мне нужно: он выполняет итерацию по всем доступным коммитам и выводит для каждой следующую строку:
SHA1_commit SHA1_parent1 SHA1_parent2
и т. д.
Пробел в выражении grep обеспечивает что найдены только те строки, в которых рассматриваемый SHA1 является родительским. Затем мы получаем n-ю строку для n-го потомка и получаем SHA1 дочернего элемента.
#!/bin/bash REV=$1 if [[ -z "$REV" ]]; then echo "Usage: git-get-child []" exit fi HASH=$(git rev-parse $REV) NUM=$2 if [[ -z "$NUM" ]]; then NUM=1 fi git rev-list --all --parents | grep " $HASH" | sed -n "${NUM}s/\([^ ]*\) .*$/\\1/p"
git rev-list --all --parents
делает именно то, что мне нужно: он перебирает все достижимые коммиты и выводит для каждой следующую строку:
SHA1_commit SHA1_parent1 SHA1_parent2
и т.д.
Пробел в выражении grep гарантирует, что будут найдены только те строки, в которых рассматриваемый SHA1 является родительским. Затем мы получаем n-ю строку для n-го потомка и получаем SHA1 потомка.
#!/bin/bash REV=$1 if [[ -z "$REV" ]]; then echo "Usage: git-get-child []" exit fi HASH=$(git rev-parse $REV) NUM=$2 if [[ -z "$NUM" ]]; then NUM=1 fi git rev-list --all --parents | grep " $HASH" | sed -n "${NUM}s/\([^ ]*\) .*$/\\1/p"
git rev-list --all --parents
делает именно то, что мне нужно: он перебирает все достижимые коммиты и выводит для каждой следующую строку:
SHA1_commit SHA1_parent1 SHA1_parent2
и т.д.
Пробел в выражении grep гарантирует, что будут найдены только те строки, в которых рассматриваемый SHA1 является родительским. Затем мы получаем n-ю строку для n-го потомка и получаем SHA1 потомка.
Дать хороший ответ строго невозможно - поскольку git распространяется, большинство дочерних элементов коммита, о котором вы спрашиваете, могут находиться в репозиториях, которых у вас нет на вашем локальном компьютере. машина! Это, конечно, глупый ответ, но есть над чем подумать. Git редко реализует операции, которые он не может правильно реализовать.
Вы можете использовать gitk
... поскольку может быть более одного ребенка, вероятно, нет такого простого способа, как HEAD ^
.
Если вы хотите отменить всю операцию, вы также можете использовать журнал ссылок. Используйте git reflog
, чтобы найти указатель вашего коммита, который вы можете использовать для команды reset
. См. здесь .
Это зависит от того, о чем вы спрашиваете. Может существовать бесконечное количество дочерних элементов текущей главы в бесконечном количестве ветвей, некоторые из них локальные, некоторые удаленные и многие, которые были перемещены и находятся в вашем репозитории, но не являются частью истории, которую вы собираетесь опубликовать.
В простом случае, если вы только что сбросили HEAD ^
, вы можете вернуть ребенка, которого только что выбросили, как HEAD @ {1}
.