git - получить прямых потомков A, которые подключаются к B - PullRequest
0 голосов
/ 22 сентября 2018

Можно ли получить список ревизий, которые направляют потомков A, которые являются прямыми предками B?Я попробую git log A..B Я получу список ревизий, которые являются предками B, которых нет в истории A, что не совсем то, что я хочу.Мне нужны только ревизии, которые напрямую соединяют А и В.

1 Ответ

0 голосов
/ 22 сентября 2018

Да: добавьте --ancestry-path к вашей спецификации редакции.(Это работает для любой команды, которая использует commit-graph-walking, включая git log и git rev-list.) Но я отмечу, что я не уверен, что вы подразумеваете под прилагательным «прямой» здесь.

Обратите внимание, что A..B означает B ^A, т. Е. Используйте набор ancestors(B) - ancestors(A) (где вычитание здесь - это вычитание набора).Добавление --ancestry-path означает, что после выполнения вычитания набора (или, точнее, при построении вычитаемого набора), Git также вычитает любой коммит, который не является потомком отмененной ревизии A.

Внутренне,Git делает это, помечая идентификаторы хеша с фиксированной фиксацией (например, A в A..B или B ^A) с флагом BOTTOM.Такие коммиты собираются в «нижний список», и Git гарантирует, что каждый коммит C , который может находиться в диапазоне A..B, имеет нижний коммит в качестве одного из своих предков.Это имеет значение, если вы используете git rev-list --ancestry-path X ^Y ^Z, например: коммиты могут быть потомками Y или Z. \


Вот пример фрагмента графика, показывающий, какие коммиты выбраны() или невыбранный (), даже если они «в диапазоне» A..B:

...--A--●---●--B--...
   \  \    /
    ○--●--●

Обратите внимание, что commit A не выбран, и commit *Здесь выбрано 1034 *.

...