Почему изменяет новую ветку в отдельном состоянии головы всех родительских ссылок? - PullRequest
0 голосов
/ 12 июля 2020

Если я сравниваю git / refs при создании новой ветки из последней фиксации ветки по сравнению с созданием из отдельного состояния головы, git / refs показывает другое поведение (имена), и мне нравится понимать почему.

Предположим, голова находится на главном.

enter image description here

I need a new dev branch. After that, I made some commits to the new branch and some fixes on master.

enter image description here

Now I see another way how to solve the dev branch and I made a second new branch and some commits on that and on master again some fixes.

введите описание изображения здесь

Но теперь рефери выглядят иначе! Пока я не объединяю плюс удаляю или удаляю только вторую ветвь, первые две ссылки вызываются после этой второй ветки.

Почему это хорошее поведение, потому что я не могу легко понять, что первые ссылки обычно принадлежат хозяину? Только хеши и родительские хеши помогают в идентификации, но это медленный метод. THX.

EDIT: Информация, показанная здесь, предоставляется командой git log.

1 Ответ

0 голосов
/ 13 июля 2020

В отличие от других систем контроля версий, с которыми вы, возможно, знакомы, коммиты не относятся ни к какой ветви. Вместо этого ветка - это просто метка, указывающая на фиксацию. Нет однозначного ответа на вопрос, «к какой ветви принадлежит коммит» или «в какой ветке был написан коммит». Вместо этого вы можете только сказать, какие коммиты доступны ветке. И это именно то, что делает %S. Он работает так же, как --source.

   --source
       Print out the ref name given on the command line by which each commit was
       reached.

В вашем случае первые два коммита 052b272 и adbf0ae доступны по нескольким веткам. В вашем первом примере мастер. По вашему второму мастеру и В-1. А в третьем - от мастера, B-1 и B-2.

git log --all работает путем обхода графика фиксации, начиная с каждой ссылки. Если он может достичь фиксации по нескольким ссылкам, он выбирает ту ссылку, с которой он начинал, когда печатает строку журнала. В вашем втором протоколе можно было легко сказать, что они пришли от B-1 или мастера. Если вы сделаете еще одну фиксацию, она может измениться.

Если вы запустите git log без --all, он будет говорить HEAD для всех коммитов, потому что без --all он работает в обратном направлении только с HEAD , текущая фиксация.

...