Как получить информацию о том, где начинается филиал? - PullRequest
6 голосов
/ 18 декабря 2010

Насколько я знаю, объект commit содержит информацию только о родителях, поэтому, если у меня возникнет ситуация, примерно такая:

 *  branch-1
 |
 o
 |
 o  master
 |
 o 

что является неким эквивалентом

   *  branch-1
   |
   o
  /
 o  master
 |
 o 

а что если мой хозяин пойдет вперёд?

 o master
 |
 o *  branch-1
 | |
 o o
 |/
 o
 |
 o 

находясь на ветке-1, git log --graph --decorate покажет мне только:

 *  branch-1
 |
 o
 |
 o
 |
 o 

если я знаю, из какой ветви я был запущен, я могу позвонить git merge-base master branch-1, но что, если я не знаю, из какой ветви я был запущен?


PS. Я все еще учу английский, но иногда я делаю глупые ошибки. Я делаю все возможное, пишу вопросы и ответы на английском языке, однако я был бы очень рад, если вы отредактируете мой пост в случае каких-либо ошибок. Обещаю, ваши усилия не пропадут даром.

Ответы [ 3 ]

11 голосов
/ 19 декабря 2010

Это правда, что git не хранит эту информацию постоянно, но в любом случае вы можете узнать это.Git имеет reflogs!

git reflog show <branch>

Если ветвь была создана за последние 90 дней (по умолчанию; используйте gc.reflogExpire, чтобы изменить это), последней строкой в ​​этом reflog будет создание ветки.

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

Мораль этой истории в том, что вы должны принять рабочий процесс, в котором вы знаете, из какой ветви вы разветвляли свою ветку.Новые функции и исправления предположительно начнутся в какой-то стабильной точке вашей основной ветви, а подтемы могут быть названы <topic>-<subtopic> в качестве напоминания.

Редактировать:

Хорошо, так что давайте представим, что вы знаетефиксация и время (в этом случае фиксация и время создания ветки).Вы пытаетесь выяснить, на какой ветви был этот коммит в тот момент.

git for-each-ref --format='%(refname)' refs/heads/* | while read b; do
    if [ "$(git rev-parse $b@{$date_time})" = "$target_commit" ]; then
        echo "branch $b contained commit $target_commit at $date_time"
    fi
done

Я думаю, это должно работать как скрипт bash / однострочный.Идея: для каждой ветви занять свою позицию в заданную дату и время и посмотреть, является ли это целевым коммитом.Если вы хотите быть еще более гибким, вы можете проверить, является ли $(git merge-base $(git-rev-parse $b@{$date_time})) целевым коммитом;то есть, был ли целевой коммит предком данной ветви в то время.

И, конечно, в тех случаях, когда ваша история относительно чиста, вы всегда можете использовать gitk --branchesили git log --graph --branches [--oneline], чтобы просто увидеть красивую картинку.

1 голос
/ 14 октября 2014

Я думаю, вы ищете

git log --graph --oneline --all

Проверьте эту ветку для более подробного объяснения. Stackoverflow ответ

1 голос
/ 18 декабря 2010

Git на самом деле не имеет концепции этого, если вы хотите добавить это, вам нужно добавить эвристику, потому что все, что действительно волнует git - это прикрепление метки к данному коммиту в дереве. *

...