Що стосується Git, як я можу зрозуміти, чи є один вчинок у моїй гілці нащадком іншого?
--is-ancestorрішення.
Що стосується Git, як я можу зрозуміти, чи є один вчинок у моїй гілці нащадком іншого?
--is-ancestorрішення.
Відповіді:
Якщо ви хочете перевірити це програмно (наприклад, у скрипті), ви можете перевірити, чи git merge-base A Bдорівнює він git rev-parse --verify A(тоді A досягається з B), чи він є git rev-parse --verify B(тоді B є доступний від A). git rev-parseтут потрібно, щоб перетворити з імені комісії на фіксацію SHA-1 / ID ідентифікатора.
Використовувати, git rev-listяк у відповіді VonC , також є можливість.
Редагувати: в сучасному Git існує чітка підтримка цього запиту у вигляді git merge-base --is-ancestor.
Якщо один з коммітов ви питаєте це гілка наконечник , то git branch --contains <commit>чи git branch --merged <commit>може бути краще непрограммной рішенням.
git checkout -b quickcheck <more-recent-commit-ID>і тоді git branch --contains <older-commit-ID>(а потім git branch -D quickcheckпозбутися тимчасової гілки).
git merge-base --is-ancestorдо 2 років.
git branch --contains <commit>і git merge-base --is-ancestor ...: 3m40s проти 0,14s
З Git 1.8.0 це підтримується як варіант merge-base:
git merge-base --is-ancestor <maybe-ancestor-commit> <descendant-commit>
Із чоловічої сторінки:
--є-предком
Перевірте, чи перший є предком другого, і вийдіть зі статусом 0, якщо це правда, або зі статусом 1, якщо ні. Про помилки сигналізує ненульовий стан, який не дорівнює 1.
Наприклад:
git merge-base --is-ancestor origin/master master; echo $?
git merge-base THING --is-ancestor OF_THING && echo yes || echo noнапр .:git merge-base my-feature-branch --is-ancestor master && echo yes || echo no
git merge-base --is-ancestor -- commit commitпрацює з хешами на моїй стороні з git2.1.4 (Debian / Devuan 7.10 jessie) та 1.9.1 (Ubuntu 14.04 надійний), які зараз досить давні. Це працює навіть для хрипів Debian, якщо ви це робите sudo apt-get install git/wheezy-backports.
Цей вид операцій спирається на поняття про діапазон доопрацювань, детально описаний у запитанні SO: " Різниця в 'git log origin / master' vs 'git log origin / master ..' ".
git rev-list повинні бути в змозі піти назад від комітету, аж до іншого, якщо це можливо.
Тому я б спробував:
git rev-list --boundary 85e54e2408..0815fcf18a
0815fcf18a19441c1c26fc3495c4047cf59a06b9
8a1658147a460a0230fb1990f0bc61130ab624b2
-85e54e240836e6efb46978e4a1780f0b45516b20
(Межі коміксів мають префікс -)
Якщо відображається остання фіксація збігається з першою git rev-listкомандою в команді, то вона є доступною для другого коміту.
Якщо перша фіксація недосяжна з другою, git rev-listнічого не повертайте.
git rev-list --boundary A..B
закінчив би A, якщо Aце буде доступний з B.
Це те саме, що:
git rev-list --boundary B --not A
з Bбільш позитивної посиланням , і Aв негативному значенні завдання .
Він починається з Bта повертається назад по графіку, поки не стикається з переглядом, до якого можна дістатися A.
Я б заперечував, що якщо Aвін безпосередньо доступний B, він зіткнеться (і відобразиться через --boundaryопцію) Aсам.
-85e54e2...в фрагменті є мінус? також можливий помилковий
-означає, що це кордон. Я відредагував відповідь, щоб зробити це зрозумілішим, а також оновити посилання на doc та виправити помилку на друк цієї п'ятирічної відповіді.
Іншим способом було б використання git logі grep.
git log --pretty=format:%H abc123 | grep def456
Це дасть один рядок виводу, якщо команда def456 є родоначальником чини abc123, або немає іншого виводу.
Зазвичай ви можете уникнути пропускання --prettyаргументу, але це потрібно, якщо ви хочете переконатися, що ви шукаєте лише фактичні хеші фіксації, а не через коментарі журналу тощо.
--prettyя використовую --oneline: git log --oneline ce2ee3d | grep ec219ccчудово працює
https://stackoverflow.com/a/13526591/895245 згадує про це, щоб зробити його більш людяним:
git-is-ancestor() (
if git merge-base --is-ancestor "$1" "$2"; then
echo 'ancestor'
elif git merge-base --is-ancestor "$2" "$1"; then
echo 'descendant'
else
echo 'unrelated'
fi
)
alias giia='git-is-ancestor'
git show-branch -sha1 commit-sha1
Де:
Якщо ви використовуєте git merge-base --is-ancestor , обов'язково використовуйте Git 2.28 (Q3 2020)
З Git 2.28 (Q3 2020) кілька полів у " struct commit", які не завжди повинні бути присутніми, були переміщені для здійснення плит.
Див. Зробити c752ad0 , здійснити c49c82a , зробити 4844812 , зробити 6da43d9 (17 червня 2020 р.) Від Абхішека Кумара ( abhishekkumar2718) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті d80bea4 , 06 липня 2020 р.)
commit-graph: представитиcommit_graph_data_slabПідписаний: Абхішек Кумар
Структурна комісія використовується в багатьох контекстах. Однак члени
generationіgraph_posвикористовуються лише для операцій, пов’язаних з графіками, а також інакше витрачають пам'ять.Ця трата була б більш вираженою, коли ми переходимо до генераційного числа v2, яке використовує 64-бітне генераційне число замість поточних 32-біт.
Оскільки до них часто звертаються разом, давайте введемо структуру
commit_graph_dataта перемістимо їх наcommit_graph_dataплиту.Хоча загальний тестовий набір працює так само швидко, як
master(серія: 26m48smaster,: 27m34s, швидше на 2,87%), деякі команди, якgit merge-base --is-ancestorбули уповільнені на 40%, як виявив Szeder Gábor .
Після мінімізації доступу до комутаційних плит уповільнення зберігається, але наближається до 20%.Деррік Столі вважає, що уповільнення пов'язане з алгоритмом, що лежить в основі, а не повільністю доступу до комутаційної панелі, і ми будемо слідувати в наступній серії.