Найдите, какая ветка используется для создания текущей ветки в Git?

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

Как узнать, какая ветка была корнем новой ветки, созданной другим человеком? Новые ветки могут создаваться на основе текущего HEAD, но можно также указать <start-point>, который может быть фиксацией, тегом или веткой. Как узнать, какая ветка используется для создания новой ветки?

Бонусный вопрос: фиксации могут быть сдвинуты вместе с созданием ветки. Я хотел бы зарегистрировать те коммиты, относящиеся к новой ветке, используя крюк post post на сервере. Крючок передается с (oldrev, newrev, refname), было бы хорошо, если бы я смог узнать ответ на мой вопрос выше.

Ответ 1

Если все ветки созданы из мастера, вы можете:

git merge-base master ${branch_in_question}

Это работает только в том случае, если с момента создания ветки не происходит никаких слияний. По большей части это не очень простой вопрос для ответа в git. В отличие от svn log --stop-on-copy. Не то, что я говорю, что мне нравится подрывная деятельность.

Ответ 2

Существует несколько способов найти общую предковую фиксацию для группы ветвей. Есть несколько ответов в вопросе Длина ветки: где начинается ветка в Git?.

Один из ответов (это один из моих) заключается в использовании команды show-branch, передающей в качестве аргументов список ветвей, которые вы хотите сравнить, и найти общий предок совершает. Вот пример из документации ядра Linux Git для show-branch

$ git show-branch master fixes mhf
* [master] Add 'git show-branch'.
 ! [fixes] Introduce "reset type" flag to "git reset"
  ! [mhf] Allow "+remote:local" refspec to cause --force when fetching.
---
  + [mhf] Allow "+remote:local" refspec to cause --force when fetching.
  + [mhf~1] Use git-octopus when pulling more than one heads.
 +  [fixes] Introduce "reset type" flag to "git reset"
  + [mhf~2] "git fetch --force".
  + [mhf~3] Use .git/remote/origin, not .git/branches/origin.
  + [mhf~4] Make "git pull" and "git fetch" default to origin
  + [mhf~5] Infamous 'octopus merge'
  + [mhf~6] Retire git-parse-remote.
  + [mhf~7] Multi-head fetch.
  + [mhf~8] Start adding the $GIT_DIR/remotes/ support.
*++ [master] Add 'git show-branch'.

В этом примере master сравнивается с ветвями fixes и mhf. Подумайте об этом выводе в виде таблицы, при этом каждая ветка получит свой собственный столбец, и каждый из них получит свою собственную строку. Филиалы, содержащие фиксацию, будут иметь + или - в своем столбце в строке для этой фиксации.

В самом низу выхода вы увидите, что все 3 ветки совместно используют комманду общего предка и что на самом деле это head commit master:

*++ [master] Add 'git show-branch'.

Это означает, что оба fixes и mhf были разветвлены с этим фиксатором в master.

Ответ 3

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

В то время как git show-branch может оказаться полезным, он может выйти из строя для Git 2.12 или меньше. < ш > Предстоящий Git 2.13 (Q2 2017) увеличит устойчивость wow > w20 > show-branch.

См. commit d3cc5f4 (15 февраля 2017 г.) и commit d9e557a, совершить e6a7c75 (14 февраля 2017 г.) Джефф Кинг (peff).
Помощник: Pranit Bauva (pranitbauva1997).
(Слияние Юнио С Хамано - gitster - в commit 74a7727, 27 февраля 2017 г.

"git show-branch" ожидалось, что были только очень короткие названия ветвей в хранилище и использовал буфер фиксированной длины для их хранения без проверки переполнения.

show-branch: сохранить разрешенную головку в буфере кучи

Мы разрешаем HEAD и копируем результат в буфер фиксированного размера с memcpy, никогда не проверяя, что он действительно подходит.
Эта ошибка восходит к 8098a17 (Добавить git -symbolic-ref, 2005-09-30, Git 0.99.8a).
До этого мы использовали readlink(), который занимал максимальный размер буфера.