Ответ 1
Используйте git merge-base --is-ancestor <commit1> <commit2>
Существует несколько способов найти ответ на этот вопрос. Самое простое - использовать
git merge-base --is-ancestor <commit> <commit>
Из документации для git merge-base
:
--is-ancestor
Проверьте, является ли первый
<commit>
предком второго<commit>
, и выйдите со статусом 0, если true, или со статусом 1, если нет. Ошибки сигнализируются ненулевым статусом, который не равен 1.
Другие опции
git журнал с тройной точкой ...
обозначение
Другой вариант - использовать git log
и использовать трехточечную нотацию ...
, чтобы сообщить Git, чтобы выводить объединение объединения ребенка, за вычетом установленного пересечения. В основном, это говорит вам, как набор коммитов расходится друг с другом:
$ git log --oneline --graph --left-right \
--first-parent --decorate <commit1>...<commit2>
Вышеупомянутая команда покажет вам коммиты, достижимые из commit1
или commit2
, но не оба, то есть C1 UNION C2 - C1 INTERSECTION C2, в терминах заданных операций.
Если ни одно из них не является родителем другого, вы увидите, что ребенок совершает оба действия, но если один из них является предком другого, вы увидите только вывод для фиксации потомков, поскольку содержится предок на пути потомка и, таким образом, исключается из вывода.
Вы можете узнать больше о git log
и трехзначной нотации из следующих ресурсов:
git branch --contains option
git -rev-list (1) кажется, что он может быть использован для ответа на этот вопрос. Другой способ - просто привязать метки временных ярлыков к коммиттам, которые вы хотите протестировать, а затем использовать параметр --contains
для git branch
:
git branch --contains <commit-to-test>
На выходе будут все ветки, которые содержат коммит где-то в своем дереве фиксации, поэтому, используя временную ветвь на другой фиксации, вы можете увидеть, является ли коммит, который вы тестируете, предком.
Из документации:
--contains [<commit>]
Только ветки списка, которые содержат указанный commit (HEAD, если не указано).