#git #github #version-control #merge #git-branch
#git #github #контроль версий #слияние #git-branch
Вопрос:
Как я могу найти первую ветку, на которой был сделан коммит? Кажется, это можно сделать, но я не уверен, как.
Похоже, что это невозможно в git из-за его дизайна, который помещает коммиты, а не ветви, в центр отслеживания изменений.
Я могу использовать следующее, которое показывает 1-ю ветку любые слияния, но не может сузить фокус только до 1-й ветки фиксации.
git branch --contains --merge <sha1>
возвращает список всех ветвей, с которыми был объединен коммит, и 1-ю ветвь, с которой он был объединен. —no-merged возвращает все последующие ветви, которые включают коммит, потому что они разветвлялись после точки слияния.
Таким образом, вы можете получить список каждого слияния, но не 1-й ветви, на которой оно было сделано, и любая ветвь, удаленная до выполнения команды, теряется (или вы просматриваете reflogs)
Результаты
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
Тестовый скрипт
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
Ответ №1:
Ответ просто невозможен.
Ветка — это просто заметка, которая была прикреплена к коммиту.
Вы можете в любое время отклеить публикацию и поместить ее в другое место или выбросить.
Таким образом, вы не можете сказать, в какую ветвь была введена первая фиксация.
Чтобы быть более правильным, пока
- ветка не удаляется и
- вы находитесь в системе / в репозитории, где был сделан коммит
- и фиксация произошла не ранее, чем время ожидания рефлога (по умолчанию 90 дней)
вы можете узнать, потому что тогда вы знаете, где находится ветка post-its where во время фиксации.
Комментарии:
1. Да, это то, что мне также показало мое тестирование. Спасибо за подтверждение. В принципе, это неуместный вопрос. Я только хотел это знать, потому что мне нужно повторно собрать все мои данные scm в jira с помощью плагина SCMActivity теперь, когда Atlassian решил не отображать данные ветки на экране коммитов. Не стоит перечислять каждую ветку слияния в данных, поскольку я думаю, что это действительно то, что мы хотим для отслеживания.
2. На самом деле, это намного хуже, чем я думал. скрипт работает только потому, что ЗАГОЛОВОК последующего не совпадает с фиксацией develop. Поскольку измененные ветви и ЗАГОЛОВОК каждого пользователя перестают указывать на тестовый коммит, они выпадают из списка при использовании —merged . Использование —merged также дает разный ответ в зависимости от ветки, из которой он запускается. Итак, я вообще не могу использовать «—merged». Все, что я могу сказать, это то, какие ветви содержат фиксацию, а не где было использовано слияние, чтобы добраться до указанной ветки.