Найдите, какая ветка используется для создания текущей ветки в 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()
, который занимал максимальный размер буфера.