В следующем примере дерева:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
Ищу F - первый коммит в ветке xxx. Я думаю, что это возможно с:
git log xxx --not master
и последний коммит в списке должен быть F. Это правильное решение или, может быть, у него есть некоторые недостатки?
Я знаю, что были похожие вопросы по stackoverflow, но никто не предлагал такого решения, и я не уверен, правильно ли я его делаю.
Ответы:
Где «ветка» - это ваше конкретное имя ветки. Точка-точка дает вам все коммиты, которые есть у ветки, которых нет у мастера.
tail -1
возвращает последнюю строку из предыдущего вывода.источник
master
, и, пока ваша ветка не была удалена,git log <sha>..branch --oneline | tail -1
все равно должен давать вам результаты, которые вы ищете.--reverse
для чтения журналов в обратном порядке с помощью цветов и т. Д.Вы должны использовать
merge-base
функциональность, которая предназначена именно для этого:источник
источник
Если ваша ветка (старая) снова слита с master, не дает ожидаемого результата, я использую скрипт python, чтобы найти идентификатор фиксации начальной ветки.
git rev-list - набор изменений первого родителя
--first-parent следовать только за первым родительским коммитом, увидев коммит слияния.
Повторяйте набор изменений из приведенной выше команды, пока не найдете родительскую ветвь.
источник
однако это даст вам только первую фиксацию в ветке xxx, которая не находится в master, но не первую фиксацию в ветке xxx. последнее будет затруднительно, если ветка xxx была удалена и / или воссоздана один или несколько раз. в этом случае вы можете попробовать следующее:
источник
head -n 1
вместоtail -1
?tail -1
возвращает самую последнюю фиксацию вместо первой.Я попробовал эту команду, и она сработала:
источник
git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
источник