Найти первую ветку, на которой был выполнен коммит git

#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». Все, что я могу сказать, это то, какие ветви содержат фиксацию, а не где было использовано слияние, чтобы добраться до указанной ветки.