2016-10-26 2 views
4

Да, это похоже очень похоже на «Find the parent branch of a git branch», но я не нашел там своего ответа.Как определить родительский филиал для rebase

I думаю Я хочу знать, как найти мои текущие ветви, но я мог бы задать неправильный вопрос. Поэтому я предоставлю свой сценарий.

  1. Наша организация имеет несколько релизов филиалов давно работает, не переименовываются (но в конечном счете, являются устаревшими после выпуска)

  2. Иногда я создаю ветвь функции от одной из ветвей выпуска для работы на проблема. Это локальная ветвь функций.

  3. я получаю отозван работать на какой-то другой предмет, какой-то другой релиз, и т.д.

  4. Я вернусь к этой функции, и теперь я хочу, чтобы перебазировать его последнего коммита, на котором он был изначально разветвленной из. Но прошло достаточно времени, что я не могу вспомнить, было ли это разветвлено с освобождением x или освободить y

Как мне это сделать? На мой взгляд, мне показалось, что я просто выясню, к какой ветви релиза я создал свою функцию, а затем переформатировал ее до последней фиксации на этой ветке.

Я знаю, что есть другие организационные методы, которые можно сделать, чтобы избежать этой проблемы, например, всегда включать имя базовой ветви в моей ветви функции. Но этот корабль отплыл.

Есть git Решение проблемы, которую у меня есть?

+0

Чтобы уточнить, вы пытаетесь отойти вдоль ветки функций, пока не найдете фиксацию, которая также относится к ветви релиза? И вы хотите узнать название этой ветки релиза? –

+0

[Этот ответ] (http://stackoverflow.com/a/17843908/2988730) для вопроса, который вы указали, делает именно то, что вы хотите. Фактически, комментарии \ @driodbot и \ @ gaal ниже вопроса могут обеспечить более чистое решение. –

+0

И да, принятый ответ для этого определенно не оптимален. –

ответ

2

Я думаю, что ответ можно найти в the question you cited, но не обязательно в принятом ответе.

  1. Первый вариант решения - this answer. Лучший ответ, чем тот, публикуемый содержатся в комментариях, так как решения в комментариях использовать только стандартные команды UNIX:

    git show-branch | sed "s/].*//" | grep "\*" | \ 
        grep -v "$(git rev-parse --abbrev-ref HEAD)" | \ 
        head -n1 | sed "s/^.*\[//" 
    

    Этого решение было разработано @droidbot усовершенствованного путем @gaal.

  2. Второе решение в this answer по @ladiko, первоначально разработанный в @mark-reed's answer:

    git show-branch -a | awk -F'[]^~[]' '/^\*/ && !/'"$(git rev-parse --abbrev-ref HEAD)"'/ {print $2;exit}' 
    

Оба эти решения даст вам имя другой ветви, содержащий последний коммит на вашем тока который принадлежит ветке, отличной от вашей текущей.

+0

Я пробовал, и они не работают. Первый не дает ответа. Пустая строка для одной из моих ветвей. Но я думаю, что ошибки, вызванные вторым, помогли объяснить, почему. Одна из этих ветвей была настолько старой, что филиал базовой версии устарел. Я проверяю другие варианты. –

+0

Я не уверен, что вы подразумеваете под устаревшим. –

+0

Пробовал обе эти команды, и я получаю несколько строк вроде: 'warning: ignoring master; не может обрабатывать более 25 refs' – onlynone

3

Это должно сделать это для вас:

git log --oneline \ 
    | cut -f 1 -d' ' \ 
    | (while read commit ; do 
     other_branches="$(git branch --contains $commit | egrep -v '^\* ')" 
     if [ -n "${other_branches}" ] ; then 
     echo -e "${commit} is in:\n${other_branches}" 
     break 
     fi 
    done) 

Это будет проходить в журнале фиксаций этой ветви и для каждого коммита, проверить которые содержат ветви (потомки), совершающие. Как только он обнаруживает коммит, у которого есть потомок, который не является текущей ветвью, он печатает хеш фиксации, другие ветви, которые содержат эту фиксацию, и вырывается из цикла.

+0

Это немного медленно для больших деревьев с большим количеством слияния, потому что они будут попеременно перемещать большие куски дерева для каждой фиксации. (по-прежнему +1 для концепции звука) –

+0

@MadPhysicist У нас огромная история с большим количеством слияний (не уверен в «скрещивании слияния»), и это было довольно быстро для меня. – onlynone

Смежные вопросы