Как я могу обнаружить, является ли GIT Commit - родитель других коммитов?

StackOverflow https://stackoverflow.com/questions/3435010

  •  26-09-2019
  •  | 
  •  

Вопрос

Я пишу скрипт, который делает некоторые тривиальные изменения, а затем совершает их в Git. Потому что это тривиальные изменения, я хочу сделать git commit --amend Всякий раз, когда я могу сойти с ним - в частности, когда поправка не «испортить» историю других ветвей. Если поправка испортит другую ветку, я хочу сделать стандарт git commit вместо.

Например, если мои филиалы выглядели так (A LA »визуализируют всю историю ветки« в GIT GUI):

* [experimental branch] Added feature.
* [master branch] Trivial change from script
* ...

И я бегаю этот скрипт на главной ветке, то я не хочу проводить поправки, потому что я заменяю часть истории экспериментальной филиалы. Технически, это на самом деле ничего не нарушит - первоначальный коммит все равно будет частью экспериментальной истории, и все равно будет ссылаться, поэтому она не будет сбора мусора - но почти но, а не совсем одинаково Две разные ветви затрудняют жизнь, когда я позже хочу освободить или объединиться, так что это ситуация, которую я хочу избежать.

Как я могу заставить свой сценарий автоматически определить, есть ли комбинентное от разветвленного от него?

Если упрощение предположений поможет, я всегда запускаю этот скрипт на главе Master, и я использую только Git в качестве локального репозитория - я не подталкиваю или нигде не вытащить.

Этот скрипт в Ruby, поэтому я могу либо оболочку в командной строке Git, или я могу использовать рубинные привязки для Git - в зависимости от того, что сделало эту задачу проще.

Это было полезно?

Решение

Просто беги git branch --contains HEAD Чтобы получить список филиалов, которые «содержат» этот коммит. Если список пуст, этот коммит должен быть в безопасности для боеприпасов. Вы также можете включить -a Флаг, чтобы переписать локальные и удаленные ветви.

В качестве альтернативы вы можете сравнить выход git rev-parse HEAD с участием git merge-base HEAD other-branch. Отказ Если эти идентификаторы фиксации идентичны, текущий коммит находится в истории фиксации других филиалов.

Другие советы

График фиксации - это одностороннее: с учетом коммита, вы знаете все его предки, но не каким-либо его детьми. Вам придется начать в конечных точках и обратно, пока не доберетесь до фиксации, которые вы хотите.

Использовать git rev-list [some commit] --children (Глава по умолчанию):

$ git rev-list HEAD --children
6edbee61c87fb063700751815f0ad53907d0b7a4
aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4
ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017
[...]

Левый столбец представляет собой список фиксации SHA-1S в обратном хронологическом порядке. Что-нибудь до этого права фиксации - дети (--children) этого фиксации. Верхний коммит - это голова, и поэтому не имеет детей.

Таким образом, если вы GREP для вашей SHA-1 в этом списке, и он имеет что-то справа, у него есть хотя бы один ребенок:

$ git rev-list --children | grep '^6910'
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349

В приведенном выше примере совершается 6910... У ребенка, ef8a....

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top