Есть ли способ реализовать функцию Graph by Branch через git log? - PullRequest
2 голосов
/ 03 июня 2019

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

$ git log --graph --all --topo-order --decorate --oneline --boundary \
    --force-branch-columns=master,dev
    * f745bf5 (HEAD, newbranch) Merge branch 'master' into newbranch
   /|                                                               
  / * 7031537 commit                                                
 /  * 416ab2c commit                                                
| * | a9f8d93 (dev) Merge branch 'master' into dev                  
|/| |                                                               
* | | 5f32650 (master) commit                                       
| * | b511501 Merge branch 'master' into dev                        
|/| |                                                               
* | | 4e6810e commit                                                
| * | 2cd55b4 Merge branch 'master' into dev                        
|/|/                                                                
| /                                                                 
|/|                                                                 
* | 4f74695 commit                                                  
| * 372799e Merge branch 'master' into dev                          
|/|                                                                 
* | 076669f commit                                                  
 \|                                                                 
  * 7382440 initial empty commit                                    

Здесь я нашел некоторые результаты, но не нашел способа реализовать какие-либо: https://gist.github.com/michaelhood/5075495

$ git log --graph --all --topo-order --decorate --oneline --boundary \
    --force-branch-columns=master,dev

Ответы [ 2 ]

3 голосов
/ 03 июня 2019

Нет, но также стоит отметить, что такая функция вводит в заблуждение.

Тот факт, что коммит 4e6810e, например, находится в ветви master, не меняет того факта, что коммит 4e6810e находится в ветви newbranch. Многие коммиты находятся на разных ветках одновременно. Набор ветвей, которые содержат один коммит C , со временем изменяется по мере создания и уничтожения имен ветвей.

График остается постоянным во всем. Это просто метки - имена ветвей - которые меняются. 1 Оператор commit C находится на ветви B просто означает, что начиная с фиксации, идентифицируемой по имени B и, работая в обратном направлении по всем путям в истории, сформированной графом коммитов, Git может достигать коммит C .

У Git есть идея работать в обратном направлении по графику, но следуя только первому родителю при каждом слиянии. То есть, учитывая график как:

...--o--o--o--o---o--o   <-- name1
      \          /
       o--o--o--o   <-- name2

Git может начинаться с коммита наконечника, обозначенного name1, и проходить назад через оба ряда коммитов, или начинаться с коммита наконечника, обозначенного name1, и идти назад только вдоль верхнего ряда (при условии, что первый родитель слияния находится вдоль верхнего ряда). Чтобы достичь этого, git log и git rev-list - две основные команды перемещения по графу - имеют опцию --first-parent.


1 Например, после удаления имени master, фиксация 4e6810e больше не будет на master (который больше не существует).

1 голос
/ 03 июня 2019

Вы можете приблизиться, например,

git show-branch master dev newbranch

, который выделяет столбец для ветви.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...