Подтвердить что ты не робот

Показать исходную ветку для фиксации

Я использовал git -blame для поиска определенного коммита. Теперь я хочу найти ветку, из которой она изначально пришла. (Оттуда я буду использовать название ветки, чтобы найти конкретный билет)

Определите "исходную ветвь" как "ветвь, к которой была выполнена фиксация до того, как ветвь была объединена в любую другую ветвь".

4b9b3361

Ответ 1

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

Но если предположить, что искомая ветвь - это то, что вы можете видеть, и, конечно же, у вас есть хеш фиксации, скажем d590f2..., частичный ответ заключается в том, что вы можете сделать:

$ git branch --contains d590f2
  tests
* master

Затем, чтобы подтвердить, что у вас есть виновник:

$ git rev-list tests | grep d590f2

Конечно, если d590f2 было объединено более чем в одну ветку, вы должны быть более тонким, чем это.

Ответ 2

Это не применимо в git. Филиалы являются локальными понятиями для каждого репозитория: одна ветвь "локальный материал" может быть совершенно отделена от ветки "локальный материал" другого человека. Если вы делаете что-то вроде просмотра своей основной ветки интеграции и вашего запроса, и удаляете все базы слияния между ними, вы должны иметь возможность получить поддерево истории фиксации, которое может пролить некоторое освещение... или не может, например если вы проследите ссылку от фиксации запроса к "хозяину", вы должны надеяться найти коммиты слияния с полезными комментариями, говорящими о том, откуда произошло слияние... но эта информация просто информационная, а не записанная каким-то образом предназначена для автоматического получения.

например. gitk some-commit...master (что почти кратно для gitk some-commit master --not $(git merge-base some-commit master))

Ответ 3

A Git ветвь - это не что иное, как "именованный указатель на фиксацию" (это принципиальная концепция, отличная от другой известной VCS).

Эта ситуация ясна, фиксация A находится на branch-1, commit B на branch-2:

  o A [branch-1]
  |
o | B [branch-2]
| |

После слияния становится неясным, был ли A (или B) первоначально включенным branch-1 или branch-2:

o [branch-1] [branch-2]
|
o merged 
|\
| o A
| |
o | B
| |

Возможно, вы можете догадаться, на что Git отделить фиксацию A, если вы отметили родительские фиксации A, например. release-1, и вы знаете, что этот тег был указан только для коммитов в branch-1.

o [branch-1] [branch-2]
|
o merged 
|\
| o A
| |
o | B
| |
| o <release-1]
| |

Ответ 4

Попробую, пожалуйста, прокомментируйте, так как не совсем уверен, но я считаю, что это делает работу.

Следующие действия будут работать только в том случае, если ветки все еще указывают на вершину до того, как будут объединены в master, что имеет место, если ветки находились в одном и том же репо:

o [master]
|
o merged branch "great-feature" into master
|\
| o A [great-feature]
| |
o | B
| |

Если это не так (например, если вы вытащили из другого репо), вы все равно можете воссоздать их вручную.

Сначала получите ветки, в которых ваша фиксация:

$ git branch -a --contains=<sha-of-B>
*master
great-feature

то для каждой ветки получим количество коммитов, которые отделяют голову от фиксации: это количество строк, которые выводят журнал git для указанного диапазона:

$ git log --pretty=oneline <sha-of-B>..great-feature | wc -l
1
$ git log --pretty=oneline <sha-of-B>..master | wc -l
4

Итак, B близок к отличной функции, что означает, что он был создан в нем.

Это может быть сделано в приятный script, не стесняйтесь добавить его в ответ (я не очень хорош в этом)

Ответ 5

Сначала убедитесь, что вы извлекли изменения из пультов

$ git fetch --all

и

$ git branch -a --contains d590f2

Без параметра -a вы не можете найти коммиты, существующие только на удаленных ветвях

Ответ 6

Я нашел более простой способ сделать это: он в сообщении последнего коммита git log <sha>..HEAD --merges!

Эта команда показывает слияния, которые произошли между мастером и фиксацией; последний результат фиксации этой командой - это первое комманда слияния, в которое она была включена. Он обычно содержит имя ветки, поэтому даже если ветвь удалена, вы можете найти ее имя.

Чтобы получить только название ветки, введите git log <sha>..HEAD --merges --oneline |tail -1

Ответ 7

Кажется, что это не вопрос, на который можно ответить с точностью 100% через git.

git branch --contains --merge <sha1>

возвращает список всех ветвей, к которым слиял коммит, и исходной ветки. - без объединения возвращает все последующие ветки, которые включают фиксацию, потому что они разветвляются после точки слияния.

Итак, вы можете получить список каждого слияния, но не оригинальной ветки, и любая ветвь, удаленная до выполнения команды, будет потеряна (или ваш поиск в логах)

Результаты

git branch --contains <sha1 for "added feature/inital 1">
* develop
  feature/inital
  feature/subsequent1

git branch --contains <sha1 for "added feature/inital 1"> --merged
* develop
  feature/inital

git branch --contains <sha1 for "added feature/inital 1"> --no-merged
  feature/inital

Тест Script

function mkbranch {
  git checkout -b $1
  git push --set-upstream origin $1
}

# Develop
mkbranch develop
for f in 1 2 3; do date > file${f}.txt;  git add file${f}.txt; git commit -m "added develop $f"; done
git push

# Initial Feature Branch
mkbranch feature/inital
for f in 1 3; do date > file${f}.txt;  git add file${f}.txt; git commit -m "modified feature/inital $f"; done
git push

# Merge
git checkout -b develop
git merge feature/inital
git push


# Next Feature Branch
mkbranch feature/subsequent1
for f in 1 3; do date > file${f}.txt;  git add file${f}.txt; git commit -m "modified feature/subsequent1 $f"; done
git push

Ответ 8

Когда вы на ветке, была объединена "оригинальная ветка". Вы можете запустить:

git log <SHA>..HEAD --ancestry-path --merges

Эта команда покажет, что все merge совершают транзакции между <SHA>..HEAD. Вам нужен последний.

Например, для c0118fa commit (последний, кроме одного) "исходная ветвь" имеет значение redesign_interactions

* ccfd449 (HEAD -> develop) Require to return undef if no digits found
*   93dd5ff Merge pull request #4 from KES777/clean_api
|\  
| * 39d82d1 Fix tc0118faests for debugging debugger internals
| * ed67179 Move &push_frame out of core
| * 2fd84b5 Do not lose info about call point
| * 3ab09a2 Improve debugger output: Show info about emitted events
| *   a435005 Merge branch 'redesign_interactions' into clean_api
| |\  
| | * a06cc29 Code comments
| | * d5d6266 Remove copy/paste code
| | * c0118fa Allow command to choose how continue interaction
| | * 19cb534 Emit &interact event

Вы должны запустить:

git log c0118fa..HEAD --ancestry-path --merges

И прокрутите страницу вниз, чтобы найти последнюю фиксацию. Что есть:

commit a435005445a6752dfe788b8d994e155b3cd9778f
Merge: 0953cac a06cc29
Author: Eugen Konkov
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'redesign_interactions' into clean_api

Ответ 9

Это работало достаточно хорошо для меня, чтобы получить название ветки из отдельной главы в рабочем пространстве Дженкинса:

git show -s --pretty=%d