Визуализация топологии ветки в git
Я играю с git изолированно на своей собственной машине, и мне трудно поддерживать ментальную модель всех моих ветвей и коммитов. Я знаю, что могу сделать git log
чтобы увидеть историю коммитов, откуда я, но есть ли способ увидеть всю топографию ветки, что-то вроде этих карт ascii, которые, кажется, используются повсеместно для объяснения ветвей?
.-A---M---N---O---P
/ / / / /
I B C D E
\ / / / /
`-------------'
Такое ощущение, что кто-то придет и попытается забрать мой репозиторий, будет трудно точно понять, что происходит.
Я думаю, что на меня влияет потоковый браузер AccuRev...
34 ответа
git log --graph
или же gitk
, (Оба также принимают --all
, который покажет все ветви, а не только текущую.)
Редактировать: для названий ветвей и компактного вида, попробуйте: git log --graph --decorate --oneline
2 ¢: у меня есть 3 псевдонима (и 4 псевдонима для быстрого использования), которые я обычно добавляю ~/.gitconfig
файл:
[alias]
lg = !"git lg1"
lg1 = !"git lg1-specific --all"
lg2 = !"git lg2-specific --all"
lg3 = !"git lg3-specific --all"
lg1-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'
lg2-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
lg3-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset) %C(bold cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)%n'' %C(white)%s%C(reset)%n'' %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)'
git lg
/ git lg1
выглядит так:
git lg2
выглядит так:
а также git lg3
выглядит так:
Примечание. Ответ скопирован и улучшен в ответе на /questions/38120306/simpatichnyie-grafyi-vetok/38120313#38120313, поскольку он гораздо более уместен здесь, чем был там. Оставьте копию по другому вопросу по историческим причинам - сейчас она закрыта, а на ответ ссылается куча других ответов.
Я обычно использую
git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"
С цветами (если ваша оболочка Bash):
git log --graph --full-history --all --color \
--pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"
Это напечатает текстовое представление следующим образом:
* 040cc7c (HEAD, master) Mannual is NOT built by default
* a29ceb7 Removed offensive binary file that was compiled on my machine and was hence incompatible with other machines.
| * 901c7dd (cvc3) cvc3 now configured before building
| * d9e8b5e More sane Yices SMT solver caller
| | * 5b98a10 (nullvars) All uninitialized variables get zero inits
| |/
| * 1cad874 CFLAGS for cvc3 to work succesfully
| * 1579581 Merge branch 'llvm-inv' into cvc3
| |\
| | * a9a246b nostaticalias option
| | * 73b91cc Comment about aliases.
| | * 001b20a Prints number of iteration and node.
| |/
|/|
| * 39d2638 Included header files to cvc3 sources
| * 266023b Added cvc3 to blast infrastructure.
| * ac9eb10 Initial sources of cvc3-1.5
|/
* d642f88 Option -aliasstat, by default stats are suppressed
(Вы могли бы просто использовать git log --format=oneline
, но он будет связывать сообщения коммитов с числами, что выглядит менее симпатично, ИМХО).
Чтобы сделать ярлык для этой команды, вы можете отредактировать ~/.gitconfig
файл:
[alias]
gr = log --graph --full-history --all --color --pretty=tformat:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m"
Однако, как Daniel Ralston в комментариях, такую длинную команду форматирования трудно запомнить. Обычно это не проблема, так как вы можете ~/.gitconfig
файл. Однако, если вам иногда приходится входить на удаленную машину, где вы не можете изменить файл конфигурации, вы можете использовать более простую, но более быструю версию:
git log --graph --oneline
К любому из этих рецептов (на основе git log или gitk) вы можете добавить --simplify-by-decoration
свернуть неинтересные линейные части истории. Это делает намного больше видимой топологии сразу. Теперь я могу понять большие истории, которые были бы непостижимы без этой опции!
Я чувствовал необходимость опубликовать это, потому что это не так хорошо известно, как должно быть. Его нет в большинстве вопросов о переполнении стека, связанных с визуализацией истории, и мне потребовалось немало поисков, чтобы найти - даже после того, как я понял, что хочу этого! Я наконец нашел это в отчете об ошибках Debian. Первое упоминание о переполнении стека, по-видимому, является ответом Антуана Пелисса.
Gitk
иногда мне больно читать.
Мотивировать меня, чтобы написать GitVersionTree.
"99,999% моего времени ищут истории git lg
и 0,001% на git log
"
Просто хочу поделиться 2 псевдонимами журнала, которые могут быть полезны. (настроить из.gitconfig)
[Alias]
lg = log --graph --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
hist = log --graph --full-history --all --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
git lg
увидим текущую ветку истории.git hist
увидим всю ветку истории.
Мне нравится, с git log
, сделать:
git log --graph --oneline --branches
(также с --all, для просмотра удаленных веток)
Работает с последними выпусками Git: выпущено с 1.6.3 ( четверг, 7 мая 2009 г.)
"
--pretty=<style>
msgstr "опция для семейства команд журнала теперь может быть записана как"--format=<style>
".
К тому же,--format=%formatstring
это сокращение для--pretty=tformat:%formatstring
,"
--oneline
"является синонимом для"--pretty=oneline --abbrev-commit
".
PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix
| | * 8183707 a first bug10 fix
| |/
| * e727105 a second evol for 2.0
| * 473d44e a main evol
|/
* b68c1f5 first evol, for making 1.0
Вы также можете ограничить интервал отображения журнала (количество коммитов):
PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all -5
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix
(показать только последние 5 коммитов)
Что мне не нравится в текущем выбранном решении:
git log --graph
Это отображало слишком много информации (когда я хочу только посмотреть на краткое резюме):
PS D:\git\tests\finalRepo> git log --graph
* commit 4919b681db93df82ead7ba6190eca6a49a9d82e7
| Author: VonC <vonc@laposte.net>
| Date: Sat Nov 14 13:42:20 2009 +0100
|
| a second bug10 fix
|
* commit 3469e13f8d0fadeac5fcb6f388aca69497fd08a9
| Author: VonC <vonc@laposte.net>
| Date: Sat Nov 14 13:41:50 2009 +0100
|
| a first bug10 fix
|
gitk
отлично, но вынуждает меня покинуть сессию оболочки для другого окна, тогда как отображение последних n коммитов достаточно часто.
Gitg - отличный инструмент для Linux, похожий на Gitx для OS X. Просто запустите 'gitg' в командной строке где-то внутри древовидной структуры вашего хранилища (то же самое с gitx).
Хороший веб-инструмент - неопрятный. Он работает на любой платформе, которую поддерживает node.js & git. Есть видео о том, как это работает для тех, кому такие вещи легче читать, чем читать...
Я нашел "git-big-picture" довольно полезным: https://github.com/esc/git-big-picture
Он создает симпатичные 2D-графики с использованием dot/graphviz вместо довольно линейных, "одномерных" представлений, которые создают gitk и друзья. С опцией -i он показывает точки ветвления и коммиты слияния, но пропускает все промежуточное.
Посмотрите на BranchMaster.
Я написал это, чтобы визуализировать сложную структуру веток, сворачивая все коммиты между ними в одну строку. Цифры указывают количество коммитов.
Я нашел это сообщение в блоге, которое показывает краткий путь:
git log --oneline --abbrev-commit --all --graph --decorate --color
Я обычно создаю псевдоним для вышеуказанной команды:
alias gg='git log --oneline --abbrev-commit --all --graph --decorate --color'
и просто просто использовать gg
,
Я использую редактор кода Visual Studio , и мне очень понравилось его расширение Git Graph , созданное mhutchie. (И я не одинок, у расширения 1 миллион пользователей!).
Если вам понравился редактор, просто перейдите на вкладку расширения (ячейки слева посередине), введите «Git Graph» и установите
Чтобы использовать его, перейдите на вкладку Git control и нажмите кнопку View Git Graph.
Никто не упомянул tig
? Это не сворачивает ветви как "BranchMaster", но...
Это быстро, работает в терминале.
Потому что это так быстро (+ управление с клавиатуры), вы получаете отличный UX, это почти как мой "ls
"для каталогов, содержащих git-репозитории.
У него есть обычные ярлыки, /
искать и т.д.
(ps. это терминал на фоне этого скриншота, в настоящее время он выглядит лучше, но мой компьютер отказывается делать скриншот, извините)
(pps. Я тоже использую gitkraken и у меня действительно четкие визуализации, но он намного тяжелее, чем tig
)
Для пользователей Mac: закажите (не каламбур) бесплатный инструмент с открытым исходным кодом GitUp: http://gitup.co/
Мне нравится способ отображения графиков, он понятнее, чем некоторые другие инструменты, которые я видел.
Проект находится здесь: https://github.com/git-up/GitUp
У Tortoise Git есть инструмент под названием "График ревизий". Если вы работаете в Windows, это так же просто, как щелкнуть правой кнопкой мыши по вашему репозиторию -> Tortoise Git -> Revision Graph.
Для тех, кто использует текстовый редактор VSCode, рассмотрим расширение Git History от D. Jayamanne:
Я использую следующие псевдонимы.
[alias]
lol = log --graph --decorate --pretty=oneline --abbrev-commit
lola = log --graph --decorate --pretty=oneline --abbrev-commit --all
Он содержит больше информации в цветовой схеме, чем псевдонимы, которые я видел выше. Это также кажется довольно распространенным явлением, поэтому у вас может быть шанс, что он будет существовать в окружении другого человека или упомянуть об этом в разговоре без объяснения причин.
Со скриншотами и полным описанием здесь: http://blog.kfish.org/2010/04/git-lola.html
У меня есть это git log
псевдоним в ~/.gitconfig
чтобы просмотреть историю графика:
[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'
С псевдонимом на месте, git l
покажет что-то вроде этого:
В Git 2.12 + вы даже можете настроить цвета линий графика, используя log.graphColors
Вариант конфигурации.
Что касается формата журналов, он похож на --oneline
, с добавлением имени автора (с уважением .mailmap
) и относительная дата автора. Обратите внимание, что %C(auto)
синтаксис, который говорит Git использовать цвета по умолчанию для хэша коммита и т. д., поддерживается в Git> = 1.8.3.
Еще одна команда git log. Этот с фиксированной шириной столбцов:
git log --graph --pretty=format:"%x09%h | %<(10,trunc)%cd |%<(25,trunc)%d | %s" --date=short
Gitx также фантастический инструмент визуализации, если вы оказались на OS X.
Мой личный любимый псевдоним через.gitconfig:
graph = log --graph --color --all --pretty=format:"%C(yellow)%H%C(green)%d%C(reset)%n%x20%cd%n%x20%cn%x20(%ce)%n%x20%s%n"
Старый пост, но проверить SmartGit
, Он очень напоминает визуализацию ветки Tortoise HG и бесплатен для некоммерческого использования.
Мне показалось невероятным, что среди многих ответов не упоминается Gitviz, доступный для Window / Linux / Mac.
Помимо предоставления двухмерного представления веток и фиксации, он прослушивает ваши команды git и сам изменяет график.
Я хочу поделиться своим
compact
предустановка для команды:
(зеленый - мой цвет консоли по умолчанию)
Он спроектирован так, чтобы быть максимально компактным и похожим на таблицу (без добавления лишних пробелов), но при этом информативным и легким для чтения. По сути, это компактная версия по умолчанию.
medium
формат.
Функции:
- Фиксированные позиции предметов;
- Цвета по умолчанию для хэша коммита и имен ссылок;
- Дата автора коммита находится в местном часовом поясе;
- Сообщение о фиксации заключено в 128 символов с отступом;
- Также отображается расширенное сообщение фиксации (если есть) с удаленными завершающими символами новой строки.
Вы можете добавить его в свой конфигурационный файл, используя следующие команды:
(обратите внимание, что они изменят формат даты для всех форматов!)
$ git config --global log.date 'format-local:%d %b %Y %H:%M'
$ git config --global pretty.compact '%C(auto)%h %C(cyan)%<(17,trunc)%an%C(auto) %D%n %C(cyan)%ad%C(auto) %w(128,0,26)%s%w(0,0,26)%+b%-(trailers:key=FAKE)'
... а затем использовать его так (с
--graph
,
--all
или любые другие варианты):
$ git log --graph --pretty=compact
Если вы также хотите установить его по умолчанию, вы можете сделать это с помощью этой команды:
$ git config --global format.pretty compact
Или, если вам нравятся псевдонимы:
$ git config --global alias.logc "log --date=format-local:'%d %b %Y %H:%M' --pretty='%C(auto)%h %C(cyan)%<(17,trunc)%an%C(auto) %D%n %C(cyan)%ad%C(auto) %w(128,0,26)%s%w(0,0,26)%+b%-(trailers:key=FAKE)'"
Если вы хотите внести какие - либо изменения, смотрите раздел PRETTY ФОРМАТОВ из
git log
Справка.
Встроенные инструменты Git (без надстроек) с форматированием даты и времени
Ни один из существующих ответов не показывает, как изменить формат даты и времени с помощью встроенного
git log
оснастка. Поскольку документация немного запутана с этой функцией, я добавил два псевдонима, которые я использую для этого в качестве примера.
git tree
- Журнал всех коммитов с отметками времени
# Tools for analyzing the merge history of a repo using tree-like graphics
[alias]
tree = log --no-show-signature --graph --date=format-local:%H:%M:%S --all \
--pretty="'%C(#ffe97b ul)%h%C(reset) %C(#568ea6)%cs %C(#305f72)%cd%C(reset)%C(auto)%d%C(reset) %s %C(yellow)(%C(reset)%C(#1abc9c)%an%C(reset)%C(yellow),%C(reset) %C(#007055)%cr%C(reset)%C(yellow))%C(reset)'"
git tree.branches
– Журнал всех веток/тегов с отметками времени
# Some refinements to normal 'git tree' output for alternative perspectives.
[alias "tree"]
branches = tree --simplify-by-decoration
Цветовой код
Самые популярные ответы, показывающие git log
команды как любимые решения.
Если вам нужен вывод в виде таблицы, скажем, столбца, вы можете использовать свои потрясающие команды журнала git с небольшими изменениями и некоторыми ограничениями с помощью фрагмента.gitconfig alias.tably ниже.
Модификации:
- ты должен использовать
%><(<N>[,ltrunc|mtrunc|trunc])
перед каждым заполнителем фиксации - добавить уникальный разделитель в качестве разделителя столбцов
- добавлять
--color
возможность цветного вывода
Ограничения:
- вы можете разместить график git в каждом столбце, если вы не используете непустые символы новой строки
%n...
- последний заполнитель фиксации любой новой строки может использоваться без
%><(<N>[,trunc])
если для украшения нужны дополнительные символы, например
(committer:
,<
а также>)
в...%C(dim white)(committer: %cn% <%ce>)%C(reset)...
чтобы получить табличный вывод, они должны быть написаны непосредственно до и после заполнителя фиксации
...%C(dim white)%<(25,trunc)(committer: %cn%<(25,trunc) <%ce>)%C(reset)...
если
--format=format:
вариант не последний закройте его%C(reset)
как обычнопо сравнению с обычным выводом журнала git, этот медленный, но приятный
Пример взят с этого сайта:
thompson1 = log --all --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'
будет с ^
как разделитель и без добавленных символов
thompson1-new = log --all --graph --color --abbrev-commit --decorate --format=format:'^%C(bold blue)%<(7,trunc)%h%C(reset)^%C(bold green)%<(21,trunc)%ar%C(reset)^%C(white)%<(40,trunc)%s%C(reset)^%C(dim white)%<(25,trunc)%an%C(reset)^%C(auto)%d%C(reset)'
который сравнивается как
или с перемещением графика в столбец 5
Для этого добавьте следующее в свой.gitconfig и вызовите псевдоним журнала с помощью
git tably YourLogAlias
[color "decorate"]
HEAD = bold blink italic 196
branch = 214
tag = bold 222
[alias]
# delimiter used as column seperator
delim = ^
# example thompson1
thompson1 = log --all --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'
# modified thompson1 example
thompson1-new = log --all --graph --color --abbrev-commit --decorate --format=format:'^%C(bold blue)%<(7,trunc)%h%C(reset)^%C(bold green)%<(21,trunc)%ar%C(reset)^%C(white)%<(40,trunc)%s%C(reset)^%C(dim white)%<(25,trunc)%an%C(reset)^%C(auto)%d%C(reset)'
# set a column for the graph
thompson1-new-col = 1
tably = !bash -c '" \
declare -A col_length; \
delim=$(git config alias.delim); \
git_log_cmd=$(git config alias.$1); \
git_tre_col=${2:-$(git config alias.$1-col)}; \
\
i=0; \
n=0; \
while IFS= read -r line; do \
((n++)); \
while read -d\"$delim\" -r col_info;do \
((i++)); \
[[ -z \"$col_info\" ]] && col_length[\"$n:$i\"]=${col_length[\"${last[$i]:-1}:$i\"]} && ((i--)) && continue; \
[[ $i -gt ${i_max:-0} ]] && i_max=$i; \
col_length[\"$n:$i\"]=$(grep -Eo \"\\([0-9]*,[lm]*trunc\\)\" <<< \"$col_info\" | grep -Eo \"[0-9]*\" | head -n 1); \
[[ -n \"${col_length[\"$n:$i\"]}\" ]] && last[$i]=$n; \
chars_extra=$(grep -Eo \"\\trunc\\).*\" <<< \"$col_info\"); \
chars_extra=${chars_extra#trunc)}; \
chars_begin=${chars_extra%%\\%*}; \
chars_extra=${chars_extra#*\\%}; \
case \" ad aD ae aE ai aI al aL an aN ar as at b B cd cD ce cE ci cI cl cL cn cN cr \
cs ct d D e f G? gd gD ge gE GF GG GK gn gN GP gs GS GT h H N p P s S t T \" in \
*\" ${chars_extra:0:2} \"*) \
chars_extra=${chars_extra:2}; \
chars_after=${chars_extra%%\\%*}; \
;; \
*\" ${chars_extra:0:1} \"*) \
chars_extra=${chars_extra:1}; \
chars_after=${chars_extra%%\\%*}; \
;; \
*) \
echo \"No Placeholder found. Probably no tablelike output.\"; \
continue; \
;; \
esac ; \
if [[ -n \"$chars_begin$chars_after\" ]];then \
len_extra=$(echo \"$chars_begin$chars_after\" | wc -m); \
col_length["$n:$i"]=$((${col_length["$n:$i"]}+$len_extra-1)); \
fi; \
\
done <<< \"${line#*=format:}$delim\"; \
i=1; \
done <<< \"$(echo -e \"${git_log_cmd//\\%n/\\\\n}\")\"; \
\
while IFS= read -r graph;do \
chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
[[ ${chars_count:-0} -gt ${col_length["1:1"]:-0} ]] && col_length["1:1"]=$chars_count; \
done < <([[ -n \"$(grep -F graph <<< \"$git_log_cmd\")\" ]] && git log --all --graph --pretty=format:\" \" && echo); \
\
l=0; \
while IFS= read -r line;do \
c=0; \
((l++)); \
[[ $l -gt $n ]] && l=1; \
while IFS= read -d\"$delim\" -r col_content;do \
((c++)); \
if [[ $c -eq 1 ]];then \
[[ -n \"$(grep -F \"*\" <<< \"$col_content\")\" ]] || l=2; \
chars=$(sed -nl1000 \"l\" <<< \"$col_content\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
whitespaces=$((${col_length["1:1"]}-$chars)); \
whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\"); \
col_content[1]=\"${col_content[1]}$col_content$whitespaces\n\"; \
else \
col_content[$c]=\"${col_content[$c]}$(printf \"%-${col_length[\"$l:$c\"]}s\" \"${col_content:-\"\"}\")\n\"; \
fi; \
done <<< \"$line$delim\"; \
for ((k=$c+1;k<=$i_max;k++));do \
empty_content=\"$(printf \"%-${col_length[\"$l:$k\"]:-${col_length[\"${last[$k]:-1}:$k\"]:-0}}s\" \"\")\"; \
col_content[$k]=\"${col_content[$k]}$empty_content\n\"; \
done; \
done < <(git $1 && echo); \
\
while read col_num;do \
if [[ -z \"$cont_all\" ]];then \
cont_all=${col_content[$col_num]}; \
else \
cont_all=$(paste -d\" \" <(echo -e \"$cont_all\") <(echo -e \"${col_content[$col_num]}\")); \
fi; \
done <<< $(seq 2 1 ${git_tre_col:-1};seq 1;seq $((${git_tre_col:-1}+1)) 1 $i_max); \
echo -e \"$cont_all\"; \
"' "git-tably"
Это более или менее только часть моего ответа /questions/38120306/simpatichnyie-grafyi-vetok/55111015#55111015, где вы можете найти более подробные объяснения, но здесь тоже хорошо подходит к этому вопросу.
Если есть проблемы с вашими командами git log, оставьте комментарий.
Мы можем сделать это более сложным?
Как насчет простого git log --all --decorate --oneline --graph (помните A Dog = --Все --Украсить --Oneine --Graph)