Показать исходную ветку для фиксации
Я использовал git -blame для поиска определенного коммита. Теперь я хочу найти ветку, из которой она изначально пришла. (Оттуда я буду использовать название ветки, чтобы найти конкретный билет)
Определите "исходную ветвь" как "ветвь, к которой была выполнена фиксация до того, как ветвь была объединена в любую другую ветвь".
Ответы
Ответ 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