2012-03-08 3 views
3

Мне было интересно, существует ли обобщенный метод определения, является ли фиксация родителем другому.Git содержит между произвольными коммитами

git branch --contains <hash> 

Это почти то, что я хочу. В нем перечислены все ветви, содержащие коммит, но я хочу знать, может ли произвольная фиксация «содержать» другую фиксацию.

Мой временный взлом - это создать ветку в фиксации, а затем проверить, содержится ли она в списке, но это кажется неаккуратным.

git branch __temp_branch__ <hash1> 
git branch --contains <hash2> # check if __temp_branch__ is in output 
git branch -d __temp_branch__ 

ответ

2

Если commitA является предком commitB, то git merge-base commitA commitB является commitA. Например:

if [ "$(git merge-base $commitA $commitB)" = "$commitA" ]; then ... 

Это значительно эффективнее, чем выход оглавлению из git rev-list, следует, что независимо от того, к вам.

+0

Я собираюсь принять этот ответ, поскольку он немного быстрее, чем другие ответы, а также гарантирует, что оба хэша действительны. –

2

git rev-list <childSHA> | grep <parentSHA>

Это вернет <parentSHA>, если он был родителем <childSHA>

+0

Отлично работает, спасибо :) –

0

Одним из возможных вариантов может быть, это:

git log --ancestry-path <parentSHA> <childSHA> 

Если ничего не возвращает, вы знаете parentSHA не родитель.